Re: [PATCH 02/11] engines/libzbc: add libzbc_finish_zone() helper function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2022-10-21 at 15:34 +0900, Shin'ichiro Kawasaki wrote:
> To support zone finish operation to ZBC drives through libzbc, add
> finish_zone() callback to struct ioengine_ops, and implement in libzbc
> IO engine. This feature is used to keep the same zone handling by
> zonemode=zbd for libzbc engine as other engines.
> 
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx>

Looks good.

Tested-by: Dmitry Fomichev <dmitry.fomichev@xxxxxxx>
Reviewed-by: Dmitry Fomichev <dmitry.fomichev@xxxxxxx>

> ---
>  engines/libzbc.c | 34 ++++++++++++++++++++++++++++++++++
>  ioengines.h      |  2 ++
>  2 files changed, 36 insertions(+)
> 
> diff --git a/engines/libzbc.c b/engines/libzbc.c
> index 2bc2c7e0..2b63ef1a 100644
> --- a/engines/libzbc.c
> +++ b/engines/libzbc.c
> @@ -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,
>  };
> diff --git a/ioengines.h b/ioengines.h
> index fafa1e48..11d2115c 100644
> --- a/ioengines.h
> +++ b/ioengines.h
> @@ -61,6 +61,8 @@ struct ioengine_ops {
>                         uint64_t, uint64_t);
>         int (*get_max_open_zones)(struct thread_data *, struct fio_file *,
>                                   unsigned int *);
> +       int (*finish_zone)(struct thread_data *, struct fio_file *,
> +                          uint64_t, uint64_t);
>         int option_struct_size;
>         struct fio_option *options;
>  };





[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux