From 83be4ac327978b0b921d4bccc647739a3b1a146a Mon Sep 17 00:00:00 2001 From: Chandra Seetharaman Date: Thu, 13 Nov 2008 23:39:14 +0000 Subject: [PATCH] --- yaml --- r: 118957 b: refs/heads/master c: 8a57dfc6f943c92b861c9a19b0c86ddcb2aba768 h: refs/heads/master i: 118955: 86b4566b4bb0a199de96b7f8985c342d583c2460 v: v3 --- [refs] | 2 +- trunk/drivers/md/dm.c | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index e0236f1bbb32..6ab971350c6b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d221d2e77696e70e94b13989ea15db2ba5b34f8e +refs/heads/master: 8a57dfc6f943c92b861c9a19b0c86ddcb2aba768 diff --git a/trunk/drivers/md/dm.c b/trunk/drivers/md/dm.c index dc25d8a07bc7..c99e4728ff41 100644 --- a/trunk/drivers/md/dm.c +++ b/trunk/drivers/md/dm.c @@ -937,16 +937,24 @@ static void dm_unplug_all(struct request_queue *q) static int dm_any_congested(void *congested_data, int bdi_bits) { - int r; - struct mapped_device *md = (struct mapped_device *) congested_data; - struct dm_table *map = dm_get_table(md); + int r = bdi_bits; + struct mapped_device *md = congested_data; + struct dm_table *map; - if (!map || test_bit(DMF_BLOCK_IO, &md->flags)) - r = bdi_bits; - else - r = dm_table_any_congested(map, bdi_bits); + atomic_inc(&md->pending); + + if (!test_bit(DMF_BLOCK_IO, &md->flags)) { + map = dm_get_table(md); + if (map) { + r = dm_table_any_congested(map, bdi_bits); + dm_table_put(map); + } + } + + if (!atomic_dec_return(&md->pending)) + /* nudge anyone waiting on suspend queue */ + wake_up(&md->wait); - dm_table_put(map); return r; }