On Sat, May 24, 2025 at 2:18 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote: > > From: Yu Kuai <yukuai3@xxxxxxxxxx> > > Currently, raid456 must perform a whole array initial recovery to build > initail xor data, then IO to the array won't have to read all the blocks > in underlying disks. > > This behavior will affect IO performance a lot, and nowadays there are > huge disks and the initial recovery can take a long time. Hence llbitmap > will support lazy initial recovery in following patches. This method is > used to check if data blocks is synced or not, if not then IO will still > have to read all blocks for raid456. Hi Kuai In function handle_stripe_dirtying, if the io is behind resync, it will force rcw. Does this interface have the same function? Regards Xiao > > Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- > drivers/md/md-bitmap.h | 1 + > drivers/md/raid5.c | 6 ++++++ > 2 files changed, 7 insertions(+) > > diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h > index 0de14d475ad3..f2d79c8a23b7 100644 > --- a/drivers/md/md-bitmap.h > +++ b/drivers/md/md-bitmap.h > @@ -99,6 +99,7 @@ struct bitmap_operations { > md_bitmap_fn *end_discard; > > sector_t (*skip_sync_blocks)(struct mddev *mddev, sector_t offset); > + bool (*blocks_synced)(struct mddev *mddev, sector_t offset); > bool (*start_sync)(struct mddev *mddev, sector_t offset, > sector_t *blocks, bool degraded); > void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks); > diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c > index 7e66a99f29af..e5d3d8facb4b 100644 > --- a/drivers/md/raid5.c > +++ b/drivers/md/raid5.c > @@ -3748,6 +3748,7 @@ static int want_replace(struct stripe_head *sh, int disk_idx) > static int need_this_block(struct stripe_head *sh, struct stripe_head_state *s, > int disk_idx, int disks) > { > + struct mddev *mddev = sh->raid_conf->mddev; > struct r5dev *dev = &sh->dev[disk_idx]; > struct r5dev *fdev[2] = { &sh->dev[s->failed_num[0]], > &sh->dev[s->failed_num[1]] }; > @@ -3762,6 +3763,11 @@ static int need_this_block(struct stripe_head *sh, struct stripe_head_state *s, > */ > return 0; > > + /* The initial recover is not done, must read everything */ > + if (mddev->bitmap_ops && mddev->bitmap_ops->blocks_synced && > + !mddev->bitmap_ops->blocks_synced(mddev, sh->sector)) > + return 1; > + > if (dev->toread || > (dev->towrite && !test_bit(R5_OVERWRITE, &dev->flags))) > /* We need this block to directly satisfy a request */ > -- > 2.39.2 >