Message ID | 20230814085108.991040-2-xueshi.hu@smartx.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | md/raid1: don't allow_barrier() before r1bio got freed | expand |
Hi, 在 2023/08/14 16:51, Xueshi Hu 写道: > After allow_barrier(), an concurrent raid1_reshape() will replace old > mempool and r1conf::raid_disks, which are necessary when freeing the > r1bio. Change the execution order of free_r1bio() and allow_barrier() so > that kernel can free r1bio safely. > > Fixes: c91114c2b89d ("md/raid1: release pending accounting for an I/O only after write-behind is also finished") This fix tag is not correct, before c91114c2b89d, allow_barrier() is still called before free_r1bio(). And this behaviour goes all the way back to Linux-2.6.12-rc2. I think it's okay just to remove the fix tag for this patch. After removing the tag, feel free to add Reviewed-by: Yu Kuai <yukuai3@huawei.com> > Signed-off-by: Xueshi Hu <xueshi.hu@smartx.com> > --- > drivers/md/raid1.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c > index dd25832eb045..dbbee0c14a5b 100644 > --- a/drivers/md/raid1.c > +++ b/drivers/md/raid1.c > @@ -313,6 +313,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)) { > @@ -323,13 +324,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); > } > > /* >
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index dd25832eb045..dbbee0c14a5b 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -313,6 +313,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)) { @@ -323,13 +324,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); } /*
After allow_barrier(), an concurrent raid1_reshape() will replace old mempool and r1conf::raid_disks, which are necessary when freeing the r1bio. Change the execution order of free_r1bio() and allow_barrier() so that kernel can free r1bio safely. Fixes: c91114c2b89d ("md/raid1: release pending accounting for an I/O only after write-behind is also finished") Signed-off-by: Xueshi Hu <xueshi.hu@smartx.com> --- drivers/md/raid1.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)