]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
md/raid1,raid10: support narrow_write_error when badblocks is disabled
authorLi Nan <linan122@huawei.com>
Mon, 5 Jan 2026 11:02:51 +0000 (19:02 +0800)
committerYu Kuai <yukuai@fnnas.com>
Mon, 26 Jan 2026 05:16:09 +0000 (13:16 +0800)
When badblocks.shift < 0 (badblocks disabled), narrow_write_error()
return false, preventing write error handling. Since narrow_write_error()
only splits IO into smaller sizes and re-submits, it can work with
badblocks disabled.

Adjust to use the logical block size for block_sectors when badblocks is
disabled, allowing narrow_write_error() to function in this case.

Link: https://lore.kernel.org/linux-raid/20260105110300.1442509-4-linan666@huaweicloud.com
Signed-off-by: Li Nan <linan122@huawei.com>
Reviewed-by: Yu Kuai <yukuai@fnnas.com>
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
drivers/md/raid1.c
drivers/md/raid10.c

index 0c9332d557a5a8407f46fc02f7dd1f2191371bbf..c65f1bb97aa19f6a32715f349efb68afe55d7cf3 100644 (file)
@@ -2503,17 +2503,17 @@ static bool narrow_write_error(struct r1bio *r1_bio, int i)
         * We currently own a reference on the rdev.
         */
 
-       int block_sectors;
+       int block_sectors, lbs = bdev_logical_block_size(rdev->bdev) >> 9;
        sector_t sector;
        int sectors;
        int sect_to_write = r1_bio->sectors;
        bool ok = true;
 
        if (rdev->badblocks.shift < 0)
-               return false;
+               block_sectors = lbs;
+       else
+               block_sectors = roundup(1 << rdev->badblocks.shift, lbs);
 
-       block_sectors = roundup(1 << rdev->badblocks.shift,
-                               bdev_logical_block_size(rdev->bdev) >> 9);
        sector = r1_bio->sector;
        sectors = ((sector + block_sectors)
                   & ~(sector_t)(block_sectors - 1))
index 5450dda8aa342753e91f31ff90afe6e41b6ae4d4..deac7741c4908d59f3f63e5eabaf65e41ed3c49d 100644 (file)
@@ -2790,17 +2790,17 @@ static bool narrow_write_error(struct r10bio *r10_bio, int i)
         * We currently own a reference to the rdev.
         */
 
-       int block_sectors;
+       int block_sectors, lbs = bdev_logical_block_size(rdev->bdev) >> 9;
        sector_t sector;
        int sectors;
        int sect_to_write = r10_bio->sectors;
        bool ok = true;
 
        if (rdev->badblocks.shift < 0)
-               return false;
+               block_sectors = lbs;
+       else
+               block_sectors = roundup(1 << rdev->badblocks.shift, lbs);
 
-       block_sectors = roundup(1 << rdev->badblocks.shift,
-                               bdev_logical_block_size(rdev->bdev) >> 9);
        sector = r10_bio->sector;
        sectors = ((r10_bio->sector + block_sectors)
                   & ~(sector_t)(block_sectors - 1))