diff options
author | Milan Broz <mbroz@redhat.com> | 2008-02-08 02:10:27 +0000 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2008-02-08 02:10:27 +0000 |
commit | 94d6351e147231b2c5a9512d69693ee8ac0c204d (patch) | |
tree | a0b5c1935077c1bf40db1945c5f30e8d8a9a47a2 | |
parent | 73d410c0137f63c6597e9763c81e5f4d015e9940 (diff) |
dm: split dm_suspend io_lock hold into two
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>
-rw-r--r-- | drivers/md/dm.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 5191954a18b..11f422ecfda 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -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); |