On Tue, Nov 5, 2024 at 4:14 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote: > > Hi, > > 在 2024/11/05 15:57, Xiao Ni 写道: > > One customer reports a bug: raid5 is hung when changing thread cnt > > while resync is running. The stripes are all in conf->handle_list > > and new threads can't handle them. > > > > Commit b39f35ebe86d ("md: don't quiesce in mddev_suspend()") removes > > pers->quiesce from mddev_suspend/resume, then we can't guarantee sync > > requests finish in suspend operation. One personality knows itself the > > best. So pers->quiesce is a proper way to let personality quiesce. > > Do you mean that other than normal IO, raid5 expects sync IO to be done > as well by mddev_suspend()? If so, we'd better add some comments as > well. Hi Kuai Yes, before patch b39f35ebe86d, mddev suspend can guarantee all io (normal io from filesystem and sync requests) finish. And raid5 conf->handle_list have normal io and sync io, so it should wait all these io finish in suspend operation. I'll add more comments. Regards Xiao > > Thanks, > Kuai > > > > > Fixes: b39f35ebe86d ("md: don't quiesce in mddev_suspend()") > > Signed-off-by: Xiao Ni <xni@xxxxxxxxxx> > > --- > > drivers/md/md.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/drivers/md/md.c b/drivers/md/md.c > > index 67108c397c5a..7409ecb2df68 100644 > > --- a/drivers/md/md.c > > +++ b/drivers/md/md.c > > @@ -482,6 +482,9 @@ int mddev_suspend(struct mddev *mddev, bool interruptible) > > return err; > > } > > > > + if (mddev->pers) > > + mddev->pers->quiesce(mddev, 1); > > + > > /* > > * For raid456, io might be waiting for reshape to make progress, > > * allow new reshape to start while waiting for io to be done to > > @@ -514,6 +517,9 @@ static void __mddev_resume(struct mddev *mddev, bool recovery_needed) > > percpu_ref_resurrect(&mddev->active_io); > > wake_up(&mddev->sb_wait); > > > > + if (mddev->pers) > > + mddev->pers->quiesce(mddev, 0); > > + > > if (recovery_needed) > > set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); > > md_wakeup_thread(mddev->thread); > > >