zbd: Cleanup zbd_init()
authorDamien Le Moal <damien.lemoal@wdc.com>
Thu, 29 Aug 2019 07:21:30 +0000 (16:21 +0900)
committerJens Axboe <axboe@kernel.dk>
Thu, 29 Aug 2019 12:30:49 +0000 (06:30 -0600)
For a job using a zoned device, the zonesize option must always specify
the device zone size. That is checked in the function parse_zone_info().
The zonesize checks in zbd_init() apply only to jobs running with
zonemode=zbd on a regular block device. So move these checks into
init_zone_info() which is used to emulate zone information for regular
block devices.

Fix t/zbd test #43 accordingly.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
t/zbd/test-zbd-support
zbd.c

index ed54a0a..6eecce9 100755 (executable)
@@ -707,8 +707,9 @@ test42() {
        grep -q 'Specifying the zone size is mandatory for regular block devices with --zonemode=zbd'
 }
 
-# Check whether fio handles --zonesize=1 correctly.
+# Check whether fio handles --zonesize=1 correctly for regular block devices.
 test43() {
+    [ -n "$is_zbd" ] && return 0
     read_one_block --zonemode=zbd --zonesize=1 |
        grep -q 'zone size must be at least 512 bytes for --zonemode=zbd'
 }
diff --git a/zbd.c b/zbd.c
index 2383c57..09ddcca 100644 (file)
--- a/zbd.c
+++ b/zbd.c
@@ -312,13 +312,23 @@ static int init_zone_info(struct thread_data *td, struct fio_file *f)
 {
        uint32_t nr_zones;
        struct fio_zone_info *p;
-       uint64_t zone_size;
+       uint64_t zone_size = td->o.zone_size;
        struct zoned_block_device_info *zbd_info = NULL;
        pthread_mutexattr_t attr;
        int i;
 
-       zone_size = td->o.zone_size;
-       assert(zone_size);
+       if (zone_size == 0) {
+               log_err("%s: Specifying the zone size is mandatory for regular block devices with --zonemode=zbd\n\n",
+                       f->file_name);
+               return 1;
+       }
+
+       if (zone_size < 512) {
+               log_err("%s: zone size must be at least 512 bytes for --zonemode=zbd\n\n",
+                       f->file_name);
+               return 1;
+       }
+
        nr_zones = (f->real_file_size + zone_size - 1) / zone_size;
        zbd_info = scalloc(1, sizeof(*zbd_info) +
                           (nr_zones + 1) * sizeof(zbd_info->zone_info[0]));
@@ -561,18 +571,8 @@ int zbd_init(struct thread_data *td)
        for_each_file(td, f, i) {
                if (f->filetype != FIO_TYPE_BLOCK)
                        continue;
-               if (td->o.zone_size && td->o.zone_size < 512) {
-                       log_err("%s: zone size must be at least 512 bytes for --zonemode=zbd\n\n",
-                               f->file_name);
-                       return 1;
-               }
-               if (td->o.zone_size == 0 &&
-                   get_zbd_model(f->file_name) == ZBD_DM_NONE) {
-                       log_err("%s: Specifying the zone size is mandatory for regular block devices with --zonemode=zbd\n\n",
-                               f->file_name);
+               if (zbd_init_zone_info(td, f))
                        return 1;
-               }
-               zbd_init_zone_info(td, f);
        }
 
        if (!zbd_using_direct_io()) {