engines/libzbc: add libzbc_finish_zone() helper function
[fio.git] / engines / libzbc.c
index 2bc2c7e0e411042e7480066c39e59d1a3bb4ec26..2b63ef1acaa0b4624b80206893f3c6f6c74fb618 100644 (file)
@@ -332,6 +332,39 @@ err:
        return -ret;
 }
 
+static int libzbc_finish_zone(struct thread_data *td, struct fio_file *f,
+                             uint64_t offset, uint64_t length)
+{
+       struct libzbc_data *ld = td->io_ops_data;
+       uint64_t sector = offset >> 9;
+       unsigned int nr_zones;
+       struct zbc_errno err;
+       int i, ret;
+
+       assert(ld);
+       assert(ld->zdev);
+
+       nr_zones = (length + td->o.zone_size - 1) / td->o.zone_size;
+       assert(nr_zones > 0);
+
+       for (i = 0; i < nr_zones; i++, sector += td->o.zone_size >> 9) {
+               ret = zbc_finish_zone(ld->zdev, sector, 0);
+               if (ret)
+                       goto err;
+       }
+
+       return 0;
+
+err:
+       zbc_errno(ld->zdev, &err);
+       td_verror(td, errno, "zbc_finish_zone failed");
+       if (err.sk)
+               log_err("%s: finish zone failed %s:%s\n",
+                       f->file_name,
+                       zbc_sk_str(err.sk), zbc_asc_ascq_str(err.asc_ascq));
+       return -ret;
+}
+
 static int libzbc_get_max_open_zones(struct thread_data *td, struct fio_file *f,
                                     unsigned int *max_open_zones)
 {
@@ -434,6 +467,7 @@ FIO_STATIC struct ioengine_ops ioengine = {
        .report_zones           = libzbc_report_zones,
        .reset_wp               = libzbc_reset_wp,
        .get_max_open_zones     = libzbc_get_max_open_zones,
+       .finish_zone            = libzbc_finish_zone,
        .queue                  = libzbc_queue,
        .flags                  = FIO_SYNCIO | FIO_NOEXTEND | FIO_RAWIO,
 };