projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] device-mapper multipath: Avoid possible suspension deadlock
[deliverable/linux.git]
/
drivers
/
md
/
dm.c
diff --git
a/drivers/md/dm.c
b/drivers/md/dm.c
index 5d40555b42ba564b63d4d068761442fe98a0fdf6..bb3ad79c14d7deeabce18c00577f8add278ab51b 100644
(file)
--- a/
drivers/md/dm.c
+++ b/
drivers/md/dm.c
@@
-1055,14
+1055,17
@@
int dm_suspend(struct mapped_device *md)
if (test_bit(DMF_BLOCK_IO, &md->flags))
goto out_read_unlock;
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)
map = dm_get_table(md);
if (map)
+ /* This does not get reverted if there's an error later. */
dm_table_presuspend_targets(map);
dm_table_presuspend_targets(map);
+ error = __lock_fs(md);
+ if (error) {
+ dm_table_put(map);
+ goto out_read_unlock;
+ }
+
up_read(&md->lock);
/*
up_read(&md->lock);
/*
@@
-1121,7
+1124,6
@@
int dm_suspend(struct mapped_device *md)
return 0;
out_unfreeze:
return 0;
out_unfreeze:
- /* FIXME Undo dm_table_presuspend_targets */
__unlock_fs(md);
clear_bit(DMF_BLOCK_IO, &md->flags);
out_write_unlock:
__unlock_fs(md);
clear_bit(DMF_BLOCK_IO, &md->flags);
out_write_unlock:
This page took
0.040126 seconds
and
5
git commands to generate.