at v6.14 163 lines 4.3 kB view raw
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 7enum 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 18struct 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 48static 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 56static 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 66static inline sector_t bip_get_seed(struct bio_integrity_payload *bip) 67{ 68 return bip->bip_iter.bi_sector; 69} 70 71static inline void bip_set_seed(struct bio_integrity_payload *bip, 72 sector_t seed) 73{ 74 bip->bip_iter.bi_sector = seed; 75} 76 77struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, gfp_t gfp, 78 unsigned int nr); 79int bio_integrity_add_page(struct bio *bio, struct page *page, unsigned int len, 80 unsigned int offset); 81int bio_integrity_map_user(struct bio *bio, struct iov_iter *iter); 82int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta); 83void bio_integrity_unmap_user(struct bio *bio); 84bool bio_integrity_prep(struct bio *bio); 85void bio_integrity_advance(struct bio *bio, unsigned int bytes_done); 86void bio_integrity_trim(struct bio *bio); 87int bio_integrity_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp_mask); 88int bioset_integrity_create(struct bio_set *bs, int pool_size); 89void bioset_integrity_free(struct bio_set *bs); 90void bio_integrity_init(void); 91 92#else /* CONFIG_BLK_DEV_INTEGRITY */ 93 94static inline struct bio_integrity_payload *bio_integrity(struct bio *bio) 95{ 96 return NULL; 97} 98 99static inline int bioset_integrity_create(struct bio_set *bs, int pool_size) 100{ 101 return 0; 102} 103 104static inline void bioset_integrity_free(struct bio_set *bs) 105{ 106} 107 108static inline int bio_integrity_map_user(struct bio *bio, struct iov_iter *iter) 109{ 110 return -EINVAL; 111} 112 113static inline int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta) 114{ 115 return -EINVAL; 116} 117 118static inline void bio_integrity_unmap_user(struct bio *bio) 119{ 120} 121 122static inline bool bio_integrity_prep(struct bio *bio) 123{ 124 return true; 125} 126 127static inline int bio_integrity_clone(struct bio *bio, struct bio *bio_src, 128 gfp_t gfp_mask) 129{ 130 return 0; 131} 132 133static inline void bio_integrity_advance(struct bio *bio, 134 unsigned int bytes_done) 135{ 136} 137 138static inline void bio_integrity_trim(struct bio *bio) 139{ 140} 141 142static inline void bio_integrity_init(void) 143{ 144} 145 146static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag) 147{ 148 return false; 149} 150 151static inline struct bio_integrity_payload * 152bio_integrity_alloc(struct bio *bio, gfp_t gfp, unsigned int nr) 153{ 154 return ERR_PTR(-EINVAL); 155} 156 157static 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 */