On Wed, Jan 21, 2026 at 07:43:14AM +0100, Christoph Hellwig wrote: > Add a set of helpers for file system initiated integrity information. > These include mempool backed allocations and verifying based on a passed > in sector and size which is often available from file system completion > routines. > > Signed-off-by: Christoph Hellwig <[email protected]> > --- > block/Makefile | 2 +- > block/bio-integrity-fs.c | 81 +++++++++++++++++++++++++++++++++++ > include/linux/bio-integrity.h | 6 +++ > 3 files changed, 88 insertions(+), 1 deletion(-) > create mode 100644 block/bio-integrity-fs.c > > diff --git a/block/Makefile b/block/Makefile > index c65f4da93702..7dce2e44276c 100644 > --- a/block/Makefile > +++ b/block/Makefile > @@ -26,7 +26,7 @@ bfq-y := bfq-iosched.o > bfq-wf2q.o bfq-cgroup.o > obj-$(CONFIG_IOSCHED_BFQ) += bfq.o > > obj-$(CONFIG_BLK_DEV_INTEGRITY) += bio-integrity.o blk-integrity.o t10-pi.o \ > - bio-integrity-auto.o > + bio-integrity-auto.o bio-integrity-fs.o > obj-$(CONFIG_BLK_DEV_ZONED) += blk-zoned.o > obj-$(CONFIG_BLK_WBT) += blk-wbt.o > obj-$(CONFIG_BLK_DEBUG_FS) += blk-mq-debugfs.o > diff --git a/block/bio-integrity-fs.c b/block/bio-integrity-fs.c > new file mode 100644 > index 000000000000..c8b3c753965d > --- /dev/null > +++ b/block/bio-integrity-fs.c > @@ -0,0 +1,81 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2025 Christoph Hellwig. > + */ > +#include <linux/blk-integrity.h> > +#include <linux/bio-integrity.h> > +#include "blk.h" > + > +struct fs_bio_integrity_buf { > + struct bio_integrity_payload bip; > + struct bio_vec bvec; > +}; > + > +static struct kmem_cache *fs_bio_integrity_cache; > +static mempool_t fs_bio_integrity_pool; > + > +void fs_bio_integrity_alloc(struct bio *bio) > +{ > + struct fs_bio_integrity_buf *iib; > + unsigned int action; > + > + action = bio_integrity_action(bio); > + if (!action) > + return; > + > + iib = mempool_alloc(&fs_bio_integrity_pool, GFP_NOIO); > + bio_integrity_init(bio, &iib->bip, &iib->bvec, 1); > + > + bio_integrity_alloc_buf(bio, action & BI_ACT_ZERO); > + if (action & BI_ACT_CHECK) > + bio_integrity_setup_default(bio); > +} > + > +void fs_bio_integrity_free(struct bio *bio) > +{ > + struct bio_integrity_payload *bip = bio_integrity(bio); > + > + bio_integrity_free_buf(bip); > + mempool_free(container_of(bip, struct fs_bio_integrity_buf, bip), > + &fs_bio_integrity_pool); > + > + bio->bi_integrity = NULL; > + bio->bi_opf &= ~REQ_INTEGRITY; > +} > + > +void fs_bio_integrity_generate(struct bio *bio) > +{ > + fs_bio_integrity_alloc(bio); > + bio_integrity_generate(bio); > +} > +EXPORT_SYMBOL_GPL(fs_bio_integrity_generate); > + > +int fs_bio_integrity_verify(struct bio *bio, sector_t sector, unsigned int > size) > +{ > + struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk); > + struct bio_integrity_payload *bip = bio_integrity(bio); > + > + /* > + * Reinitialize bip->bit_iter.
s/bit_iter/bip_iter/ ? With that fixed, this looks fine to me; Reviewed-by: "Darrick J. Wong" <[email protected]> --D > + * > + * This is for use in the submitter after the driver is done with the > + * bio. Requires the submitter to remember the sector and the size. > + */ > + > + memset(&bip->bip_iter, 0, sizeof(bip->bip_iter)); > + bip->bip_iter.bi_sector = sector; > + bip->bip_iter.bi_size = bio_integrity_bytes(bi, size >> SECTOR_SHIFT); > + return blk_status_to_errno(bio_integrity_verify(bio, &bip->bip_iter)); > +} > + > +static int __init fs_bio_integrity_init(void) > +{ > + fs_bio_integrity_cache = kmem_cache_create("fs_bio_integrity", > + sizeof(struct fs_bio_integrity_buf), 0, > + SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL); > + if (mempool_init_slab_pool(&fs_bio_integrity_pool, BIO_POOL_SIZE, > + fs_bio_integrity_cache)) > + panic("fs_bio_integrity: can't create pool\n"); > + return 0; > +} > +fs_initcall(fs_bio_integrity_init); > diff --git a/include/linux/bio-integrity.h b/include/linux/bio-integrity.h > index 232b86b9bbcb..503dc9bc655d 100644 > --- a/include/linux/bio-integrity.h > +++ b/include/linux/bio-integrity.h > @@ -145,4 +145,10 @@ void bio_integrity_alloc_buf(struct bio *bio, bool > zero_buffer); > void bio_integrity_free_buf(struct bio_integrity_payload *bip); > void bio_integrity_setup_default(struct bio *bio); > > +void fs_bio_integrity_alloc(struct bio *bio); > +void fs_bio_integrity_free(struct bio *bio); > +void fs_bio_integrity_generate(struct bio *bio); > +int fs_bio_integrity_verify(struct bio *bio, sector_t sector, > + unsigned int size); > + > #endif /* _LINUX_BIO_INTEGRITY_H */ > -- > 2.47.3 > >
