]> err.no Git - linux-2.6/commitdiff
dm: split dm_suspend io_lock hold into two
authorMilan Broz <mbroz@redhat.com>
Fri, 8 Feb 2008 02:10:27 +0000 (02:10 +0000)
committerAlasdair G Kergon <agk@redhat.com>
Fri, 8 Feb 2008 02:10:27 +0000 (02:10 +0000)
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

index 5191954a18b2f92f607ae99a0dd46fb05ed47d42..11f422ecfda000a6ee35ead97dbf8d4c0d433e08 100644 (file)
@@ -1434,9 +1434,11 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags)
 
        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, unsigned suspend_flags)
                r = -EINTR;
                goto out; /* pushback list is already flushed, so skip flush */
        }
-       up_write(&md->io_lock);
 
        dm_table_postsuspend_targets(map);