diff options
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 70 | 
1 files changed, 45 insertions, 25 deletions
| diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 9154570edf29..d6869e0e2b64 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -27,8 +27,6 @@  #include <linux/percpu-refcount.h>  #include <linux/scatterlist.h>  #include <linux/blkzoned.h> -#include <linux/seqlock.h> -#include <linux/u64_stats_sync.h>  struct module;  struct scsi_ioctl_command; @@ -42,7 +40,7 @@ struct bsg_job;  struct blkcg_gq;  struct blk_flush_queue;  struct pr_ops; -struct rq_wb; +struct rq_qos;  struct blk_queue_stats;  struct blk_stat_callback; @@ -442,10 +440,8 @@ struct request_queue {  	int			nr_rqs[2];	/* # allocated [a]sync rqs */  	int			nr_rqs_elvpriv;	/* # allocated rqs w/ elvpriv */ -	atomic_t		shared_hctx_restart; -  	struct blk_queue_stats	*stats; -	struct rq_wb		*rq_wb; +	struct rq_qos		*rq_qos;  	/*  	 * If blkcg is not used, @q->root_rl serves all requests.  If blkcg @@ -592,6 +588,7 @@ struct request_queue {  	struct queue_limits	limits; +#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 @@ -612,6 +609,7 @@ struct request_queue {  	unsigned int		nr_zones;  	unsigned long		*seq_zones_bitmap;  	unsigned long		*seq_zones_wlock; +#endif /* CONFIG_BLK_DEV_ZONED */  	/*  	 * sg stuff @@ -800,11 +798,7 @@ static inline unsigned int blk_queue_zone_sectors(struct request_queue *q)  	return blk_queue_is_zoned(q) ? q->limits.chunk_sectors : 0;  } -static inline unsigned int blk_queue_nr_zones(struct request_queue *q) -{ -	return q->nr_zones; -} - +#ifdef CONFIG_BLK_DEV_ZONED  static inline unsigned int blk_queue_zone_no(struct request_queue *q,  					     sector_t sector)  { @@ -820,6 +814,7 @@ static inline bool blk_queue_zone_is_seq(struct request_queue *q,  		return false;  	return test_bit(blk_queue_zone_no(q, sector), q->seq_zones_bitmap);  } +#endif /* CONFIG_BLK_DEV_ZONED */  static inline bool rq_is_sync(struct request *rq)  { @@ -1070,6 +1065,7 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq)  	return blk_rq_cur_bytes(rq) >> SECTOR_SHIFT;  } +#ifdef CONFIG_BLK_DEV_ZONED  static inline unsigned int blk_rq_zone_no(struct request *rq)  {  	return blk_queue_zone_no(rq->q, blk_rq_pos(rq)); @@ -1079,6 +1075,7 @@ static inline unsigned int blk_rq_zone_is_seq(struct request *rq)  {  	return blk_queue_zone_is_seq(rq->q, blk_rq_pos(rq));  } +#endif /* CONFIG_BLK_DEV_ZONED */  /*   * Some commands like WRITE SAME have a payload or data transfer size which @@ -1119,8 +1116,8 @@ static inline unsigned int blk_max_size_offset(struct request_queue *q,  	if (!q->limits.chunk_sectors)  		return q->limits.max_sectors; -	return q->limits.chunk_sectors - -			(offset & (q->limits.chunk_sectors - 1)); +	return min(q->limits.max_sectors, (unsigned int)(q->limits.chunk_sectors - +			(offset & (q->limits.chunk_sectors - 1))));  }  static inline unsigned int blk_rq_get_max_sectors(struct request *rq, @@ -1437,8 +1434,6 @@ enum blk_default_limits {  	BLK_SEG_BOUNDARY_MASK	= 0xFFFFFFFFUL,  }; -#define blkdev_entry_to_request(entry) list_entry((entry), struct request, queuelist) -  static inline unsigned long queue_segment_boundary(struct request_queue *q)  {  	return q->limits.seg_boundary_mask; @@ -1639,15 +1634,6 @@ static inline unsigned int bdev_zone_sectors(struct block_device *bdev)  	return 0;  } -static inline unsigned int bdev_nr_zones(struct block_device *bdev) -{ -	struct request_queue *q = bdev_get_queue(bdev); - -	if (q) -		return blk_queue_nr_zones(q); -	return 0; -} -  static inline int queue_dma_alignment(struct request_queue *q)  {  	return q ? q->dma_alignment : 511; @@ -1877,6 +1863,28 @@ static inline bool integrity_req_gap_front_merge(struct request *req,  				bip_next->bip_vec[0].bv_offset);  } +/** + * bio_integrity_intervals - Return number of integrity intervals for a bio + * @bi:		blk_integrity profile for device + * @sectors:	Size of the bio in 512-byte sectors + * + * Description: The block layer calculates everything in 512 byte + * sectors but integrity metadata is done in terms of the data integrity + * interval size of the storage device.  Convert the block layer sectors + * to the appropriate number of integrity intervals. + */ +static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi, +						   unsigned int sectors) +{ +	return sectors >> (bi->interval_exp - 9); +} + +static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi, +					       unsigned int sectors) +{ +	return bio_integrity_intervals(bi, sectors) * bi->tuple_size; +} +  #else /* CONFIG_BLK_DEV_INTEGRITY */  struct bio; @@ -1950,12 +1958,24 @@ static inline bool integrity_req_gap_front_merge(struct request *req,  	return false;  } +static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi, +						   unsigned int sectors) +{ +	return 0; +} + +static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi, +					       unsigned int sectors) +{ +	return 0; +} +  #endif /* CONFIG_BLK_DEV_INTEGRITY */  struct block_device_operations {  	int (*open) (struct block_device *, fmode_t);  	void (*release) (struct gendisk *, fmode_t); -	int (*rw_page)(struct block_device *, sector_t, struct page *, bool); +	int (*rw_page)(struct block_device *, sector_t, struct page *, unsigned int);  	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, |