diff options
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 65 | 
1 files changed, 31 insertions, 34 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f3ea78b0c91c..4c636c42ad68 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -328,6 +328,7 @@ struct queue_limits {  	unsigned int		max_sectors;  	unsigned int		max_segment_size;  	unsigned int		physical_block_size; +	unsigned int		logical_block_size;  	unsigned int		alignment_offset;  	unsigned int		io_min;  	unsigned int		io_opt; @@ -338,7 +339,6 @@ struct queue_limits {  	unsigned int		discard_granularity;  	unsigned int		discard_alignment; -	unsigned short		logical_block_size;  	unsigned short		max_segments;  	unsigned short		max_integrity_segments;  	unsigned short		max_discard_segments; @@ -349,34 +349,28 @@ struct queue_limits {  	enum blk_zoned_model	zoned;  }; +typedef int (*report_zones_cb)(struct blk_zone *zone, unsigned int idx, +			       void *data); +  #ifdef CONFIG_BLK_DEV_ZONED -/* - * Maximum number of zones to report with a single report zones command. - */ -#define BLK_ZONED_REPORT_MAX_ZONES	8192U - -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, -			       unsigned int *nr_zones); -extern int blkdev_reset_zones(struct block_device *bdev, sector_t sectors, -			      sector_t nr_sectors, gfp_t gfp_mask); +#define BLK_ALL_ZONES  ((unsigned int)-1) +int blkdev_report_zones(struct block_device *bdev, sector_t sector, +			unsigned int nr_zones, report_zones_cb cb, void *data); +unsigned int blkdev_nr_zones(struct gendisk *disk); +extern int blkdev_zone_mgmt(struct block_device *bdev, enum req_opf op, +			    sector_t sectors, sector_t nr_sectors, +			    gfp_t gfp_mask);  extern int blk_revalidate_disk_zones(struct gendisk *disk);  extern int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,  				     unsigned int cmd, unsigned long arg); -extern int blkdev_reset_zones_ioctl(struct block_device *bdev, fmode_t mode, -				    unsigned int cmd, unsigned long arg); +extern int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode, +				  unsigned int cmd, unsigned long arg);  #else /* CONFIG_BLK_DEV_ZONED */ -static inline unsigned int blkdev_nr_zones(struct block_device *bdev) -{ -	return 0; -} - -static inline int blk_revalidate_disk_zones(struct gendisk *disk) +static inline unsigned int blkdev_nr_zones(struct gendisk *disk)  {  	return 0;  } @@ -388,9 +382,9 @@ static inline int blkdev_report_zones_ioctl(struct block_device *bdev,  	return -ENOTTY;  } -static inline int blkdev_reset_zones_ioctl(struct block_device *bdev, -					   fmode_t mode, unsigned int cmd, -					   unsigned long arg) +static inline int blkdev_zone_mgmt_ioctl(struct block_device *bdev, +					 fmode_t mode, unsigned int cmd, +					 unsigned long arg)  {  	return -ENOTTY;  } @@ -411,7 +405,6 @@ struct request_queue {  	/* sw queues */  	struct blk_mq_ctx __percpu	*queue_ctx; -	unsigned int		nr_queues;  	unsigned int		queue_depth; @@ -505,9 +498,9 @@ struct request_queue {  	/*  	 * Zoned block device information for request dispatch control.  	 * nr_zones is the total number of zones of the device. This is always -	 * 0 for regular block devices. seq_zones_bitmap is a bitmap of nr_zones -	 * bits which indicates if a zone is conventional (bit clear) or -	 * sequential (bit set). seq_zones_wlock is a bitmap of nr_zones +	 * 0 for regular block devices. conv_zones_bitmap is a bitmap of nr_zones +	 * bits which indicates if a zone is conventional (bit set) or +	 * sequential (bit clear). seq_zones_wlock is a bitmap of nr_zones  	 * bits which indicates if a zone is write locked, that is, if a write  	 * request targeting the zone was dispatched. All three fields are  	 * initialized by the low level device driver (e.g. scsi/sd.c). @@ -520,7 +513,7 @@ struct request_queue {  	 * blk_mq_unfreeze_queue().  	 */  	unsigned int		nr_zones; -	unsigned long		*seq_zones_bitmap; +	unsigned long		*conv_zones_bitmap;  	unsigned long		*seq_zones_wlock;  #endif /* CONFIG_BLK_DEV_ZONED */ @@ -725,9 +718,11 @@ static inline unsigned int blk_queue_zone_no(struct request_queue *q,  static inline bool blk_queue_zone_is_seq(struct request_queue *q,  					 sector_t sector)  { -	if (!blk_queue_is_zoned(q) || !q->seq_zones_bitmap) +	if (!blk_queue_is_zoned(q))  		return false; -	return test_bit(blk_queue_zone_no(q, sector), q->seq_zones_bitmap); +	if (!q->conv_zones_bitmap) +		return true; +	return !test_bit(blk_queue_zone_no(q, sector), q->conv_zones_bitmap);  }  #else /* CONFIG_BLK_DEV_ZONED */  static inline unsigned int blk_queue_nr_zones(struct request_queue *q) @@ -870,6 +865,8 @@ extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,  			  unsigned int, void __user *);  extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t,  			 struct scsi_ioctl_command __user *); +extern int get_sg_io_hdr(struct sg_io_hdr *hdr, const void __user *argp); +extern int put_sg_io_hdr(const struct sg_io_hdr *hdr, void __user *argp);  extern int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags);  extern void blk_queue_exit(struct request_queue *q); @@ -1080,7 +1077,7 @@ extern void blk_queue_max_write_same_sectors(struct request_queue *q,  		unsigned int max_write_same_sectors);  extern void blk_queue_max_write_zeroes_sectors(struct request_queue *q,  		unsigned int max_write_same_sectors); -extern void blk_queue_logical_block_size(struct request_queue *, unsigned short); +extern void blk_queue_logical_block_size(struct request_queue *, unsigned int);  extern void blk_queue_physical_block_size(struct request_queue *, unsigned int);  extern void blk_queue_alignment_offset(struct request_queue *q,  				       unsigned int alignment); @@ -1294,7 +1291,7 @@ static inline unsigned int queue_max_segment_size(const struct request_queue *q)  	return q->limits.max_segment_size;  } -static inline unsigned short queue_logical_block_size(const struct request_queue *q) +static inline unsigned queue_logical_block_size(const struct request_queue *q)  {  	int retval = 512; @@ -1304,7 +1301,7 @@ static inline unsigned short queue_logical_block_size(const struct request_queue  	return retval;  } -static inline unsigned short bdev_logical_block_size(struct block_device *bdev) +static inline unsigned int bdev_logical_block_size(struct block_device *bdev)  {  	return queue_logical_block_size(bdev_get_queue(bdev));  } @@ -1709,7 +1706,7 @@ struct block_device_operations {  	/* 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); +			unsigned int nr_zones, report_zones_cb cb, void *data);  	struct module *owner;  	const struct pr_ops *pr_ops;  };  |