[PATCH] device-mapper multipath: Avoid possible suspension deadlock
[deliverable/linux.git] / drivers / md / dm.c
index 5d40555b42ba564b63d4d068761442fe98a0fdf6..bb3ad79c14d7deeabce18c00577f8add278ab51b 100644 (file)
@@ -1055,14 +1055,17 @@ int dm_suspend(struct mapped_device *md)
        if (test_bit(DMF_BLOCK_IO, &md->flags))
                goto out_read_unlock;
 
-       error = __lock_fs(md);
-       if (error)
-               goto out_read_unlock;
-
        map = dm_get_table(md);
        if (map)
+               /* This does not get reverted if there's an error later. */
                dm_table_presuspend_targets(map);
 
+       error = __lock_fs(md);
+       if (error) {
+               dm_table_put(map);
+               goto out_read_unlock;
+       }
+
        up_read(&md->lock);
 
        /*
@@ -1121,7 +1124,6 @@ int dm_suspend(struct mapped_device *md)
        return 0;
 
 out_unfreeze:
-       /* FIXME Undo dm_table_presuspend_targets */
        __unlock_fs(md);
        clear_bit(DMF_BLOCK_IO, &md->flags);
 out_write_unlock:
This page took 0.023929 seconds and 5 git commands to generate.