[PATCH] md: factor out cloned bio cleanup into md_free_bio()
Abd-Alrhman Masalkhi <[email protected]>
| Newsgroups | gmane.linux.raid,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
Refactor duplicated cloned bio completion and cleanup logic into a new helper, md_free_bio(). md_end_clone_io() and md_free_cloned_bio() previously shared nearly identical teardown code, differing only in whether the original bio’s endio callback was invoked. Introduce a boolean parameter orig_endio to control this behavior and consolidate the logic. Signed-off-by: Abd-Alrhman Masalkhi <[email protected]> --- drivers/md/md.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index ac71640ff3a8..707d605fee61 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9208,7 +9208,7 @@ static void md_bitmap_end(struct mddev *mddev, struct md_io_clone *md_io_clone) fn(mddev, md_io_clone->offset, md_io_clone->sectors); } -static void md_end_clone_io(struct bio *bio) +static void md_free_bio(struct bio *bio, bool orig_endio) { struct md_io_clone *md_io_clone = bio->bi_private; struct bio *orig_bio = md_io_clone->orig_bio; @@ -9224,10 +9224,16 @@ static void md_end_clone_io(struct bio *bio) bio_end_io_acct(orig_bio, md_io_clone->start_time); bio_put(bio); - bio_endio(orig_bio); + if (orig_endio) + bio_endio(orig_bio); percpu_ref_put(&mddev->active_io); } +static void md_end_clone_io(struct bio *bio) +{ + md_free_bio(bio, true); +} + static void md_clone_bio(struct mddev *mddev, struct bio **bio) { struct block_device *bdev = (*bio)->bi_bdev; @@ -9262,21 +9268,7 @@ EXPORT_SYMBOL_GPL(md_account_bio); void md_free_cloned_bio(struct bio *bio) { - struct md_io_clone *md_io_clone = bio->bi_private; - struct bio *orig_bio = md_io_clone->orig_bio; - struct mddev *mddev = md_io_clone->mddev; - - if (bio_data_dir(orig_bio) == WRITE && md_bitmap_enabled(mddev, false)) - md_bitmap_end(mddev, md_io_clone); - - if (bio->bi_status && !orig_bio->bi_status) - orig_bio->bi_status = bio->bi_status; - - if (md_io_clone->start_time) - bio_end_io_acct(orig_bio, md_io_clone->start_time); - - bio_put(bio); - percpu_ref_put(&mddev->active_io); + md_free_bio(bio, false); } EXPORT_SYMBOL_GPL(md_free_cloned_bio); -- 2.43.0