Re: [PATCH v3 7/8] md/raid1: fix IO error at logical block size granularity

From: Xiao Ni

Date: Wed Apr 29 2026 - 22:23:12 EST


On Thu, Apr 16, 2026 at 11:55 AM <linan666@xxxxxxxxxxxxxxx> wrote:
>
> From: Li Nan <linan122@xxxxxxxxxx>
>
> RAID1 currently fixes IO error at PAGE_SIZE granularity. Fix at smaller
> granularity can handle more errors, and RAID will support logical block
> sizes larger than PAGE_SIZE in the future, where PAGE_SIZE IO will fail.
>
> Switch IO error fix granularity to logical block size.
>
> Signed-off-by: Li Nan <linan122@xxxxxxxxxx>
> Reviewed-by: Yu Kuai <yukuai@xxxxxxxxx>
> ---
> drivers/md/raid1.c | 13 ++++---------
> 1 file changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> index 724fd4f2cc3a..de8c964ca11d 100644
> --- a/drivers/md/raid1.c
> +++ b/drivers/md/raid1.c
> @@ -2116,7 +2116,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
> {
> /* Try some synchronous reads of other devices to get
> * good data, much like with normal read errors. Only
> - * read into the pages we already have so we don't
> + * read into the block we already have so we don't
> * need to re-issue the read request.
> * We don't need to freeze the array, because being in an
> * active sync request, there is no normal IO, and
> @@ -2147,13 +2147,11 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
> }
>
> while(sectors) {
> - int s = sectors;
> + int s = min_t(int, sectors, mddev->logical_block_size >> 9);
> int d = r1_bio->read_disk;
> int success = 0;
> int start;
>
> - if (s > (PAGE_SIZE>>9))
> - s = PAGE_SIZE >> 9;
> do {
> if (r1_bio->bios[d]->bi_end_io == end_sync_read) {
> /* No rcu protection needed here devices
> @@ -2192,7 +2190,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
> if (abort)
> return 0;
>
> - /* Try next page */
> + /* Try next block */
> sectors -= s;
> sect += s;
> off += s << 9;
> @@ -2390,14 +2388,11 @@ static void fix_read_error(struct r1conf *conf, struct r1bio *r1_bio)
> }
>
> while(sectors) {
> - int s = sectors;
> + int s = min_t(int, sectors, mddev->logical_block_size >> 9);
> int d = read_disk;
> int success = 0;
> int start;
>
> - if (s > (PAGE_SIZE>>9))
> - s = PAGE_SIZE >> 9;
> -
> do {
> rdev = conf->mirrors[d].rdev;
> if (rdev &&
> --
> 2.39.2
>
>

This patch looks good to me.
Reviewed-by: Xiao Ni <xni@xxxxxxxxxx>