diff options
| author | Christoph Hellwig <hch@lst.de> | 2018-10-12 06:08:49 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2018-10-25 13:17:40 -0400 |
| commit | e76239a3748c90a8b0e197f8f4544a8ce52f126e (patch) | |
| tree | 4e555b7fe24f1642eecc1cfbca563897cfeb6d4a /include/linux/blkdev.h | |
| parent | 965b652e901886ea54f93c60027b5be76328d958 (diff) | |
block: add a report_zones method
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 device mappers, a new report_zones() target type operation is
defined so that the upper block layer calls blkdev_report_zones() can
be propagated down to the underlying devices of the dm targets.
Implementation for this new operation is added to the dm-linear and
dm-flakey targets.
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Christoph Hellwig <hch@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.
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 6bb845f9601a..51fe6472ce02 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -396,11 +396,6 @@ struct queue_limits { | |||
| 396 | 396 | ||
| 397 | #ifdef CONFIG_BLK_DEV_ZONED | 397 | #ifdef CONFIG_BLK_DEV_ZONED |
| 398 | 398 | ||
| 399 | struct blk_zone_report_hdr { | ||
| 400 | unsigned int nr_zones; | ||
| 401 | u8 padding[60]; | ||
| 402 | }; | ||
| 403 | |||
| 404 | extern unsigned int blkdev_nr_zones(struct block_device *bdev); | 399 | extern unsigned int blkdev_nr_zones(struct block_device *bdev); |
| 405 | extern int blkdev_report_zones(struct block_device *bdev, | 400 | extern int blkdev_report_zones(struct block_device *bdev, |
| 406 | sector_t sector, struct blk_zone *zones, | 401 | sector_t sector, struct blk_zone *zones, |
| @@ -1867,6 +1862,9 @@ struct block_device_operations { | |||
| 1867 | int (*getgeo)(struct block_device *, struct hd_geometry *); | 1862 | int (*getgeo)(struct block_device *, struct hd_geometry *); |
| 1868 | /* this callback is with swap_lock and sometimes page table lock held */ | 1863 | /* this callback is with swap_lock and sometimes page table lock held */ |
| 1869 | void (*swap_slot_free_notify) (struct block_device *, unsigned long); | 1864 | void (*swap_slot_free_notify) (struct block_device *, unsigned long); |
| 1865 | int (*report_zones)(struct gendisk *, sector_t sector, | ||
| 1866 | struct blk_zone *zones, unsigned int *nr_zones, | ||
| 1867 | gfp_t gfp_mask); | ||
| 1870 | struct module *owner; | 1868 | struct module *owner; |
| 1871 | const struct pr_ops *pr_ops; | 1869 | const struct pr_ops *pr_ops; |
| 1872 | }; | 1870 | }; |
