From: Yu Kuai <yukuai3@xxxxxxxxxx> After previous four patchset of preparatory work, this patchset impelement a new version of mddev_suspend(), the new apis: - reconfig_mutex is not required; - the weird logical that suspend array hold 'reconfig_mutex' for mddev_check_recovery() to update superblock is not needed; - the special handling, 'pers->prepare_suspend', for raid456 is not needed; - It's safe to be called at any time once mddev is allocated, and it's designed to be used from slow path where array configuration is changed; And use the new api to replace: mddev_lock mddev_suspend or not // array reconfiguration mddev_resume or not mddev_unlock With: mddev_suspend mddev_lock // array reconfiguration mddev_unlock mddev_resume However, the above change is not possible for raid5 and raid-cluster in some corner cases, and mddev_suspend/resume() is replaced with quiesce() callback, which will suspend the array as well. This patchset is tested in my VM with mdadm testsuite with loop device except for 10ddf tests(they always fail before this patchset). A lot of cleanups will be started after this patchset. Yu Kuai (29): md: use READ_ONCE/WRITE_ONCE for 'suspend_lo' and 'suspend_hi' md: use 'mddev->suspended' for is_md_suspended() md: add new helpers to suspend/resume array md: add new helpers to suspend/resume and lock/unlock array md: use new apis to suspend array for suspend_lo/hi/store() md: use new apis to suspend array for level_store() md: use new apis to suspend array for serialize_policy_store() md/dm-raid: use new apis to suspend array md/md-bitmap: use new apis to suspend array for location_store() md/raid5-cache: use READ_ONCE/WRITE_ONCE for 'conf->log' md/raid5-cache: use new apis to suspend array for r5c_disable_writeback_async() md/raid5-cache: use new apis to suspend array for r5c_journal_mode_store() md/raid5: use new apis to suspend array for raid5_store_stripe_size() md/raid5: use new apis to suspend array for raid5_store_skip_copy() md/raid5: use new apis to suspend array for raid5_store_group_thread_cnt() md/raid5: use new apis to suspend array for raid5_change_consistency_policy() md/raid5: replace suspend with quiesce() callback md: quiesce before md_kick_rdev_from_array() for md-cluster md: use new apis to suspend array for ioctls involed array reconfiguration md: use new apis to suspend array for adding/removing rdev from state_store() md: use new apis to suspend array for bind_rdev_to_array() md: use new apis to suspend array related to serial pool in state_store() md: use new apis to suspend array in backlog_store() md: suspend array in md_start_sync() if array need reconfiguration md: cleanup mddev_create/destroy_serial_pool() md/md-linear: cleanup linear_add() md: remove mddev_suspend() and mddev_resume() md/raid5: Revert "md/raid5: fix a deadlock in the case that reshape is interrupted" md: Revert "md: add a new api prepare_suspend() in md_personality" drivers/md/dm-raid.c | 12 +- drivers/md/md-autodetect.c | 4 +- drivers/md/md-bitmap.c | 18 ++- drivers/md/md-linear.c | 2 - drivers/md/md.c | 267 ++++++++++++++++++++++--------------- drivers/md/md.h | 57 ++++++-- drivers/md/raid5-cache.c | 65 +++++---- drivers/md/raid5.c | 100 +++----------- 8 files changed, 267 insertions(+), 258 deletions(-) -- 2.39.2