diff options
| author | Ingo Molnar <mingo@kernel.org> | 2022-09-21 09:58:02 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2022-09-21 09:58:02 +0200 | 
| commit | 74656d03ac36fabb16b9df5221cf398ee3a9ca08 (patch) | |
| tree | 0600e619ac817e2c016c148810814f55280316cc /include/linux/blkdev.h | |
| parent | 0d97db026509c1a13f732b22670ab1f0ac9d8d87 (diff) | |
| parent | 521a547ced6477c54b4b0cc206000406c221b4d6 (diff) | |
Merge tag 'v6.0-rc6' into locking/core, to refresh the branch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 234 | 
1 files changed, 97 insertions, 137 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 2f7b43444c5f..84b13fdd34a7 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -140,6 +140,8 @@ struct gendisk {  	struct request_queue *queue;  	void *private_data; +	struct bio_set bio_split; +  	int flags;  	unsigned long state;  #define GD_NEED_PART_SCAN		0 @@ -148,6 +150,7 @@ struct gendisk {  #define GD_NATIVE_CAPACITY		3  #define GD_ADDED			4  #define GD_SUPPRESS_PART_SCAN		5 +#define GD_OWNS_QUEUE			6  	struct mutex open_mutex;	/* open/close mutex */  	unsigned open_partitions;	/* number of open partitions */ @@ -163,6 +166,29 @@ struct gendisk {  #ifdef  CONFIG_BLK_DEV_INTEGRITY  	struct kobject integrity_kobj;  #endif	/* CONFIG_BLK_DEV_INTEGRITY */ + +#ifdef CONFIG_BLK_DEV_ZONED +	/* +	 * 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. 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. +	 * +	 * Reads of this information must be protected with blk_queue_enter() / +	 * blk_queue_exit(). Modifying this information is only allowed while +	 * no requests are being processed. See also blk_mq_freeze_queue() and +	 * blk_mq_unfreeze_queue(). +	 */ +	unsigned int		nr_zones; +	unsigned int		max_open_zones; +	unsigned int		max_active_zones; +	unsigned long		*conv_zones_bitmap; +	unsigned long		*seq_zones_wlock; +#endif /* CONFIG_BLK_DEV_ZONED */ +  #if IS_ENABLED(CONFIG_CDROM)  	struct cdrom_device_info *cdi;  #endif @@ -170,6 +196,12 @@ struct gendisk {  	struct badblocks *bb;  	struct lockdep_map lockdep_map;  	u64 diskseq; + +	/* +	 * Independent sector access ranges. This is always NULL for +	 * devices that do not have multiple independent access ranges. +	 */ +	struct blk_independent_access_ranges *ia_ranges;  };  static inline bool disk_live(struct gendisk *disk) @@ -220,7 +252,7 @@ static inline int blk_validate_block_size(unsigned long bsize)  	return 0;  } -static inline bool blk_op_is_passthrough(unsigned int op) +static inline bool blk_op_is_passthrough(blk_opf_t op)  {  	op &= REQ_OP_MASK;  	return op == REQ_OP_DRV_IN || op == REQ_OP_DRV_OUT; @@ -284,15 +316,15 @@ struct queue_limits {  typedef int (*report_zones_cb)(struct blk_zone *zone, unsigned int idx,  			       void *data); -void blk_queue_set_zoned(struct gendisk *disk, enum blk_zoned_model model); +void disk_set_zoned(struct gendisk *disk, enum blk_zoned_model model);  #ifdef CONFIG_BLK_DEV_ZONED  #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, +unsigned int bdev_nr_zones(struct block_device *bdev); +extern int blkdev_zone_mgmt(struct block_device *bdev, enum req_op op,  			    sector_t sectors, sector_t nr_sectors,  			    gfp_t gfp_mask);  int blk_revalidate_disk_zones(struct gendisk *disk, @@ -305,7 +337,7 @@ extern int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,  #else /* CONFIG_BLK_DEV_ZONED */ -static inline unsigned int blkdev_nr_zones(struct gendisk *disk) +static inline unsigned int bdev_nr_zones(struct block_device *bdev)  {  	return 0;  } @@ -424,6 +456,11 @@ struct request_queue {  	unsigned long		nr_requests;	/* Max # of requests */  	unsigned int		dma_pad_mask; +	/* +	 * Drivers that set dma_alignment to less than 511 must be prepared to +	 * handle individual bvec's that are not a multiple of a SECTOR_SIZE +	 * due to possible offsets. +	 */  	unsigned int		dma_alignment;  #ifdef CONFIG_BLK_INLINE_ENCRYPTION @@ -455,31 +492,6 @@ struct request_queue {  	unsigned int		required_elevator_features; -#ifdef CONFIG_BLK_DEV_ZONED -	/* -	 * 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. 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). -	 * Stacking drivers (device mappers) may or may not initialize -	 * these fields. -	 * -	 * Reads of this information must be protected with blk_queue_enter() / -	 * blk_queue_exit(). Modifying this information is only allowed while -	 * no requests are being processed. See also blk_mq_freeze_queue() and -	 * blk_mq_unfreeze_queue(). -	 */ -	unsigned int		nr_zones; -	unsigned long		*conv_zones_bitmap; -	unsigned long		*seq_zones_wlock; -	unsigned int		max_open_zones; -	unsigned int		max_active_zones; -#endif /* CONFIG_BLK_DEV_ZONED */ -  	int			node;  #ifdef CONFIG_BLK_DEV_IO_TRACE  	struct blk_trace __rcu	*blk_trace; @@ -521,7 +533,6 @@ struct request_queue {  	struct blk_mq_tag_set	*tag_set;  	struct list_head	tag_set_list; -	struct bio_set		bio_split;  	struct dentry		*debugfs_dir;  	struct dentry		*sched_debugfs_dir; @@ -533,12 +544,6 @@ struct request_queue {  	bool			mq_sysfs_init_done; -	/* -	 * Independent sector access ranges. This is always NULL for -	 * devices that do not have multiple independent access ranges. -	 */ -	struct blk_independent_access_ranges *ia_ranges; -  	/**  	 * @srcu: Sleepable RCU. Use as lock when type of the request queue  	 * is blocking (BLK_MQ_F_BLOCKING). Must be the last member @@ -559,7 +564,6 @@ struct request_queue {  #define QUEUE_FLAG_NOXMERGES	9	/* No extended merges */  #define QUEUE_FLAG_ADD_RANDOM	10	/* Contributes to random pool */  #define QUEUE_FLAG_SAME_FORCE	12	/* force complete on same CPU */ -#define QUEUE_FLAG_DEAD		13	/* queue tear-down finished */  #define QUEUE_FLAG_INIT_DONE	14	/* queue is initialized */  #define QUEUE_FLAG_STABLE_WRITES 15	/* don't modify blks until WB is done */  #define QUEUE_FLAG_POLL		16	/* IO polling enabled if set */ @@ -587,7 +591,6 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q);  #define blk_queue_stopped(q)	test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)  #define blk_queue_dying(q)	test_bit(QUEUE_FLAG_DYING, &(q)->queue_flags)  #define blk_queue_has_srcu(q)	test_bit(QUEUE_FLAG_HAS_SRCU, &(q)->queue_flags) -#define blk_queue_dead(q)	test_bit(QUEUE_FLAG_DEAD, &(q)->queue_flags)  #define blk_queue_init_done(q)	test_bit(QUEUE_FLAG_INIT_DONE, &(q)->queue_flags)  #define blk_queue_nomerges(q)	test_bit(QUEUE_FLAG_NOMERGES, &(q)->queue_flags)  #define blk_queue_noxmerges(q)	\ @@ -663,76 +666,69 @@ static inline bool blk_queue_is_zoned(struct request_queue *q)  	}  } -static inline sector_t blk_queue_zone_sectors(struct request_queue *q) -{ -	return blk_queue_is_zoned(q) ? q->limits.chunk_sectors : 0; -} -  #ifdef CONFIG_BLK_DEV_ZONED -static inline unsigned int blk_queue_nr_zones(struct request_queue *q) +static inline unsigned int disk_nr_zones(struct gendisk *disk)  { -	return blk_queue_is_zoned(q) ? q->nr_zones : 0; +	return blk_queue_is_zoned(disk->queue) ? disk->nr_zones : 0;  } -static inline unsigned int blk_queue_zone_no(struct request_queue *q, -					     sector_t sector) +static inline unsigned int disk_zone_no(struct gendisk *disk, sector_t sector)  { -	if (!blk_queue_is_zoned(q)) +	if (!blk_queue_is_zoned(disk->queue))  		return 0; -	return sector >> ilog2(q->limits.chunk_sectors); +	return sector >> ilog2(disk->queue->limits.chunk_sectors);  } -static inline bool blk_queue_zone_is_seq(struct request_queue *q, -					 sector_t sector) +static inline bool disk_zone_is_seq(struct gendisk *disk, sector_t sector)  { -	if (!blk_queue_is_zoned(q)) +	if (!blk_queue_is_zoned(disk->queue))  		return false; -	if (!q->conv_zones_bitmap) +	if (!disk->conv_zones_bitmap)  		return true; -	return !test_bit(blk_queue_zone_no(q, sector), q->conv_zones_bitmap); +	return !test_bit(disk_zone_no(disk, sector), disk->conv_zones_bitmap);  } -static inline void blk_queue_max_open_zones(struct request_queue *q, +static inline void disk_set_max_open_zones(struct gendisk *disk,  		unsigned int max_open_zones)  { -	q->max_open_zones = max_open_zones; +	disk->max_open_zones = max_open_zones;  } -static inline unsigned int queue_max_open_zones(const struct request_queue *q) +static inline void disk_set_max_active_zones(struct gendisk *disk, +		unsigned int max_active_zones)  { -	return q->max_open_zones; +	disk->max_active_zones = max_active_zones;  } -static inline void blk_queue_max_active_zones(struct request_queue *q, -		unsigned int max_active_zones) +static inline unsigned int bdev_max_open_zones(struct block_device *bdev)  { -	q->max_active_zones = max_active_zones; +	return bdev->bd_disk->max_open_zones;  } -static inline unsigned int queue_max_active_zones(const struct request_queue *q) +static inline unsigned int bdev_max_active_zones(struct block_device *bdev)  { -	return q->max_active_zones; +	return bdev->bd_disk->max_active_zones;  } +  #else /* CONFIG_BLK_DEV_ZONED */ -static inline unsigned int blk_queue_nr_zones(struct request_queue *q) +static inline unsigned int disk_nr_zones(struct gendisk *disk)  {  	return 0;  } -static inline bool blk_queue_zone_is_seq(struct request_queue *q, -					 sector_t sector) +static inline bool disk_zone_is_seq(struct gendisk *disk, sector_t sector)  {  	return false;  } -static inline unsigned int blk_queue_zone_no(struct request_queue *q, -					     sector_t sector) +static inline unsigned int disk_zone_no(struct gendisk *disk, sector_t sector)  {  	return 0;  } -static inline unsigned int queue_max_open_zones(const struct request_queue *q) +static inline unsigned int bdev_max_open_zones(struct block_device *bdev)  {  	return 0;  } -static inline unsigned int queue_max_active_zones(const struct request_queue *q) + +static inline unsigned int bdev_max_active_zones(struct block_device *bdev)  {  	return 0;  } @@ -812,8 +808,6 @@ static inline u64 sb_bdev_nr_blocks(struct super_block *sb)  int bdev_disk_changed(struct gendisk *disk, bool invalidate); -struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id, -		struct lock_class_key *lkclass);  void put_disk(struct gendisk *disk);  struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass); @@ -832,7 +826,6 @@ struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);  									\  	__blk_alloc_disk(node_id, &__key);				\  }) -void blk_cleanup_disk(struct gendisk *disk);  int __register_blkdev(unsigned int major, const char *name,  		void (*probe)(dev_t devt)); @@ -872,15 +865,15 @@ void blk_request_module(dev_t devt);  extern int blk_register_queue(struct gendisk *disk);  extern void blk_unregister_queue(struct gendisk *disk);  void submit_bio_noacct(struct bio *bio); +struct bio *bio_split_to_limits(struct bio *bio);  extern int blk_lld_busy(struct request_queue *q); -extern void blk_queue_split(struct bio **);  extern int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags);  extern void blk_queue_exit(struct request_queue *q);  extern void blk_sync_queue(struct request_queue *q);  /* Helper to convert REQ_OP_XXX to its string format XXX */ -extern const char *blk_op_str(unsigned int op); +extern const char *blk_op_str(enum req_op op);  int blk_status_to_errno(blk_status_t status);  blk_status_t errno_to_blk_status(int errno); @@ -898,64 +891,33 @@ static inline struct request_queue *bdev_get_queue(struct block_device *bdev)  	return bdev->bd_queue;	/* this is never NULL */  } -#ifdef CONFIG_BLK_DEV_ZONED -  /* Helper to convert BLK_ZONE_ZONE_XXX to its string format XXX */  const char *blk_zone_cond_str(enum blk_zone_cond zone_cond);  static inline unsigned int bio_zone_no(struct bio *bio)  { -	return blk_queue_zone_no(bdev_get_queue(bio->bi_bdev), -				 bio->bi_iter.bi_sector); +	return disk_zone_no(bio->bi_bdev->bd_disk, bio->bi_iter.bi_sector);  }  static inline unsigned int bio_zone_is_seq(struct bio *bio)  { -	return blk_queue_zone_is_seq(bdev_get_queue(bio->bi_bdev), -				     bio->bi_iter.bi_sector); -} -#endif /* CONFIG_BLK_DEV_ZONED */ - -static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q, -						     int op) -{ -	if (unlikely(op == REQ_OP_DISCARD || op == REQ_OP_SECURE_ERASE)) -		return min(q->limits.max_discard_sectors, -			   UINT_MAX >> SECTOR_SHIFT); - -	if (unlikely(op == REQ_OP_WRITE_ZEROES)) -		return q->limits.max_write_zeroes_sectors; - -	return q->limits.max_sectors; +	return disk_zone_is_seq(bio->bi_bdev->bd_disk, bio->bi_iter.bi_sector);  }  /* - * Return maximum size of a request at given offset. Only valid for - * file system requests. + * Return how much of the chunk is left to be used for I/O at a given offset.   */ -static inline unsigned int blk_max_size_offset(struct request_queue *q, -					       sector_t offset, -					       unsigned int chunk_sectors) -{ -	if (!chunk_sectors) { -		if (q->limits.chunk_sectors) -			chunk_sectors = q->limits.chunk_sectors; -		else -			return q->limits.max_sectors; -	} - -	if (likely(is_power_of_2(chunk_sectors))) -		chunk_sectors -= offset & (chunk_sectors - 1); -	else -		chunk_sectors -= sector_div(offset, chunk_sectors); - -	return min(q->limits.max_sectors, chunk_sectors); +static inline unsigned int blk_chunk_sectors_left(sector_t offset, +		unsigned int chunk_sectors) +{ +	if (unlikely(!is_power_of_2(chunk_sectors))) +		return chunk_sectors - sector_div(offset, chunk_sectors); +	return chunk_sectors - (offset & (chunk_sectors - 1));  }  /*   * Access functions for manipulating queue properties   */ -extern void blk_cleanup_queue(struct request_queue *);  void blk_queue_bounce_limit(struct request_queue *q, enum blk_bounce limit);  extern void blk_queue_max_hw_sectors(struct request_queue *, unsigned int);  extern void blk_queue_chunk_sectors(struct request_queue *, unsigned int); @@ -1206,6 +1168,11 @@ bdev_max_zone_append_sectors(struct block_device *bdev)  	return queue_max_zone_append_sectors(bdev_get_queue(bdev));  } +static inline unsigned int bdev_max_segments(struct block_device *bdev) +{ +	return queue_max_segments(bdev_get_queue(bdev)); +} +  static inline unsigned queue_logical_block_size(const struct request_queue *q)  {  	int retval = 512; @@ -1337,32 +1304,26 @@ static inline sector_t bdev_zone_sectors(struct block_device *bdev)  {  	struct request_queue *q = bdev_get_queue(bdev); -	if (q) -		return blk_queue_zone_sectors(q); -	return 0; +	if (!blk_queue_is_zoned(q)) +		return 0; +	return q->limits.chunk_sectors;  } -static inline unsigned int bdev_max_open_zones(struct block_device *bdev) +static inline int queue_dma_alignment(const struct request_queue *q)  { -	struct request_queue *q = bdev_get_queue(bdev); - -	if (q) -		return queue_max_open_zones(q); -	return 0; +	return q ? q->dma_alignment : 511;  } -static inline unsigned int bdev_max_active_zones(struct block_device *bdev) +static inline unsigned int bdev_dma_alignment(struct block_device *bdev)  { -	struct request_queue *q = bdev_get_queue(bdev); - -	if (q) -		return queue_max_active_zones(q); -	return 0; +	return queue_dma_alignment(bdev_get_queue(bdev));  } -static inline int queue_dma_alignment(const struct request_queue *q) +static inline bool bdev_iter_is_aligned(struct block_device *bdev, +					struct iov_iter *iter)  { -	return q ? q->dma_alignment : 511; +	return iov_iter_is_aligned(iter, bdev_dma_alignment(bdev), +				   bdev_logical_block_size(bdev) - 1);  }  static inline int blk_rq_aligned(struct request_queue *q, unsigned long addr, @@ -1426,7 +1387,7 @@ struct block_device_operations {  			unsigned int flags);  	int (*open) (struct block_device *, fmode_t);  	void (*release) (struct gendisk *, fmode_t); -	int (*rw_page)(struct block_device *, sector_t, struct page *, unsigned int); +	int (*rw_page)(struct block_device *, sector_t, struct page *, enum req_op);  	int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);  	int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);  	unsigned int (*check_events) (struct gendisk *disk, @@ -1479,9 +1440,9 @@ static inline void blk_wake_io_task(struct task_struct *waiter)  }  unsigned long bdev_start_io_acct(struct block_device *bdev, -				 unsigned int sectors, unsigned int op, +				 unsigned int sectors, enum req_op op,  				 unsigned long start_time); -void bdev_end_io_acct(struct block_device *bdev, unsigned int op, +void bdev_end_io_acct(struct block_device *bdev, enum req_op op,  		unsigned long start_time);  void bio_start_io_acct_time(struct bio *bio, unsigned long start_time); @@ -1502,7 +1463,6 @@ static inline void bio_end_io_acct(struct bio *bio, unsigned long start_time)  int bdev_read_only(struct block_device *bdev);  int set_blocksize(struct block_device *bdev, int size); -const char *bdevname(struct block_device *bdev, char *buffer);  int lookup_bdev(const char *pathname, dev_t *dev);  void blkdev_show(struct seq_file *seqf, off_t offset);  | 
