]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
block: don't free the integrity payload in bio_integrity_unmap_free_user
authorChristoph Hellwig <hch@lst.de>
Tue, 2 Jul 2024 15:10:24 +0000 (17:10 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 3 Jul 2024 16:21:16 +0000 (10:21 -0600)
Now that the integrity payload is always freed in bio_uninit, don't
bother freeing it a little earlier in bio_integrity_unmap_free_user.
With that the separate bio_integrity_unmap_free_user can go away by
just passing the bio to bio_integrity_unmap_user.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Kanchan Joshi <joshi.k@samsung.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240702151047.1746127-7-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio-integrity.c
block/blk-map.c
include/linux/bio-integrity.h

index 4aa836d603fb23cee19ecf2f63482ab5987ff33d..4b5c604585561eb2bb6031a35616838f7f49d9ae 100644 (file)
@@ -131,34 +131,25 @@ static void bio_integrity_uncopy_user(struct bio_integrity_payload *bip)
        bio_integrity_unpin_bvec(copy, nr_vecs, true);
 }
 
-static void bio_integrity_unmap_user(struct bio_integrity_payload *bip)
+/**
+ * bio_integrity_unmap_user - Unmap user integrity payload
+ * @bio:       bio containing bip to be unmapped
+ *
+ * Unmap the user mapped integrity portion of a bio.
+ */
+void bio_integrity_unmap_user(struct bio *bio)
 {
-       bool dirty = bio_data_dir(bip->bip_bio) == READ;
+       struct bio_integrity_payload *bip = bio_integrity(bio);
 
        if (bip->bip_flags & BIP_COPY_USER) {
-               if (dirty)
+               if (bio_data_dir(bio) == READ)
                        bio_integrity_uncopy_user(bip);
                kfree(bvec_virt(bip->bip_vec));
                return;
        }
 
-       bio_integrity_unpin_bvec(bip->bip_vec, bip->bip_max_vcnt, dirty);
-}
-
-/**
- * bio_integrity_unmap_free_user - Unmap and free bio user integrity payload
- * @bio:       bio containing bip to be unmapped and freed
- *
- * Description: Used to unmap and free the user mapped integrity portion of a
- * bio. Submitter attaching the user integrity buffer is responsible for
- * unmapping and freeing it during completion.
- */
-void bio_integrity_unmap_free_user(struct bio *bio)
-{
-       struct bio_integrity_payload *bip = bio_integrity(bio);
-
-       bio_integrity_unmap_user(bip);
-       bio_integrity_free(bio);
+       bio_integrity_unpin_bvec(bip->bip_vec, bip->bip_max_vcnt,
+                       bio_data_dir(bio) == READ);
 }
 
 /**
index df5f82d114720f529495d273537dad63d2171742..0e1167b239342f71b76b54d8593435eb771bb83f 100644 (file)
@@ -758,7 +758,7 @@ int blk_rq_unmap_user(struct bio *bio)
                }
 
                if (bio_integrity(bio))
-                       bio_integrity_unmap_free_user(bio);
+                       bio_integrity_unmap_user(bio);
 
                next_bio = bio;
                bio = bio->bi_next;
index 3823d9be0d0790a6ee60a242c396687dbf913836..dd831c269e9948a32ec96741f2c4fc7836fc1c99 100644 (file)
@@ -73,7 +73,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, gfp_t gfp,
 int bio_integrity_add_page(struct bio *bio, struct page *page, unsigned int len,
                unsigned int offset);
 int bio_integrity_map_user(struct bio *bio, void __user *ubuf, ssize_t len, u32 seed);
-void bio_integrity_unmap_free_user(struct bio *bio);
+void bio_integrity_unmap_user(struct bio *bio);
 bool bio_integrity_prep(struct bio *bio);
 void bio_integrity_advance(struct bio *bio, unsigned int bytes_done);
 void bio_integrity_trim(struct bio *bio);
@@ -104,7 +104,7 @@ static inline int bio_integrity_map_user(struct bio *bio, void __user *ubuf,
        return -EINVAL;
 }
 
-static inline void bio_integrity_unmap_free_user(struct bio *bio)
+static inline void bio_integrity_unmap_user(struct bio *bio)
 {
 }