path: root/zbd.c
diff options
authorDmitry Fomichev <>2021-01-27 13:19:29 +0900
committerJens Axboe <>2021-01-29 08:14:00 -0700
commit1c74aadc9513dccd83272fb21a80b3b62b6e53a2 (patch)
tree9f0ba29a9ab474d09c5df838cfd3cf5a63bee39d /zbd.c
parent1a8d510a69ea95b8bdc4c05f49f257b7cafddd02 (diff)
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 <> Reviewed-by: Shin'ichiro Kawasaki <> Signed-off-by: Jens Axboe <>
Diffstat (limited to 'zbd.c')
1 files changed, 18 insertions, 7 deletions
diff --git a/zbd.c b/zbd.c
index 8583f2ac..8e9fc7d4 100644
--- a/zbd.c
+++ b/zbd.c
@@ -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;
- 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)) {
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,
@@ -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;
/* fall-through */