options: Add zonecapacity option for zonemode=zbd
[fio.git] / zbd.c
diff --git a/zbd.c b/zbd.c
index c738a58b206b4ee6a29f2837108f9a2c4ae06b21..85478aa5dc1569cf5c8c25d8c89504059529b2da 100644 (file)
--- a/zbd.c
+++ b/zbd.c
@@ -371,6 +371,7 @@ 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 = td->o.zone_size;
+       uint64_t zone_capacity = td->o.zone_capacity;
        struct zoned_block_device_info *zbd_info = NULL;
        int i;
 
@@ -386,6 +387,16 @@ static int init_zone_info(struct thread_data *td, struct fio_file *f)
                return 1;
        }
 
+       if (zone_capacity == 0)
+               zone_capacity = zone_size;
+
+       if (zone_capacity > zone_size) {
+               log_err("%s: job parameter zonecapacity %llu is larger than zone size %llu\n",
+                       f->file_name, (unsigned long long) td->o.zone_capacity,
+                       (unsigned long long) td->o.zone_size);
+               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]));
@@ -402,7 +413,7 @@ static int init_zone_info(struct thread_data *td, struct fio_file *f)
                p->wp = p->start;
                p->type = ZBD_ZONE_TYPE_SWR;
                p->cond = ZBD_ZONE_COND_EMPTY;
-               p->capacity = zone_size;
+               p->capacity = zone_capacity;
        }
        /* a sentinel */
        p->start = nr_zones * zone_size;