Having struct bio allows us to do more in the genrate/verify_fn, like copying a known good guard tag already available rather than calculating it. Index: linux-3.10.0-862.9.1.el7/fs/bio-integrity.c =================================================================== --- linux-3.10.0-862.9.1.el7.orig/fs/bio-integrity.c +++ linux-3.10.0-862.9.1.el7/fs/bio-integrity.c @@ -334,6 +334,8 @@ static void bio_integrity_generate(struc bix.data_size = bv->bv_len; bix.prot_buf = prot_buf; bix.sector = sector; + bix.bi_idx = i; + bix.bio = bio; generate_fn(&bix); @@ -485,6 +487,8 @@ static int bio_integrity_verify(struct b bix.data_size = bv->bv_len; bix.prot_buf = prot_buf; bix.sector = sector; + bix.bi_idx = i; + bix.bio = bio; ret = verify_fn(&bix); Index: linux-3.10.0-862.9.1.el7/include/linux/blkdev.h =================================================================== --- linux-3.10.0-862.9.1.el7.orig/include/linux/blkdev.h +++ linux-3.10.0-862.9.1.el7/include/linux/blkdev.h @@ -1699,7 +1699,9 @@ struct blk_integrity_exchg { sector_t sector; unsigned int data_size; unsigned short sector_size; + unsigned short bi_idx; const char *disk_name; + struct bio *bio; }; typedef void (integrity_set_tag_fn) (void *, void *, unsigned int);