1da042a36SChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0 */
2da042a36SChristoph Hellwig #ifndef _LINUX_BIO_INTEGRITY_H
3da042a36SChristoph Hellwig #define _LINUX_BIO_INTEGRITY_H
4da042a36SChristoph Hellwig
5da042a36SChristoph Hellwig #include <linux/bio.h>
6da042a36SChristoph Hellwig
7da042a36SChristoph Hellwig enum bip_flags {
8da042a36SChristoph Hellwig BIP_BLOCK_INTEGRITY = 1 << 0, /* block layer owns integrity data */
9da042a36SChristoph Hellwig BIP_MAPPED_INTEGRITY = 1 << 1, /* ref tag has been remapped */
1018623503SAnuj Gupta BIP_DISK_NOCHECK = 1 << 2, /* disable disk integrity checking */
1118623503SAnuj Gupta BIP_IP_CHECKSUM = 1 << 3, /* IP checksum */
1218623503SAnuj Gupta BIP_COPY_USER = 1 << 4, /* Kernel bounce buffer in use */
1318623503SAnuj Gupta BIP_CHECK_GUARD = 1 << 5, /* guard check */
1418623503SAnuj Gupta BIP_CHECK_REFTAG = 1 << 6, /* reftag check */
1518623503SAnuj Gupta BIP_CHECK_APPTAG = 1 << 7, /* apptag check */
16da042a36SChristoph Hellwig };
17da042a36SChristoph Hellwig
18da042a36SChristoph Hellwig struct bio_integrity_payload {
19da042a36SChristoph Hellwig struct bvec_iter bip_iter;
20da042a36SChristoph Hellwig
21da042a36SChristoph Hellwig unsigned short bip_vcnt; /* # of integrity bio_vecs */
22da042a36SChristoph Hellwig unsigned short bip_max_vcnt; /* integrity bio_vec slots */
23da042a36SChristoph Hellwig unsigned short bip_flags; /* control flags */
243d8b5a22SKanchan Joshi u16 app_tag; /* application tag value */
25da042a36SChristoph Hellwig
26da042a36SChristoph Hellwig struct bio_vec *bip_vec;
27da042a36SChristoph Hellwig };
28da042a36SChristoph Hellwig
2918623503SAnuj Gupta #define BIP_CLONE_FLAGS (BIP_MAPPED_INTEGRITY | BIP_IP_CHECKSUM | \
302c0487d8SAnuj Gupta BIP_CHECK_GUARD | BIP_CHECK_REFTAG | BIP_CHECK_APPTAG)
315dbb3cbdSAnuj Gupta
32da042a36SChristoph Hellwig #ifdef CONFIG_BLK_DEV_INTEGRITY
33da042a36SChristoph Hellwig
34da042a36SChristoph Hellwig #define bip_for_each_vec(bvl, bip, iter) \
35da042a36SChristoph Hellwig for_each_bvec(bvl, (bip)->bip_vec, iter, (bip)->bip_iter)
36da042a36SChristoph Hellwig
37da042a36SChristoph Hellwig #define bio_for_each_integrity_vec(_bvl, _bio, _iter) \
38da042a36SChristoph Hellwig for_each_bio(_bio) \
39da042a36SChristoph Hellwig bip_for_each_vec(_bvl, _bio->bi_integrity, _iter)
40da042a36SChristoph Hellwig
bio_integrity(struct bio * bio)41da042a36SChristoph Hellwig static inline struct bio_integrity_payload *bio_integrity(struct bio *bio)
42da042a36SChristoph Hellwig {
43da042a36SChristoph Hellwig if (bio->bi_opf & REQ_INTEGRITY)
44da042a36SChristoph Hellwig return bio->bi_integrity;
45da042a36SChristoph Hellwig
46da042a36SChristoph Hellwig return NULL;
47da042a36SChristoph Hellwig }
48da042a36SChristoph Hellwig
bio_integrity_flagged(struct bio * bio,enum bip_flags flag)49da042a36SChristoph Hellwig static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
50da042a36SChristoph Hellwig {
51da042a36SChristoph Hellwig struct bio_integrity_payload *bip = bio_integrity(bio);
52da042a36SChristoph Hellwig
53da042a36SChristoph Hellwig if (bip)
54da042a36SChristoph Hellwig return bip->bip_flags & flag;
55da042a36SChristoph Hellwig
56da042a36SChristoph Hellwig return false;
57da042a36SChristoph Hellwig }
58da042a36SChristoph Hellwig
bip_get_seed(struct bio_integrity_payload * bip)59da042a36SChristoph Hellwig static inline sector_t bip_get_seed(struct bio_integrity_payload *bip)
60da042a36SChristoph Hellwig {
61da042a36SChristoph Hellwig return bip->bip_iter.bi_sector;
62da042a36SChristoph Hellwig }
63da042a36SChristoph Hellwig
bip_set_seed(struct bio_integrity_payload * bip,sector_t seed)64da042a36SChristoph Hellwig static inline void bip_set_seed(struct bio_integrity_payload *bip,
65da042a36SChristoph Hellwig sector_t seed)
66da042a36SChristoph Hellwig {
67da042a36SChristoph Hellwig bip->bip_iter.bi_sector = seed;
68da042a36SChristoph Hellwig }
69da042a36SChristoph Hellwig
70*105ca2a2SChristoph Hellwig void bio_integrity_init(struct bio *bio, struct bio_integrity_payload *bip,
71*105ca2a2SChristoph Hellwig struct bio_vec *bvecs, unsigned int nr_vecs);
72da042a36SChristoph Hellwig struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, gfp_t gfp,
73da042a36SChristoph Hellwig unsigned int nr);
74da042a36SChristoph Hellwig int bio_integrity_add_page(struct bio *bio, struct page *page, unsigned int len,
75da042a36SChristoph Hellwig unsigned int offset);
76fe8f4ca7SAnuj Gupta int bio_integrity_map_user(struct bio *bio, struct iov_iter *iter);
773d8b5a22SKanchan Joshi int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta);
7874cc1502SChristoph Hellwig void bio_integrity_unmap_user(struct bio *bio);
79da042a36SChristoph Hellwig bool bio_integrity_prep(struct bio *bio);
80da042a36SChristoph Hellwig void bio_integrity_advance(struct bio *bio, unsigned int bytes_done);
81da042a36SChristoph Hellwig void bio_integrity_trim(struct bio *bio);
82da042a36SChristoph Hellwig int bio_integrity_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp_mask);
83da042a36SChristoph Hellwig
84da042a36SChristoph Hellwig #else /* CONFIG_BLK_DEV_INTEGRITY */
85da042a36SChristoph Hellwig
bio_integrity(struct bio * bio)8621671a1eSChristoph Hellwig static inline struct bio_integrity_payload *bio_integrity(struct bio *bio)
87da042a36SChristoph Hellwig {
88da042a36SChristoph Hellwig return NULL;
89da042a36SChristoph Hellwig }
90da042a36SChristoph Hellwig
bio_integrity_map_user(struct bio * bio,struct iov_iter * iter)91546d1914SJens Axboe static inline int bio_integrity_map_user(struct bio *bio, struct iov_iter *iter)
92da042a36SChristoph Hellwig {
93da042a36SChristoph Hellwig return -EINVAL;
94da042a36SChristoph Hellwig }
95da042a36SChristoph Hellwig
bio_integrity_map_iter(struct bio * bio,struct uio_meta * meta)963d8b5a22SKanchan Joshi static inline int bio_integrity_map_iter(struct bio *bio, struct uio_meta *meta)
973d8b5a22SKanchan Joshi {
983d8b5a22SKanchan Joshi return -EINVAL;
993d8b5a22SKanchan Joshi }
1003d8b5a22SKanchan Joshi
bio_integrity_unmap_user(struct bio * bio)10174cc1502SChristoph Hellwig static inline void bio_integrity_unmap_user(struct bio *bio)
102da042a36SChristoph Hellwig {
103da042a36SChristoph Hellwig }
104da042a36SChristoph Hellwig
bio_integrity_prep(struct bio * bio)105da042a36SChristoph Hellwig static inline bool bio_integrity_prep(struct bio *bio)
106da042a36SChristoph Hellwig {
107da042a36SChristoph Hellwig return true;
108da042a36SChristoph Hellwig }
109da042a36SChristoph Hellwig
bio_integrity_clone(struct bio * bio,struct bio * bio_src,gfp_t gfp_mask)110da042a36SChristoph Hellwig static inline int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
111da042a36SChristoph Hellwig gfp_t gfp_mask)
112da042a36SChristoph Hellwig {
113da042a36SChristoph Hellwig return 0;
114da042a36SChristoph Hellwig }
115da042a36SChristoph Hellwig
bio_integrity_advance(struct bio * bio,unsigned int bytes_done)116da042a36SChristoph Hellwig static inline void bio_integrity_advance(struct bio *bio,
117da042a36SChristoph Hellwig unsigned int bytes_done)
118da042a36SChristoph Hellwig {
119da042a36SChristoph Hellwig }
120da042a36SChristoph Hellwig
bio_integrity_trim(struct bio * bio)121da042a36SChristoph Hellwig static inline void bio_integrity_trim(struct bio *bio)
122da042a36SChristoph Hellwig {
123da042a36SChristoph Hellwig }
124da042a36SChristoph Hellwig
bio_integrity_flagged(struct bio * bio,enum bip_flags flag)125da042a36SChristoph Hellwig static inline bool bio_integrity_flagged(struct bio *bio, enum bip_flags flag)
126da042a36SChristoph Hellwig {
127da042a36SChristoph Hellwig return false;
128da042a36SChristoph Hellwig }
129da042a36SChristoph Hellwig
13021671a1eSChristoph Hellwig static inline struct bio_integrity_payload *
bio_integrity_alloc(struct bio * bio,gfp_t gfp,unsigned int nr)13121671a1eSChristoph Hellwig bio_integrity_alloc(struct bio *bio, gfp_t gfp, unsigned int nr)
132da042a36SChristoph Hellwig {
133da042a36SChristoph Hellwig return ERR_PTR(-EINVAL);
134da042a36SChristoph Hellwig }
135da042a36SChristoph Hellwig
bio_integrity_add_page(struct bio * bio,struct page * page,unsigned int len,unsigned int offset)136da042a36SChristoph Hellwig static inline int bio_integrity_add_page(struct bio *bio, struct page *page,
137da042a36SChristoph Hellwig unsigned int len, unsigned int offset)
138da042a36SChristoph Hellwig {
139da042a36SChristoph Hellwig return 0;
140da042a36SChristoph Hellwig }
141da042a36SChristoph Hellwig #endif /* CONFIG_BLK_DEV_INTEGRITY */
142da042a36SChristoph Hellwig #endif /* _LINUX_BIO_INTEGRITY_H */
143