Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at d986ba0329dcca102e227995371135c9bbcefb6b 202 lines 5.7 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _LINUX_BLK_INTEGRITY_H 3#define _LINUX_BLK_INTEGRITY_H 4 5#include <linux/blk-mq.h> 6#include <linux/bio-integrity.h> 7#include <linux/blk-mq-dma.h> 8 9struct request; 10 11enum blk_integrity_flags { 12 BLK_INTEGRITY_NOVERIFY = 1 << 0, 13 BLK_INTEGRITY_NOGENERATE = 1 << 1, 14 BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2, 15 BLK_INTEGRITY_REF_TAG = 1 << 3, 16 BLK_INTEGRITY_STACKED = 1 << 4, 17 BLK_SPLIT_INTERVAL_CAPABLE = 1 << 5, 18}; 19 20const char *blk_integrity_profile_name(struct blk_integrity *bi); 21bool queue_limits_stack_integrity(struct queue_limits *t, 22 struct queue_limits *b); 23static inline bool queue_limits_stack_integrity_bdev(struct queue_limits *t, 24 struct block_device *bdev) 25{ 26 return queue_limits_stack_integrity(t, &bdev->bd_disk->queue->limits); 27} 28 29#ifdef CONFIG_BLK_DEV_INTEGRITY 30int blk_rq_map_integrity_sg(struct request *, struct scatterlist *); 31 32int blk_rq_count_integrity_sg(struct request_queue *, struct bio *); 33int blk_rq_integrity_map_user(struct request *rq, void __user *ubuf, 34 ssize_t bytes); 35int blk_get_meta_cap(struct block_device *bdev, unsigned int cmd, 36 struct logical_block_metadata_cap __user *argp); 37bool blk_rq_integrity_dma_map_iter_start(struct request *req, 38 struct device *dma_dev, struct dma_iova_state *state, 39 struct blk_dma_iter *iter); 40bool blk_rq_integrity_dma_map_iter_next(struct request *req, 41 struct device *dma_dev, struct blk_dma_iter *iter); 42 43static inline bool 44blk_integrity_queue_supports_integrity(struct request_queue *q) 45{ 46 return q->limits.integrity.metadata_size; 47} 48 49static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk) 50{ 51 if (!blk_integrity_queue_supports_integrity(disk->queue)) 52 return NULL; 53 return &disk->queue->limits.integrity; 54} 55 56static inline struct blk_integrity * 57bdev_get_integrity(struct block_device *bdev) 58{ 59 return blk_get_integrity(bdev->bd_disk); 60} 61 62static inline unsigned short 63queue_max_integrity_segments(const struct request_queue *q) 64{ 65 return q->limits.max_integrity_segments; 66} 67 68/** 69 * bio_integrity_intervals - Return number of integrity intervals for a bio 70 * @bi: blk_integrity profile for device 71 * @sectors: Size of the bio in 512-byte sectors 72 * 73 * Description: The block layer calculates everything in 512 byte 74 * sectors but integrity metadata is done in terms of the data integrity 75 * interval size of the storage device. Convert the block layer sectors 76 * to the appropriate number of integrity intervals. 77 */ 78static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi, 79 unsigned int sectors) 80{ 81 return sectors >> (bi->interval_exp - 9); 82} 83 84static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi, 85 unsigned int sectors) 86{ 87 return bio_integrity_intervals(bi, sectors) * bi->metadata_size; 88} 89 90static inline bool blk_integrity_rq(const struct request *rq) 91{ 92 return rq->cmd_flags & REQ_INTEGRITY; 93} 94 95/* 96 * Return the current bvec that contains the integrity data. bip_iter may be 97 * advanced to iterate over the integrity data. 98 */ 99static inline struct bio_vec rq_integrity_vec(struct request *rq) 100{ 101 return mp_bvec_iter_bvec(rq->bio->bi_integrity->bip_vec, 102 rq->bio->bi_integrity->bip_iter); 103} 104#else /* CONFIG_BLK_DEV_INTEGRITY */ 105static inline int blk_get_meta_cap(struct block_device *bdev, unsigned int cmd, 106 struct logical_block_metadata_cap __user *argp) 107{ 108 return -ENOIOCTLCMD; 109} 110static inline int blk_rq_count_integrity_sg(struct request_queue *q, 111 struct bio *b) 112{ 113 return 0; 114} 115static inline int blk_rq_map_integrity_sg(struct request *q, 116 struct scatterlist *s) 117{ 118 return 0; 119} 120static inline int blk_rq_integrity_map_user(struct request *rq, 121 void __user *ubuf, 122 ssize_t bytes) 123{ 124 return -EINVAL; 125} 126static inline bool blk_rq_integrity_dma_map_iter_start(struct request *req, 127 struct device *dma_dev, struct dma_iova_state *state, 128 struct blk_dma_iter *iter) 129{ 130 return false; 131} 132static inline bool blk_rq_integrity_dma_map_iter_next(struct request *req, 133 struct device *dma_dev, struct blk_dma_iter *iter) 134{ 135 return false; 136} 137static inline struct blk_integrity *bdev_get_integrity(struct block_device *b) 138{ 139 return NULL; 140} 141static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk) 142{ 143 return NULL; 144} 145static inline bool 146blk_integrity_queue_supports_integrity(struct request_queue *q) 147{ 148 return false; 149} 150static inline unsigned short 151queue_max_integrity_segments(const struct request_queue *q) 152{ 153 return 0; 154} 155 156static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi, 157 unsigned int sectors) 158{ 159 return 0; 160} 161 162static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi, 163 unsigned int sectors) 164{ 165 return 0; 166} 167static inline bool blk_integrity_rq(const struct request *rq) 168{ 169 return false; 170} 171 172static inline struct bio_vec rq_integrity_vec(struct request *rq) 173{ 174 /* the optimizer will remove all calls to this function */ 175 return (struct bio_vec){ }; 176} 177#endif /* CONFIG_BLK_DEV_INTEGRITY */ 178 179enum bio_integrity_action { 180 BI_ACT_BUFFER = (1u << 0), /* allocate buffer */ 181 BI_ACT_CHECK = (1u << 1), /* generate / verify PI */ 182 BI_ACT_ZERO = (1u << 2), /* zero buffer */ 183}; 184 185/** 186 * bio_integrity_action - return the integrity action needed for a bio 187 * @bio: bio to operate on 188 * 189 * Returns the mask of integrity actions (BI_ACT_*) that need to be performed 190 * for @bio. 191 */ 192unsigned int __bio_integrity_action(struct bio *bio); 193static inline unsigned int bio_integrity_action(struct bio *bio) 194{ 195 if (!blk_get_integrity(bio->bi_bdev->bd_disk)) 196 return 0; 197 if (bio_integrity(bio)) 198 return 0; 199 return __bio_integrity_action(bio); 200} 201 202#endif /* _LINUX_BLK_INTEGRITY_H */