From: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
To: Alasdair Kergon <agk@redhat.com>
Cc: device-mapper development <dm-devel@redhat.com>
Subject: [PATCH 7/9] rqdm core: refactor completion functions
Date: Fri, 16 Oct 2009 14:03:42 +0900 [thread overview]
Message-ID: <4AD7FEAE.5050603@ct.jp.nec.com> (raw)
In-Reply-To: <4AD7FC11.7030009@ct.jp.nec.com>
This patch factors out the clone completion code, dm_done(),
from dm_softirq_done(). No functional change.
This patch is a preparation for PATCH 9.
dm_done() will be used in barrier completion, which can't use and
doesn't need softirq.
The softirq_done callback needs to get a clone from given original
request but it can't in the case of barrier, where an original
request is shared by multiple clones.
On the other hand, the completion of barrier clones doesn't involve
re-submitting requests, which was the primary reason of the need for
softirq.
Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
Cc: Alasdair G Kergon <agk@redhat.com>
---
drivers/md/dm.c | 37 ++++++++++++++++++++++++-------------
1 file changed, 24 insertions(+), 13 deletions(-)
Index: 2.6.32-rc4/drivers/md/dm.c
===================================================================
--- 2.6.32-rc4.orig/drivers/md/dm.c
+++ 2.6.32-rc4/drivers/md/dm.c
@@ -844,35 +844,46 @@ static void dm_end_request(struct reques
rq_completed(md, rw, 1);
}
-/*
- * Request completion handler for request-based dm
- */
-static void dm_softirq_done(struct request *rq)
+static void dm_done(struct request *clone, int error, bool mapped)
{
- struct request *clone = rq->completion_data;
+ int r = error;
struct dm_rq_target_io *tio = clone->end_io_data;
dm_request_endio_fn rq_end_io = tio->ti->type->rq_end_io;
- int error = tio->error;
- if (!(rq->cmd_flags & REQ_FAILED) && rq_end_io)
- error = rq_end_io(tio->ti, clone, error, &tio->info);
+ if (mapped && rq_end_io)
+ r = rq_end_io(tio->ti, clone, error, &tio->info);
- if (error <= 0)
+ if (r <= 0)
/* The target wants to complete the I/O */
- dm_end_request(clone, error);
- else if (error == DM_ENDIO_INCOMPLETE)
+ dm_end_request(clone, r);
+ else if (r == DM_ENDIO_INCOMPLETE)
/* The target will handle the I/O */
return;
- else if (error == DM_ENDIO_REQUEUE)
+ else if (r == DM_ENDIO_REQUEUE)
/* The target wants to requeue the I/O */
dm_requeue_unmapped_request(clone);
else {
- DMWARN("unimplemented target endio return value: %d", error);
+ DMWARN("unimplemented target endio return value: %d", r);
BUG();
}
}
/*
+ * Request completion handler for request-based dm
+ */
+static void dm_softirq_done(struct request *rq)
+{
+ bool mapped = true;
+ struct request *clone = rq->completion_data;
+ struct dm_rq_target_io *tio = clone->end_io_data;
+
+ if (rq->cmd_flags & REQ_FAILED)
+ mapped = false;
+
+ dm_done(clone, tio->error, mapped);
+}
+
+/*
* Complete the clone and the original request with the error status
* through softirq context.
*/
next prev parent reply other threads:[~2009-10-16 5:03 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-16 4:52 [PATCH 0/9] barrier support for request-based dm Kiyoshi Ueda
2009-10-16 4:55 ` [PATCH 1/9] dm core: clean up in-flight checking Kiyoshi Ueda
2009-10-19 21:16 ` Alasdair G Kergon
2009-10-20 7:47 ` Kiyoshi Ueda
2009-10-16 4:57 ` [PATCH 2/9] rqdm core: map_request() takes clone instead of orig Kiyoshi Ueda
2009-10-16 4:58 ` [PATCH 3/9] rqdm core: alloc_rq_tio() takes gfp_mask Kiyoshi Ueda
2009-10-16 4:59 ` [PATCH 4/9] rqdm core: clean up request cloning Kiyoshi Ueda
2009-10-16 5:01 ` [PATCH 5/9] rqdm core: simplify suspend code Kiyoshi Ueda
2009-10-28 16:21 ` Alasdair G Kergon
2009-10-28 17:39 ` Alasdair G Kergon
2009-10-16 5:02 ` [PATCH 6/9] rqdm core: use md->pending for in_flight I/O counting Kiyoshi Ueda
2009-10-16 5:03 ` Kiyoshi Ueda [this message]
2009-10-16 5:05 ` [PATCH 8/9] rqdm core: move dm_end_request() Kiyoshi Ueda
2009-10-16 5:06 ` [PATCH 9/9] rqdm core: add barrier support Kiyoshi Ueda
2009-10-16 5:17 ` Kiyoshi Ueda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4AD7FEAE.5050603@ct.jp.nec.com \
--to=k-ueda@ct.jp.nec.com \
--cc=agk@redhat.com \
--cc=dm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.