From: Milan Broz Change io_locking to allow processing flush in separate thread. Because we have DMF_BLOCK_IO already set, any possible new ios are queued in dm_requests now. In the case of interrupting previous wait there can be more ios queued (we unlocked io_lock for a while) but this is safe. Signed-off-by: Milan Broz Signed-off-by: Alasdair G Kergon --- drivers/md/dm.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: linux-2.6.24/drivers/md/dm.c =================================================================== --- linux-2.6.24.orig/drivers/md/dm.c 2008-02-07 13:48:22.000000000 +0000 +++ linux-2.6.24/drivers/md/dm.c 2008-02-07 13:48:23.000000000 +0000 @@ -1434,9 +1434,11 @@ int dm_suspend(struct mapped_device *md, if (noflush) __merge_pushback_list(md); + up_write(&md->io_lock); /* were we interrupted ? */ if (pending) { + down_write(&md->io_lock); __flush_deferred_io(md); up_write(&md->io_lock); @@ -1444,7 +1446,6 @@ int dm_suspend(struct mapped_device *md, r = -EINTR; goto out; /* pushback list is already flushed, so skip flush */ } - up_write(&md->io_lock); dm_table_postsuspend_targets(map);