From: Xueshi Hu Date: Mon, 14 Aug 2023 13:53:54 +0000 (+0800) Subject: md/raid1: call free_r1bio() before allow_barrier() in raid_end_bio_io() X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=c5d736f548ec5aab7e877872417ac23a5c42f1fd;p=linux.git md/raid1: call free_r1bio() before allow_barrier() in raid_end_bio_io() After allow_barrier, a concurrent raid1_reshape() will replace old mempool and r1conf::raid_disks. Move allow_barrier() to the end of raid_end_bio_io(), so that r1bio can be freed safely. Reviewed-by: Yu Kuai Signed-off-by: Xueshi Hu Link: https://lore.kernel.org/r/20230814135356.1113639-2-xueshi.hu@smartx.com Signed-off-by: Song Liu --- diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index c18b7c096c8df..642c8bae0df0c 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -311,6 +311,7 @@ static void raid_end_bio_io(struct r1bio *r1_bio) { struct bio *bio = r1_bio->master_bio; struct r1conf *conf = r1_bio->mddev->private; + sector_t sector = r1_bio->sector; /* if nobody has done the final endio yet, do it now */ if (!test_and_set_bit(R1BIO_Returned, &r1_bio->state)) { @@ -321,13 +322,13 @@ static void raid_end_bio_io(struct r1bio *r1_bio) call_bio_endio(r1_bio); } + + free_r1bio(r1_bio); /* * Wake up any possible resync thread that waits for the device * to go idle. All I/Os, even write-behind writes, are done. */ - allow_barrier(conf, r1_bio->sector); - - free_r1bio(r1_bio); + allow_barrier(conf, sector); } /*