|
@@ -2638,10 +2638,16 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
|
|
|
if (dm_request_based(md))
|
|
|
flush_kthread_worker(&md->kworker);
|
|
|
|
|
|
+ /*
|
|
|
+ * Take suspend_lock so that presuspend and postsuspend methods
|
|
|
+ * do not race with internal suspend.
|
|
|
+ */
|
|
|
+ mutex_lock(&md->suspend_lock);
|
|
|
if (!dm_suspended_md(md)) {
|
|
|
dm_table_presuspend_targets(map);
|
|
|
dm_table_postsuspend_targets(map);
|
|
|
}
|
|
|
+ mutex_unlock(&md->suspend_lock);
|
|
|
|
|
|
/* dm_put_live_table must be before msleep, otherwise deadlock is possible */
|
|
|
dm_put_live_table(md, srcu_idx);
|