[PATCH v2 05/10] block: introduce BIP_CLONED flag
Anuj Gupta
anuj20.g at samsung.com
Wed Jun 26 03:06:55 PDT 2024
From: Kanchan Joshi <joshi.k at samsung.com>
Set the BIP_CLONED flag when bip is cloned.
Use that flag to ensure that integrity is freed for cloned user bip.
Note that a bio may have BIO_CLONED flag set but it may still not be
sharing the integrity vecs.
Signed-off-by: Kanchan Joshi <joshi.k at samsung.com>
---
block/bio-integrity.c | 5 ++++-
include/linux/bio.h | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/block/bio-integrity.c b/block/bio-integrity.c
index 845d4038afb1..8f07c4d0fada 100644
--- a/block/bio-integrity.c
+++ b/block/bio-integrity.c
@@ -147,7 +147,8 @@ void bio_integrity_free(struct bio *bio)
struct bio_integrity_payload *bip = bio_integrity(bio);
struct bio_set *bs = bio->bi_pool;
- if (bip->bip_flags & BIP_INTEGRITY_USER)
+ if (bip->bip_flags & BIP_INTEGRITY_USER &&
+ !(bip->bip_flags & BIP_CLONED))
return;
if (bip->bip_flags & BIP_BLOCK_INTEGRITY)
kfree(bvec_virt(bip->bip_vec));
@@ -662,6 +663,8 @@ int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
bip->bip_iter = bip_src->bip_iter;
bip->bip_flags = bip_src->bip_flags & ~(BIP_BLOCK_INTEGRITY |
BIP_COPY_USER);
+ bip->bip_flags |= BIP_CLONED;
+
return 0;
}
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 818e93612947..44226fcb4d00 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -329,6 +329,7 @@ enum bip_flags {
BIP_IP_CHECKSUM = 1 << 4, /* IP checksum */
BIP_INTEGRITY_USER = 1 << 5, /* Integrity payload is user address */
BIP_COPY_USER = 1 << 6, /* Kernel bounce buffer in use */
+ BIP_CLONED = 1 << 7, /* Indicates that bip is cloned */
};
/*
--
2.25.1
More information about the Linux-nvme
mailing list