Add a helper to set the seed and check flag based on useful defaults
from the profile.

Note that this includes a small behavior change, as we ow only sets the
seed if any action is set, which is fine as nothing will look at it.

Signed-off-by: Christoph Hellwig <[email protected]>
---
 block/bio-integrity-auto.c    | 14 ++------------
 block/bio-integrity.c         | 16 ++++++++++++++++
 include/linux/bio-integrity.h |  1 +
 3 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/block/bio-integrity-auto.c b/block/bio-integrity-auto.c
index 3a4141a9de0c..5345d55b9998 100644
--- a/block/bio-integrity-auto.c
+++ b/block/bio-integrity-auto.c
@@ -88,7 +88,6 @@ bool __bio_integrity_endio(struct bio *bio)
  */
 void bio_integrity_prep(struct bio *bio, unsigned int action)
 {
-       struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
        struct bio_integrity_data *bid;
 
        bid = mempool_alloc(&bid_pool, GFP_NOIO);
@@ -96,17 +95,8 @@ void bio_integrity_prep(struct bio *bio, unsigned int action)
        bid->bio = bio;
        bid->bip.bip_flags |= BIP_BLOCK_INTEGRITY;
        bio_integrity_alloc_buf(bio, action & BI_ACT_ZERO);
-
-       bip_set_seed(&bid->bip, bio->bi_iter.bi_sector);
-
-       if (action & BI_ACT_CHECK) {
-               if (bi->csum_type == BLK_INTEGRITY_CSUM_IP)
-                       bid->bip.bip_flags |= BIP_IP_CHECKSUM;
-               if (bi->csum_type)
-                       bid->bip.bip_flags |= BIP_CHECK_GUARD;
-               if (bi->flags & BLK_INTEGRITY_REF_TAG)
-                       bid->bip.bip_flags |= BIP_CHECK_REFTAG;
-       }
+       if (action & BI_ACT_CHECK)
+               bio_integrity_setup_default(bio);
 
        /* Auto-generate integrity metadata if this is a write */
        if (bio_data_dir(bio) == WRITE && bip_should_check(&bid->bip))
diff --git a/block/bio-integrity.c b/block/bio-integrity.c
index 6bdbb4ed2d1a..0e8ebe84846e 100644
--- a/block/bio-integrity.c
+++ b/block/bio-integrity.c
@@ -101,6 +101,22 @@ void bio_integrity_free_buf(struct bio_integrity_payload 
*bip)
                kfree(bvec_virt(bv));
 }
 
+void bio_integrity_setup_default(struct bio *bio)
+{
+       struct blk_integrity *bi = blk_get_integrity(bio->bi_bdev->bd_disk);
+       struct bio_integrity_payload *bip = bio_integrity(bio);
+
+       bip_set_seed(bip, bio->bi_iter.bi_sector);
+
+       if (bi->csum_type) {
+               bip->bip_flags |= BIP_CHECK_GUARD;
+               if (bi->csum_type == BLK_INTEGRITY_CSUM_IP)
+                       bip->bip_flags |= BIP_IP_CHECKSUM;
+       }
+       if (bi->flags & BLK_INTEGRITY_REF_TAG)
+               bip->bip_flags |= BIP_CHECK_REFTAG;
+}
+
 /**
  * bio_integrity_free - Free bio integrity payload
  * @bio:       bio containing bip to be freed
diff --git a/include/linux/bio-integrity.h b/include/linux/bio-integrity.h
index 276cbbdd2c9d..232b86b9bbcb 100644
--- a/include/linux/bio-integrity.h
+++ b/include/linux/bio-integrity.h
@@ -143,5 +143,6 @@ static inline int bio_integrity_add_page(struct bio *bio, 
struct page *page,
 
 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);
 
 #endif /* _LINUX_BIO_INTEGRITY_H */
-- 
2.47.3


Reply via email to