]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
md/raid1,raid10: strip REQ_NOWAIT from member bios
authorZheng Qixing <zhengqixing@huawei.com>
Wed, 2 Jul 2025 10:23:41 +0000 (18:23 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 9 Sep 2025 16:58:20 +0000 (18:58 +0200)
commit 5fa31c49928139fa948f078b094d80f12ed83f5f upstream.

RAID layers don't implement proper non-blocking semantics for
REQ_NOWAIT, making the flag potentially misleading when propagated
to member disks.

This patch clear REQ_NOWAIT from cloned bios in raid1/raid10. Retain
original bio's REQ_NOWAIT flag for upper layer error handling.

Maybe we can implement non-blocking I/O handling mechanisms within
RAID in future work.

Fixes: 9f346f7d4ea7 ("md/raid1,raid10: don't handle IO error for REQ_RAHEAD and REQ_NOWAIT")
Signed-off-by: Zheng Qixing <zhengqixing@huawei.com>
Link: https://lore.kernel.org/linux-raid/20250702102341.1969154-1-zhengqixing@huaweicloud.com
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/md/raid1.c
drivers/md/raid10.c

index 9581c94450a462905a87286cdf14aa970698e742..772486d7071815c6995ab984adb4a85f8c5a392c 100644 (file)
@@ -1392,7 +1392,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
        }
        read_bio = bio_alloc_clone(mirror->rdev->bdev, bio, gfp,
                                   &mddev->bio_set);
-
+       read_bio->bi_opf &= ~REQ_NOWAIT;
        r1_bio->bios[rdisk] = read_bio;
 
        read_bio->bi_iter.bi_sector = r1_bio->sector +
@@ -1613,6 +1613,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
                                wait_for_serialization(rdev, r1_bio);
                }
 
+               mbio->bi_opf &= ~REQ_NOWAIT;
                r1_bio->bios[i] = mbio;
 
                mbio->bi_iter.bi_sector = (r1_bio->sector + rdev->data_offset);
index 0d475bb2a7327f1cc761414ca8f02abd03d32f8c..6579bbb6a39a5d62c2993c69593b6c812c4242c9 100644 (file)
@@ -1218,6 +1218,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
                r10_bio->master_bio = bio;
        }
        read_bio = bio_alloc_clone(rdev->bdev, bio, gfp, &mddev->bio_set);
+       read_bio->bi_opf &= ~REQ_NOWAIT;
 
        r10_bio->devs[slot].bio = read_bio;
        r10_bio->devs[slot].rdev = rdev;
@@ -1248,6 +1249,7 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
                             conf->mirrors[devnum].rdev;
 
        mbio = bio_alloc_clone(rdev->bdev, bio, GFP_NOIO, &mddev->bio_set);
+       mbio->bi_opf &= ~REQ_NOWAIT;
        if (replacement)
                r10_bio->devs[n_copy].repl_bio = mbio;
        else