[dm-devel] [PATCH 10/11] block: add a report_zones method
Mike Snitzer
snitzer at redhat.com
Wed Oct 10 15:34:54 UTC 2018
On Tue, Oct 09 2018 at 9:52pm -0400,
Damien Le Moal <damien.lemoal at wdc.com> wrote:
> From: Christoph Hellwig <hch at lst.de>
>
> Dispatching a report zones command through the request queue is a major
> pain due to the command reply payload rewriting necessary. Given that
> blkdev_report_zones() is executing everything synchronously, implement
> report zones as a block device file operation instead, allowing major
> simplification of the code in many places.
>
> sd, null-blk, dm-linear and dm-flakey being the only block device
> drivers supporting exposing zoned block devices, these drivers are
> modified to provide the device side implementation of the
> report_zones() block device file operation.
>
> For dm-linear and dm-flakey, a new report_zones() target type operation
> is defined so that the upper block layer call can be propagated down to
> the underlying devices of the dm targets.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> [Damien]
> * Changed method block_device argument to gendisk
> * Various bug fixes and improvements
> * Added support for null_blk, dm-linear and dm-flakey.
> Signed-off-by: Damien Le Moal <damien.lemoal at wdc.com>
> ---
...
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index c24969b1741b..d183c10872b7 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -396,11 +396,6 @@ struct queue_limits {
>
> #ifdef CONFIG_BLK_DEV_ZONED
>
> -struct blk_zone_report_hdr {
> - unsigned int nr_zones;
> - u8 padding[60];
> -};
> -
> extern unsigned int blkdev_nr_zones(struct block_device *bdev);
> extern int blkdev_report_zones(struct block_device *bdev,
> sector_t sector, struct blk_zone *zones,
> @@ -1992,6 +1987,9 @@ struct block_device_operations {
> int (*getgeo)(struct block_device *, struct hd_geometry *);
> /* this callback is with swap_lock and sometimes page table lock held */
> void (*swap_slot_free_notify) (struct block_device *, unsigned long);
> + int (*report_zones)(struct gendisk *, sector_t sector,
> + struct blk_zone *zones, unsigned int *nr_zones,
> + gfp_t gfp_mask);
> struct module *owner;
> const struct pr_ops *pr_ops;
> };
Should this new 'report_zones' method be wrapped with #ifdef
CONFIG_BLK_DEV_ZONED?
Mike
More information about the dm-devel
mailing list