zbd: change some f->zbd_info conditionals to asserts
[fio.git] / zbd.c
diff --git a/zbd.c b/zbd.c
index 68cd58e1b9db99dfa883dab39bc06daea6b972e8..8e99eb95dc6261101c48e6ea84ab5edf1601c316 100644 (file)
--- a/zbd.c
+++ b/zbd.c
@@ -32,6 +32,17 @@ int zbd_get_zoned_model(struct thread_data *td, struct fio_file *f,
 {
        int ret;
 
+       if (f->filetype == FIO_TYPE_PIPE) {
+               log_err("zonemode=zbd does not support pipes\n");
+               return -EINVAL;
+       }
+
+       /* If regular file, always emulate zones inside the file. */
+       if (f->filetype == FIO_TYPE_FILE) {
+               *model = ZBD_NONE;
+               return 0;
+       }
+
        if (td->io_ops && td->io_ops->get_zoned_model)
                ret = td->io_ops->get_zoned_model(td, f, model);
        else
@@ -409,7 +420,7 @@ static int init_zone_info(struct thread_data *td, struct fio_file *f)
        int i;
 
        if (zone_size == 0) {
-               log_err("%s: Specifying the zone size is mandatory for regular block devices with --zonemode=zbd\n\n",
+               log_err("%s: Specifying the zone size is mandatory for regular file/block device with --zonemode=zbd\n\n",
                        f->file_name);
                return 1;
        }
@@ -430,6 +441,12 @@ static int init_zone_info(struct thread_data *td, struct fio_file *f)
                return 1;
        }
 
+       if (f->real_file_size < zone_size) {
+               log_err("%s: file/device size %"PRIu64" is smaller than zone size %"PRIu64"\n",
+                       f->file_name, f->real_file_size, zone_size);
+               return -EINVAL;
+       }
+
        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]));
@@ -588,7 +605,7 @@ static int zbd_set_max_open_zones(struct thread_data *td, struct fio_file *f)
        unsigned int max_open_zones;
        int ret;
 
-       if (zbd->model != ZBD_HOST_MANAGED) {
+       if (zbd->model != ZBD_HOST_MANAGED || td->o.ignore_zone_limits) {
                /* Only host-managed devices have a max open limit */
                zbd->max_open_zones = td->o.max_open_zones;
                goto out;
@@ -644,8 +661,6 @@ static int zbd_create_zone_info(struct thread_data *td, struct fio_file *f)
                return ret;
 
        switch (zbd_model) {
-       case ZBD_IGNORE:
-               return 0;
        case ZBD_HOST_AWARE:
        case ZBD_HOST_MANAGED:
                ret = parse_zone_info(td, f);
@@ -663,6 +678,7 @@ static int zbd_create_zone_info(struct thread_data *td, struct fio_file *f)
                return -EINVAL;
        }
 
+       assert(f->zbd_info);
        f->zbd_info->model = zbd_model;
 
        ret = zbd_set_max_open_zones(td, f);
@@ -792,8 +808,7 @@ int zbd_setup_files(struct thread_data *td)
                struct fio_zone_info *z;
                int zi;
 
-               if (!zbd)
-                       continue;
+               assert(zbd);
 
                f->min_zone = zbd_zone_idx(f, f->file_offset);
                f->max_zone = zbd_zone_idx(f, f->file_offset + f->io_size);
@@ -1454,8 +1469,7 @@ static void zbd_queue_io(struct thread_data *td, struct io_u *io_u, int q,
        uint32_t zone_idx;
        uint64_t zone_end;
 
-       if (!zbd_info)
-               return;
+       assert(zbd_info);
 
        zone_idx = zbd_zone_idx(f, io_u->offset);
        assert(zone_idx < zbd_info->nr_zones);
@@ -1515,8 +1529,7 @@ static void zbd_put_io(struct thread_data *td, const struct io_u *io_u)
        struct fio_zone_info *z;
        uint32_t zone_idx;
 
-       if (!zbd_info)
-               return;
+       assert(zbd_info);
 
        zone_idx = zbd_zone_idx(f, io_u->offset);
        assert(zone_idx < zbd_info->nr_zones);
@@ -1572,6 +1585,7 @@ void setup_zbd_zone_mode(struct thread_data *td, struct io_u *io_u)
 
        assert(td->o.zone_mode == ZONE_MODE_ZBD);
        assert(td->o.zone_size);
+       assert(f->zbd_info);
 
        zone_idx = zbd_zone_idx(f, f->last_pos[ddir]);
        z = get_zone(f, zone_idx);
@@ -1646,6 +1660,7 @@ enum fio_ddir zbd_adjust_ddir(struct thread_data *td, struct io_u *io_u,
         * devices with all empty zones. Overwrite the first I/O direction as
         * write to make sure data to read exists.
         */
+       assert(io_u->file->zbd_info);
        if (ddir != DDIR_READ || !td_rw(td))
                return ddir;
 
@@ -1675,9 +1690,7 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u)
        uint64_t new_len;
        int64_t range;
 
-       if (!f->zbd_info)
-               return io_u_accept;
-
+       assert(f->zbd_info);
        assert(min_bs);
        assert(is_valid_offset(f, io_u->offset));
        assert(io_u->buflen);