xref: /linux-6.15/include/linux/blk-integrity.h (revision 133008e8)
1fe45e630SChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0 */
2fe45e630SChristoph Hellwig #ifndef _LINUX_BLK_INTEGRITY_H
3fe45e630SChristoph Hellwig #define _LINUX_BLK_INTEGRITY_H
4fe45e630SChristoph Hellwig 
5fe45e630SChristoph Hellwig #include <linux/blk-mq.h>
6da042a36SChristoph Hellwig #include <linux/bio-integrity.h>
7fe45e630SChristoph Hellwig 
8fe45e630SChristoph Hellwig struct request;
9fe45e630SChristoph Hellwig 
10fe45e630SChristoph Hellwig enum blk_integrity_flags {
119f4aa46fSChristoph Hellwig 	BLK_INTEGRITY_NOVERIFY		= 1 << 0,
129f4aa46fSChristoph Hellwig 	BLK_INTEGRITY_NOGENERATE	= 1 << 1,
13fe45e630SChristoph Hellwig 	BLK_INTEGRITY_DEVICE_CAPABLE	= 1 << 2,
14e9f5f44aSChristoph Hellwig 	BLK_INTEGRITY_REF_TAG		= 1 << 3,
15c6e56cf6SChristoph Hellwig 	BLK_INTEGRITY_STACKED		= 1 << 4,
16fe45e630SChristoph Hellwig };
17fe45e630SChristoph Hellwig 
18e9f5f44aSChristoph Hellwig const char *blk_integrity_profile_name(struct blk_integrity *bi);
19c6e56cf6SChristoph Hellwig bool queue_limits_stack_integrity(struct queue_limits *t,
20c6e56cf6SChristoph Hellwig 		struct queue_limits *b);
queue_limits_stack_integrity_bdev(struct queue_limits * t,struct block_device * bdev)21c6e56cf6SChristoph Hellwig static inline bool queue_limits_stack_integrity_bdev(struct queue_limits *t,
22c6e56cf6SChristoph Hellwig 		struct block_device *bdev)
23c6e56cf6SChristoph Hellwig {
24c6e56cf6SChristoph Hellwig 	return queue_limits_stack_integrity(t, &bdev->bd_disk->queue->limits);
25c6e56cf6SChristoph Hellwig }
26fe45e630SChristoph Hellwig 
27fe45e630SChristoph Hellwig #ifdef CONFIG_BLK_DEV_INTEGRITY
2876c313f6SKeith Busch int blk_rq_map_integrity_sg(struct request *, struct scatterlist *);
29fe45e630SChristoph Hellwig int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);
30d2c5b1faSKeith Busch int blk_rq_integrity_map_user(struct request *rq, void __user *ubuf,
31*133008e8SKeith Busch 			      ssize_t bytes);
32fe45e630SChristoph Hellwig 
33e9f5f44aSChristoph Hellwig static inline bool
blk_integrity_queue_supports_integrity(struct request_queue * q)34e9f5f44aSChristoph Hellwig blk_integrity_queue_supports_integrity(struct request_queue *q)
35e9f5f44aSChristoph Hellwig {
36c6e56cf6SChristoph Hellwig 	return q->limits.integrity.tuple_size;
37e9f5f44aSChristoph Hellwig }
38e9f5f44aSChristoph Hellwig 
blk_get_integrity(struct gendisk * disk)39fe45e630SChristoph Hellwig static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
40fe45e630SChristoph Hellwig {
41e9f5f44aSChristoph Hellwig 	if (!blk_integrity_queue_supports_integrity(disk->queue))
42fe45e630SChristoph Hellwig 		return NULL;
43c6e56cf6SChristoph Hellwig 	return &disk->queue->limits.integrity;
44fe45e630SChristoph Hellwig }
45fe45e630SChristoph Hellwig 
46fe45e630SChristoph Hellwig static inline struct blk_integrity *
bdev_get_integrity(struct block_device * bdev)47fe45e630SChristoph Hellwig bdev_get_integrity(struct block_device *bdev)
48fe45e630SChristoph Hellwig {
49fe45e630SChristoph Hellwig 	return blk_get_integrity(bdev->bd_disk);
50fe45e630SChristoph Hellwig }
51fe45e630SChristoph Hellwig 
52fe45e630SChristoph Hellwig static inline unsigned short
queue_max_integrity_segments(const struct request_queue * q)53fe45e630SChristoph Hellwig queue_max_integrity_segments(const struct request_queue *q)
54fe45e630SChristoph Hellwig {
55fe45e630SChristoph Hellwig 	return q->limits.max_integrity_segments;
56fe45e630SChristoph Hellwig }
57fe45e630SChristoph Hellwig 
58fe45e630SChristoph Hellwig /**
59fe45e630SChristoph Hellwig  * bio_integrity_intervals - Return number of integrity intervals for a bio
60fe45e630SChristoph Hellwig  * @bi:		blk_integrity profile for device
61fe45e630SChristoph Hellwig  * @sectors:	Size of the bio in 512-byte sectors
62fe45e630SChristoph Hellwig  *
63fe45e630SChristoph Hellwig  * Description: The block layer calculates everything in 512 byte
64fe45e630SChristoph Hellwig  * sectors but integrity metadata is done in terms of the data integrity
65fe45e630SChristoph Hellwig  * interval size of the storage device.  Convert the block layer sectors
66fe45e630SChristoph Hellwig  * to the appropriate number of integrity intervals.
67fe45e630SChristoph Hellwig  */
bio_integrity_intervals(struct blk_integrity * bi,unsigned int sectors)68fe45e630SChristoph Hellwig static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
69fe45e630SChristoph Hellwig 						   unsigned int sectors)
70fe45e630SChristoph Hellwig {
71fe45e630SChristoph Hellwig 	return sectors >> (bi->interval_exp - 9);
72fe45e630SChristoph Hellwig }
73fe45e630SChristoph Hellwig 
bio_integrity_bytes(struct blk_integrity * bi,unsigned int sectors)74fe45e630SChristoph Hellwig static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
75fe45e630SChristoph Hellwig 					       unsigned int sectors)
76fe45e630SChristoph Hellwig {
77fe45e630SChristoph Hellwig 	return bio_integrity_intervals(bi, sectors) * bi->tuple_size;
78fe45e630SChristoph Hellwig }
79fe45e630SChristoph Hellwig 
blk_integrity_rq(struct request * rq)80fe45e630SChristoph Hellwig static inline bool blk_integrity_rq(struct request *rq)
81fe45e630SChristoph Hellwig {
82fe45e630SChristoph Hellwig 	return rq->cmd_flags & REQ_INTEGRITY;
83fe45e630SChristoph Hellwig }
84fe45e630SChristoph Hellwig 
85fe45e630SChristoph Hellwig /*
86cf546dd2SMikulas Patocka  * Return the current bvec that contains the integrity data. bip_iter may be
87cf546dd2SMikulas Patocka  * advanced to iterate over the integrity data.
88fe45e630SChristoph Hellwig  */
rq_integrity_vec(struct request * rq)89cf546dd2SMikulas Patocka static inline struct bio_vec rq_integrity_vec(struct request *rq)
90fe45e630SChristoph Hellwig {
91cf546dd2SMikulas Patocka 	return mp_bvec_iter_bvec(rq->bio->bi_integrity->bip_vec,
92cf546dd2SMikulas Patocka 				 rq->bio->bi_integrity->bip_iter);
93fe45e630SChristoph Hellwig }
94fe45e630SChristoph Hellwig #else /* CONFIG_BLK_DEV_INTEGRITY */
blk_rq_count_integrity_sg(struct request_queue * q,struct bio * b)95fe45e630SChristoph Hellwig static inline int blk_rq_count_integrity_sg(struct request_queue *q,
96fe45e630SChristoph Hellwig 					    struct bio *b)
97fe45e630SChristoph Hellwig {
98fe45e630SChristoph Hellwig 	return 0;
99fe45e630SChristoph Hellwig }
blk_rq_map_integrity_sg(struct request * q,struct scatterlist * s)10076c313f6SKeith Busch static inline int blk_rq_map_integrity_sg(struct request *q,
101fe45e630SChristoph Hellwig 					  struct scatterlist *s)
102fe45e630SChristoph Hellwig {
103fe45e630SChristoph Hellwig 	return 0;
104fe45e630SChristoph Hellwig }
blk_rq_integrity_map_user(struct request * rq,void __user * ubuf,ssize_t bytes)105d2c5b1faSKeith Busch static inline int blk_rq_integrity_map_user(struct request *rq,
106d2c5b1faSKeith Busch 					    void __user *ubuf,
107*133008e8SKeith Busch 					    ssize_t bytes)
108d2c5b1faSKeith Busch {
109d2c5b1faSKeith Busch 	return -EINVAL;
110d2c5b1faSKeith Busch }
bdev_get_integrity(struct block_device * b)111fe45e630SChristoph Hellwig static inline struct blk_integrity *bdev_get_integrity(struct block_device *b)
112fe45e630SChristoph Hellwig {
113fe45e630SChristoph Hellwig 	return NULL;
114fe45e630SChristoph Hellwig }
blk_get_integrity(struct gendisk * disk)115fe45e630SChristoph Hellwig static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
116fe45e630SChristoph Hellwig {
117fe45e630SChristoph Hellwig 	return NULL;
118fe45e630SChristoph Hellwig }
119fe45e630SChristoph Hellwig static inline bool
blk_integrity_queue_supports_integrity(struct request_queue * q)120fe45e630SChristoph Hellwig blk_integrity_queue_supports_integrity(struct request_queue *q)
121fe45e630SChristoph Hellwig {
122fe45e630SChristoph Hellwig 	return false;
123fe45e630SChristoph Hellwig }
124fe45e630SChristoph Hellwig static inline unsigned short
queue_max_integrity_segments(const struct request_queue * q)125fe45e630SChristoph Hellwig queue_max_integrity_segments(const struct request_queue *q)
126fe45e630SChristoph Hellwig {
127fe45e630SChristoph Hellwig 	return 0;
128fe45e630SChristoph Hellwig }
129fe45e630SChristoph Hellwig 
bio_integrity_intervals(struct blk_integrity * bi,unsigned int sectors)130fe45e630SChristoph Hellwig static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
131fe45e630SChristoph Hellwig 						   unsigned int sectors)
132fe45e630SChristoph Hellwig {
133fe45e630SChristoph Hellwig 	return 0;
134fe45e630SChristoph Hellwig }
135fe45e630SChristoph Hellwig 
bio_integrity_bytes(struct blk_integrity * bi,unsigned int sectors)136fe45e630SChristoph Hellwig static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
137fe45e630SChristoph Hellwig 					       unsigned int sectors)
138fe45e630SChristoph Hellwig {
139fe45e630SChristoph Hellwig 	return 0;
140fe45e630SChristoph Hellwig }
blk_integrity_rq(struct request * rq)141fe45e630SChristoph Hellwig static inline int blk_integrity_rq(struct request *rq)
142fe45e630SChristoph Hellwig {
143fe45e630SChristoph Hellwig 	return 0;
144fe45e630SChristoph Hellwig }
145fe45e630SChristoph Hellwig 
rq_integrity_vec(struct request * rq)14669b65176SJens Axboe static inline struct bio_vec rq_integrity_vec(struct request *rq)
147fe45e630SChristoph Hellwig {
148cf546dd2SMikulas Patocka 	/* the optimizer will remove all calls to this function */
149cf546dd2SMikulas Patocka 	return (struct bio_vec){ };
150fe45e630SChristoph Hellwig }
151fe45e630SChristoph Hellwig #endif /* CONFIG_BLK_DEV_INTEGRITY */
152c6e56cf6SChristoph Hellwig 
153fe45e630SChristoph Hellwig #endif /* _LINUX_BLK_INTEGRITY_H */
154