|
|
@@ -2837,8 +2837,6 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
|
|
|
|
|
|
might_sleep();
|
|
|
|
|
|
- map = dm_get_live_table(md, &srcu_idx);
|
|
|
-
|
|
|
spin_lock(&_minor_lock);
|
|
|
idr_replace(&_minor_idr, MINOR_ALLOCED, MINOR(disk_devt(dm_disk(md))));
|
|
|
set_bit(DMF_FREEING, &md->flags);
|
|
|
@@ -2852,14 +2850,14 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
|
|
|
* do not race with internal suspend.
|
|
|
*/
|
|
|
mutex_lock(&md->suspend_lock);
|
|
|
+ map = dm_get_live_table(md, &srcu_idx);
|
|
|
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);
|
|
|
+ mutex_unlock(&md->suspend_lock);
|
|
|
|
|
|
/*
|
|
|
* Rare, but there may be I/O requests still going to complete,
|