summaryrefslogtreecommitdiffstats
path: root/drivers/md/md.h
diff options
context:
space:
mode:
authorYu Kuai <yukuai3@huawei.com>2023-05-29 21:20:34 +0800
committerSong Liu <song@kernel.org>2023-07-27 00:13:28 -0700
commit6f56f0c4f1241f1694a6a9438dd4f78d4513a917 (patch)
tree3b41e3b51cf8e5c1c21a056103722137c6e367e8 /drivers/md/md.h
parent64e5e09afc14f8cc9058b0ed5c9cc4c8cd126b85 (diff)
downloadlinux-stable-6f56f0c4f1241f1694a6a9438dd4f78d4513a917.tar.gz
linux-stable-6f56f0c4f1241f1694a6a9438dd4f78d4513a917.tar.bz2
linux-stable-6f56f0c4f1241f1694a6a9438dd4f78d4513a917.zip
md: add a mutex to synchronize idle and frozen in action_store()
Currently, for idle and frozen, action_store will hold 'reconfig_mutex' and call md_reap_sync_thread() to stop sync thread, however, this will cause deadlock (explained in the next patch). In order to fix the problem, following patch will release 'reconfig_mutex' and wait on 'resync_wait', like md_set_readonly() and do_md_stop() does. Consider that action_store() will set/clear 'MD_RECOVERY_FROZEN' unconditionally, which might cause unexpected problems, for example, frozen just set 'MD_RECOVERY_FROZEN' and is still in progress, while 'idle' clear 'MD_RECOVERY_FROZEN' and new sync thread is started, which might starve in progress frozen. A mutex is added to synchronize idle and frozen from action_store(). Signed-off-by: Yu Kuai <yukuai3@huawei.com> Signed-off-by: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20230529132037.2124527-4-yukuai1@huaweicloud.com
Diffstat (limited to 'drivers/md/md.h')
-rw-r--r--drivers/md/md.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 1aef86bf3fc3..18c168bf5fab 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -535,6 +535,9 @@ struct mddev {
*/
struct list_head deleting;
+ /* Used to synchronize idle and frozen for action_store() */
+ struct mutex sync_mutex;
+
bool has_superblocks:1;
bool fail_last_dev:1;
bool serialize_policy:1;