Message ID | 20240130021843.3608859-15-yukuai1@huaweicloud.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Mike Snitzer |
Headers | show |
Series | dm-raid: fix v6.7 regressions | expand |
Hi, 在 2024/01/30 10:18, Yu Kuai 写道: > From: Yu Kuai <yukuai3@huawei.com> > > dm_suspend() already make sure that no new IO can be issued and will > wait for all dispatched IO to be done. There is no need to call > mddev_suspend() to make sure that again. > I'm about to send the final version(I hope), please let me know if anyone thinks this patch should not be included. Thanks, Kuai > Signed-off-by: Yu Kuai <yukuai3@huawei.com> > --- > drivers/md/dm-raid.c | 8 +++----- > drivers/md/md.c | 11 +++++++++++ > 2 files changed, 14 insertions(+), 5 deletions(-) > > diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c > index 5f78cc19d6f3..ed8c28952b14 100644 > --- a/drivers/md/dm-raid.c > +++ b/drivers/md/dm-raid.c > @@ -3241,7 +3241,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv) > rs->md.in_sync = 1; > > /* Has to be held on running the array */ > - mddev_suspend_and_lock_nointr(&rs->md); > + mddev_lock_nointr(&rs->md); > > /* Keep array frozen until resume. */ > md_frozen_sync_thread(&rs->md); > @@ -3829,11 +3829,9 @@ static void raid_postsuspend(struct dm_target *ti) > { > struct raid_set *rs = ti->private; > > - if (!test_and_set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) { > + if (!test_and_set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) > /* Writes have to be stopped before suspending to avoid deadlocks. */ > md_stop_writes(&rs->md); > - mddev_suspend(&rs->md, false); > - } > } > > static void attempt_restore_of_faulty_devices(struct raid_set *rs) > @@ -4091,7 +4089,7 @@ static void raid_resume(struct dm_target *ti) > mddev->ro = 0; > mddev->in_sync = 0; > md_unfrozen_sync_thread(mddev); > - mddev_unlock_and_resume(mddev); > + mddev_unlock(mddev); > } > } > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index 093abf3ce27b..e3a56a958b47 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -437,6 +437,10 @@ int mddev_suspend(struct mddev *mddev, bool interruptible) > { > int err = 0; > > + /* Array is supended from dm_suspend() for dm-raid. */ > + if (!mddev->gendisk) > + return 0; > + > /* > * hold reconfig_mutex to wait for normal io will deadlock, because > * other context can't update super_block, and normal io can rely on > @@ -488,6 +492,13 @@ EXPORT_SYMBOL_GPL(mddev_suspend); > > static void __mddev_resume(struct mddev *mddev, bool recovery_needed) > { > + /* > + * Array is supended from dm_suspend() and resumed from dm_resume() for > + * dm-raid. > + */ > + if (!mddev->gendisk) > + return; > + > lockdep_assert_not_held(&mddev->reconfig_mutex); > > mutex_lock(&mddev->suspend_mutex); >
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 5f78cc19d6f3..ed8c28952b14 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -3241,7 +3241,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv) rs->md.in_sync = 1; /* Has to be held on running the array */ - mddev_suspend_and_lock_nointr(&rs->md); + mddev_lock_nointr(&rs->md); /* Keep array frozen until resume. */ md_frozen_sync_thread(&rs->md); @@ -3829,11 +3829,9 @@ static void raid_postsuspend(struct dm_target *ti) { struct raid_set *rs = ti->private; - if (!test_and_set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) { + if (!test_and_set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) /* Writes have to be stopped before suspending to avoid deadlocks. */ md_stop_writes(&rs->md); - mddev_suspend(&rs->md, false); - } } static void attempt_restore_of_faulty_devices(struct raid_set *rs) @@ -4091,7 +4089,7 @@ static void raid_resume(struct dm_target *ti) mddev->ro = 0; mddev->in_sync = 0; md_unfrozen_sync_thread(mddev); - mddev_unlock_and_resume(mddev); + mddev_unlock(mddev); } } diff --git a/drivers/md/md.c b/drivers/md/md.c index 093abf3ce27b..e3a56a958b47 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -437,6 +437,10 @@ int mddev_suspend(struct mddev *mddev, bool interruptible) { int err = 0; + /* Array is supended from dm_suspend() for dm-raid. */ + if (!mddev->gendisk) + return 0; + /* * hold reconfig_mutex to wait for normal io will deadlock, because * other context can't update super_block, and normal io can rely on @@ -488,6 +492,13 @@ EXPORT_SYMBOL_GPL(mddev_suspend); static void __mddev_resume(struct mddev *mddev, bool recovery_needed) { + /* + * Array is supended from dm_suspend() and resumed from dm_resume() for + * dm-raid. + */ + if (!mddev->gendisk) + return; + lockdep_assert_not_held(&mddev->reconfig_mutex); mutex_lock(&mddev->suspend_mutex);