Re: [PATCH v3 7/8] md/raid1: fix IO error at logical block size granularity
Xiao Ni <[email protected]>
| Newsgroups | gmane.linux.raid,gmane.linux.kernel |
|---|---|
| Message-ID | <CALTww28niren-AYKU3XEaAtz+Sa_CP7rHboittWymYudbDWRGQ@mail.gmail.com> |
On Thu, Apr 16, 2026 at 11:55 AM <[email protected]> wrote: > > From: Li Nan <[email protected]> > > 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 <[email protected]> > Reviewed-by: Yu Kuai <[email protected]> > --- > 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 <[email protected]>