diff options
author | Dmitry Fomichev <dmitry.fomichev@wdc.com> | 2021-01-27 13:19:29 +0900 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-01-29 08:14:00 -0700 |
commit | 1c74aadc9513dccd83272fb21a80b3b62b6e53a2 (patch) | |
tree | 9f0ba29a9ab474d09c5df838cfd3cf5a63bee39d /zbd.c | |
parent | 1a8d510a69ea95b8bdc4c05f49f257b7cafddd02 (diff) | |
download | fio-1c74aadc9513dccd83272fb21a80b3b62b6e53a2.tar.gz fio-1c74aadc9513dccd83272fb21a80b3b62b6e53a2.tar.bz2 |
zbd: set thread errors in zbd_adjust_block()
Several error conditions that are encountered during zone processing
in zbd_adjust_block() function cause it to return io_u_eof value.
This stops the i/o to the given file, but there is no error raised or
reported if this code is returned. For a few particular conditions,
just stopping the i/o is reasonable, but others are serious errors
that should be reported.
Add td_verror() calls to raise thread errors for a few abnormal
conditions during adjusting the i/o. The only test that needs to be
modified because of this changes is test #2.
Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Reviewed-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'zbd.c')
-rw-r--r-- | zbd.c | 25 |
1 files changed, 18 insertions, 7 deletions
@@ -1688,13 +1688,22 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u) assert(io_u->offset + io_u->buflen <= zb->wp); goto accept; case DDIR_WRITE: - if (io_u->buflen > f->zbd_info->zone_size) + if (io_u->buflen > f->zbd_info->zone_size) { + td_verror(td, EINVAL, "I/O buflen exceeds zone size"); + dprint(FD_IO, + "%s: I/O buflen %llu exceeds zone size %lu\n", + f->file_name, io_u->buflen, + f->zbd_info->zone_size); goto eof; + } if (!zbd_open_zone(td, f, zone_idx_b)) { zone_unlock(zb); zb = zbd_convert_to_open_zone(td, io_u); - if (!zb) + if (!zb) { + dprint(FD_IO, "%s: can't convert to open zone", + f->file_name); goto eof; + } zone_idx_b = zbd_zone_nr(f, zb); } /* Check whether the zone reset threshold has been exceeded */ @@ -1721,6 +1730,7 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u) goto eof; if (zb->capacity < min_bs) { + td_verror(td, EINVAL, "ZCAP is less min_bs"); log_err("zone capacity %llu smaller than minimum block size %d\n", (unsigned long long)zb->capacity, min_bs); @@ -1731,8 +1741,9 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u) assert(!zbd_zone_full(f, zb, min_bs)); io_u->offset = zb->wp; if (!is_valid_offset(f, io_u->offset)) { - dprint(FD_ZBD, "Dropped request with offset %llu\n", - io_u->offset); + td_verror(td, EINVAL, "invalid WP value"); + dprint(FD_ZBD, "%s: dropped request with offset %llu\n", + f->file_name, io_u->offset); goto eof; } /* @@ -1751,9 +1762,9 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u) orig_len, io_u->buflen); goto accept; } - log_err("Zone remainder %lld smaller than minimum block size %d\n", - (zbd_zone_capacity_end(zb) - io_u->offset), - min_bs); + td_verror(td, EIO, "zone remainder too small"); + log_err("zone remainder %lld smaller than min block size %d\n", + (zbd_zone_capacity_end(zb) - io_u->offset), min_bs); goto eof; case DDIR_TRIM: /* fall-through */ |