Re: [PATCH 2/2] block: add BLKSETDESCZONE ioctl for Zoned Block Devices

From: Bart Van Assche
Date: Sun Jun 28 2020 - 21:36:37 EST


On 2020-06-28 16:01, Matias BjÃrling wrote:
> + /* This may take a while, so be nice to others */
> + cond_resched();
> +
> + return submit_bio_wait(&bio);

A cond_resched() call before a submit_bio_wait() call? I think it's the
first time that I see this. Is that call really necessary? Isn't the
wait_for_completion() call inside submit_bio_wait() sufficient?

> + /* no flags is currently supported */
^^
are?

> + /* allocate the size of the zone descriptor extension and fill
> + * with the data in the user data buffer. If the data size is less
> + * than the zone descriptor extension size, then the rest of the
> + * zone description extension data buffer is zero-filled.
> + */
> + zsd_data = (void *) get_zeroed_page(GFP_KERNEL);
> + if (!zsd_data)
> + return -ENOMEM;
> +
> + if (copy_from_user(zsd_data, argp + sizeof(struct blk_zone_set_desc),
> + zsd.len)) {
> + ret = -EFAULT;
> + goto free;
> + }

Has it been considered to use kmalloc() instead of get_zeroed_page()?

> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
> index ccb895f911b1..53b7b05b0004 100644
> --- a/include/linux/blk_types.h
> +++ b/include/linux/blk_types.h
> @@ -316,6 +316,8 @@ enum req_opf {
> REQ_OP_ZONE_FINISH = 12,
> /* write data at the current zone write pointer */
> REQ_OP_ZONE_APPEND = 13,
> + /* associate zone desc extension data to a zone */
> + REQ_OP_ZONE_SET_DESC = 14,
>
> /* SCSI passthrough using struct scsi_request */
> REQ_OP_SCSI_IN = 32,

Does REQ_OP_ZONE_SET_DESC count as a read or as a write operation? See also:

static inline bool op_is_write(unsigned int op)
{
return (op & 1);
}

> +/**
> + * struct blk_zone_set_desc - BLKSETDESCZONE ioctl requests
> + * @sector: Starting sector of the zone to operate on.
> + * @flags: Feature flags.
> + * @len: size, in bytes, of the data to be associated to the zone.
> + * @data: data to be associated.
> + */
> +struct blk_zone_set_desc {
> + __u64 sector;
> + __u32 flags;
> + __u32 len;
> + __u8 data[0];
> +};

Isn't the recommended style to use a flexible array ([] instead of [0])?
See also https://lore.kernel.org/lkml/20200608213711.GA22271@embeddedor/.

Thanks,

Bart.