drivers/md/raid1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
From: Yu Kuai <yukuai3@huawei.com>
If writemostly is enabled, alloc_behind_master_bio() will allocate a new
bio for rdev, with bi_opf set to 0. Later, raid1_write_request() will
clone from this bio, hence bi_opf is still 0 for the cloned bio. Submit
this cloned bio will end up to be read, causing write data lost.
Fix this problem by inheriting bi_opf from original bio for
behind_mast_bio.
Fixes: e879a0d9cb08 ("md/raid1,raid10: don't ignore IO flags")
Reported-and-tested-by: Ian Dall <ian@beware.dropbear.id.au>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220507
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
drivers/md/raid1.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index f8434049f9b1..f391fd56d67f 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1225,7 +1225,7 @@ static void alloc_behind_master_bio(struct r1bio *r1_bio,
int i = 0;
struct bio *behind_bio = NULL;
- behind_bio = bio_alloc_bioset(NULL, vcnt, 0, GFP_NOIO,
+ behind_bio = bio_alloc_bioset(NULL, vcnt, bio->bi_opf, GFP_NOIO,
&r1_bio->mddev->bio_set);
/* discard op, we don't support writezero/writesame yet */
--
2.39.2
在 2025/9/3 9:41, Yu Kuai 写道: > From: Yu Kuai <yukuai3@huawei.com> > > If writemostly is enabled, alloc_behind_master_bio() will allocate a new > bio for rdev, with bi_opf set to 0. Later, raid1_write_request() will > clone from this bio, hence bi_opf is still 0 for the cloned bio. Submit > this cloned bio will end up to be read, causing write data lost. > > Fix this problem by inheriting bi_opf from original bio for > behind_mast_bio. > > Fixes: e879a0d9cb08 ("md/raid1,raid10: don't ignore IO flags") > Reported-and-tested-by: Ian Dall <ian@beware.dropbear.id.au> > Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220507 > Signed-off-by: Yu Kuai <yukuai3@huawei.com> > --- > drivers/md/raid1.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c > index f8434049f9b1..f391fd56d67f 100644 > --- a/drivers/md/raid1.c > +++ b/drivers/md/raid1.c > @@ -1225,7 +1225,7 @@ static void alloc_behind_master_bio(struct r1bio *r1_bio, > int i = 0; > struct bio *behind_bio = NULL; > > - behind_bio = bio_alloc_bioset(NULL, vcnt, 0, GFP_NOIO, > + behind_bio = bio_alloc_bioset(NULL, vcnt, bio->bi_opf, GFP_NOIO, > &r1_bio->mddev->bio_set); > > /* discard op, we don't support writezero/writesame yet */ LGTM Reviewed-by: Li Nan <linan122@huawei.com> -- Thanks, Nan
© 2016 - 2025 Red Hat, Inc.