From f3ede2fc13b8a9c5b476b9a4bb382cebe52594f4 Mon Sep 17 00:00:00 2001 From: Kiyoshi Ueda Date: Tue, 16 Feb 2010 18:43:01 +0000 Subject: [PATCH] --- yaml --- r: 180583 b: refs/heads/master c: 9eef87da2a8ea4920e0d913ff977cac064b68ee0 h: refs/heads/master i: 180581: a8d99990df64daa52a7ff647471febeeb2300e85 180579: 441f88bd2f23d902d5b185a5e99c714d627a7403 180575: 340eded4e3073291ba19b0c2b1d1dbbd121946f3 v: v3 --- [refs] | 2 +- trunk/drivers/md/dm.c | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 048e3631e3d6..22d33211b024 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 558569aa9d83e016295bac77d900342908d7fd85 +refs/heads/master: 9eef87da2a8ea4920e0d913ff977cac064b68ee0 diff --git a/trunk/drivers/md/dm.c b/trunk/drivers/md/dm.c index 3167480b532c..aa4e2aa86d49 100644 --- a/trunk/drivers/md/dm.c +++ b/trunk/drivers/md/dm.c @@ -1595,10 +1595,15 @@ static int dm_prep_fn(struct request_queue *q, struct request *rq) return BLKPREP_OK; } -static void map_request(struct dm_target *ti, struct request *clone, - struct mapped_device *md) +/* + * Returns: + * 0 : the request has been processed (not requeued) + * !0 : the request has been requeued + */ +static int map_request(struct dm_target *ti, struct request *clone, + struct mapped_device *md) { - int r; + int r, requeued = 0; struct dm_rq_target_io *tio = clone->end_io_data; /* @@ -1625,6 +1630,7 @@ static void map_request(struct dm_target *ti, struct request *clone, case DM_MAPIO_REQUEUE: /* The target wants to requeue the I/O */ dm_requeue_unmapped_request(clone); + requeued = 1; break; default: if (r > 0) { @@ -1636,6 +1642,8 @@ static void map_request(struct dm_target *ti, struct request *clone, dm_kill_unmapped_request(clone, r); break; } + + return requeued; } /* @@ -1677,12 +1685,17 @@ static void dm_request_fn(struct request_queue *q) atomic_inc(&md->pending[rq_data_dir(clone)]); spin_unlock(q->queue_lock); - map_request(ti, clone, md); + if (map_request(ti, clone, md)) + goto requeued; + spin_lock_irq(q->queue_lock); } goto out; +requeued: + spin_lock_irq(q->queue_lock); + plug_and_out: if (!elv_queue_empty(q)) /* Some requests still remain, retry later */