From: Milan Broz <mbroz@redhat.com>

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 <mbroz@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
---
 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);
 
