From fc06461eff6501ea0af7c66e12f570c29435ace2 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Fri, 8 Feb 2008 02:10:25 +0000 Subject: [PATCH] --- yaml --- r: 84569 b: refs/heads/master c: 73d410c0137f63c6597e9763c81e5f4d015e9940 h: refs/heads/master i: 84567: 3e958c675d5a51ec9a2bb0ea7900eca8b4aa203b v: v3 --- [refs] | 2 +- trunk/drivers/md/dm.c | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index 2f5bd39481f5..da1e294f0bf0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6d6f10df890df8be69edd4db32dc8ce09f311bb8 +refs/heads/master: 73d410c0137f63c6597e9763c81e5f4d015e9940 diff --git a/trunk/drivers/md/dm.c b/trunk/drivers/md/dm.c index c1ad7d77dbcd..5191954a18b2 100644 --- a/trunk/drivers/md/dm.c +++ b/trunk/drivers/md/dm.c @@ -1270,6 +1270,8 @@ static void __flush_deferred_io(struct mapped_device *md) if (__split_bio(md, c)) bio_io_error(c); } + + clear_bit(DMF_BLOCK_IO, &md->flags); } static void __merge_pushback_list(struct mapped_device *md) @@ -1355,14 +1357,16 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) { struct dm_table *map = NULL; DECLARE_WAITQUEUE(wait, current); - int r = -EINVAL; + int pending, r = 0; int do_lockfs = suspend_flags & DM_SUSPEND_LOCKFS_FLAG ? 1 : 0; int noflush = suspend_flags & DM_SUSPEND_NOFLUSH_FLAG ? 1 : 0; mutex_lock(&md->suspend_lock); - if (dm_suspended(md)) + if (dm_suspended(md)) { + r = -EINVAL; goto out_unlock; + } map = dm_get_table(md); @@ -1417,7 +1421,8 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) set_current_state(TASK_INTERRUPTIBLE); smp_mb(); - if (!atomic_read(&md->pending) || signal_pending(current)) + pending = atomic_read(&md->pending); + if (!pending || signal_pending(current)) break; io_schedule(); @@ -1431,12 +1436,12 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) __merge_pushback_list(md); /* were we interrupted ? */ - r = -EINTR; - if (atomic_read(&md->pending)) { - clear_bit(DMF_BLOCK_IO, &md->flags); + if (pending) { __flush_deferred_io(md); up_write(&md->io_lock); + unlock_fs(md); + r = -EINTR; goto out; /* pushback list is already flushed, so skip flush */ } up_write(&md->io_lock); @@ -1445,8 +1450,6 @@ int dm_suspend(struct mapped_device *md, unsigned suspend_flags) set_bit(DMF_SUSPENDED, &md->flags); - r = 0; - flush_and_out: if (r && noflush) { /* @@ -1490,8 +1493,6 @@ int dm_resume(struct mapped_device *md) goto out; down_write(&md->io_lock); - clear_bit(DMF_BLOCK_IO, &md->flags); - __flush_deferred_io(md); up_write(&md->io_lock);