1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_BIO_INTEGRITY_H 3 #define _LINUX_BIO_INTEGRITY_H 4 5 #include <linux/bio.h> 6 7 enum bip_flags { 8 BIP_BLOCK_INTEGRITY = 1 << 0, /* block layer owns integrity data */ 9 BIP_MAPPED_INTEGRITY = 1 << 1, /* ref tag has been remapped */ 10 BIP_DISK_NOCHECK = 1 << 2, /* disable disk integrity checking */ 11 BIP_IP_CHECKSUM = 1 << 3, /* IP checksum */ 12 BIP_COPY_USER = 1 << 4, /* Kernel bounce buffer in use */ 13 BIP_CHECK_GUARD = 1 << 5, /* guard check */ 14 BIP_CHECK_REFTAG = 1 << 6, /* reftag check */ 15 BIP_CHECK_APPTAG = 1 << 7, /* apptag check */ 16 }; 17 18 struct bio_integrity_payload { 19 struct bio *bip_bio; /* parent bio */ 20 21 struct bvec_iter bip_iter; 22 23 unsigned short bip_vcnt; /* # of integrity bio_vecs */ 24 unsigned short bip_max_vcnt; /* integrity bio_vec slots */ 25 unsigned short bip_flags; /* control flags */ 26 u16 app_tag; /* application tag value */ 27 28 struct bvec_iter bio_iter; /* for rewinding parent bio */ 29 30 struct work_struct bip_work; /* I/O completion */ 31 32 struct bio_vec *bip_vec; 33 struct bio_vec bip_inline_vecs[];/* embedded bvec array */ 34 }; 35 36 #define BIP_CLONE_FLAGS (BIP_MAPPED_INTEGRITY | BIP_IP_CHECKSUM | \ 37 BIP_CHECK_GUARD | BIP_CHECK_REFTAG | BIP_CHECK_APPTAG) 38 39 #ifdef CONFIG_BLK_DEV_INTEGRITY 40 41 #define bip_for_each_vec(bvl, bip, iter) \ 42 for_each_bvec(bvl, (bip)->bip_vec, iter, (bip)->bip_iter) 43 44 #define bio_for_each_integrity_vec(_bvl, _bio, _iter) \ 45 for_each_bio(_bio) \ 46 bip_for_each_vec(_bvl, _bio->bi_integrity, _iter) 47 48 static inline struct bio_integrity_payload *bio_integrity(struct bio *bio) 49 { 50 if (bio->bi_opf & REQ_INTEGRITY) 51 return bio->bi_integrity; 52 53 return NULL; 54 } 55 56 static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag) 57 { 58 struct bio_integrity_payload *bip = bio_integrity(bio); 59 60 if (bip) 61 return bip->bip_flags & flag; 62 63 return false; 64 } 65 66 static inline sector_t bip_get_seed(struct bio_integrity_payload *bip) 67 { 68 return bip->bip_iter.bi_sector; 69 } 70 71 static inline void bip_set_seed(struct bio_integrity_payload *bip, 72 sector_t seed) 73 { 74 bip->bip_iter.bi_sector = seed; 75 } 76 77 struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, gfp_t gfp, 78 unsigned int nr); 79 int bio_integrity_add_page(struct bio *bio, struct page *page, unsigned int len, 80 unsigned int offset); 81 int bio_integrity_map_user(struct bio *bio, struct iov_iter *iter); 82 int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta); 83 void bio_integrity_unmap_user(struct bio *bio); 84 bool bio_integrity_prep(struct bio *bio); 85 void bio_integrity_advance(struct bio *bio, unsigned int bytes_done); 86 void bio_integrity_trim(struct bio *bio); 87 int bio_integrity_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp_mask); 88 int bioset_integrity_create(struct bio_set *bs, int pool_size); 89 void bioset_integrity_free(struct bio_set *bs); 90 void bio_integrity_init(void); 91 92 #else /* CONFIG_BLK_DEV_INTEGRITY */ 93 94 static inline struct bio_integrity_payload *bio_integrity(struct bio *bio) 95 { 96 return NULL; 97 } 98 99 static inline int bioset_integrity_create(struct bio_set *bs, int pool_size) 100 { 101 return 0; 102 } 103 104 static inline void bioset_integrity_free(struct bio_set *bs) 105 { 106 } 107 108 static inline int bio_integrity_map_user(struct bio *bio, struct iov_iter *iter) 109 { 110 return -EINVAL; 111 } 112 113 static inline int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta) 114 { 115 return -EINVAL; 116 } 117 118 static inline void bio_integrity_unmap_user(struct bio *bio) 119 { 120 } 121 122 static inline bool bio_integrity_prep(struct bio *bio) 123 { 124 return true; 125 } 126 127 static inline int bio_integrity_clone(struct bio *bio, struct bio *bio_src, 128 gfp_t gfp_mask) 129 { 130 return 0; 131 } 132 133 static inline void bio_integrity_advance(struct bio *bio, 134 unsigned int bytes_done) 135 { 136 } 137 138 static inline void bio_integrity_trim(struct bio *bio) 139 { 140 } 141 142 static inline void bio_integrity_init(void) 143 { 144 } 145 146 static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag) 147 { 148 return false; 149 } 150 151 static inline struct bio_integrity_payload * 152 bio_integrity_alloc(struct bio *bio, gfp_t gfp, unsigned int nr) 153 { 154 return ERR_PTR(-EINVAL); 155 } 156 157 static inline int bio_integrity_add_page(struct bio *bio, struct page *page, 158 unsigned int len, unsigned int offset) 159 { 160 return 0; 161 } 162 #endif /* CONFIG_BLK_DEV_INTEGRITY */ 163 #endif /* _LINUX_BIO_INTEGRITY_H */ 164