Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 176548
b: refs/heads/master
c: 11a6824
h: refs/heads/master
v: v3
  • Loading branch information
Kiyoshi Ueda authored and Alasdair G Kergon committed Dec 10, 2009
1 parent b24258a commit 5139052
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b4324feeae304ae39e631a254d238a7d63be004b
refs/heads/master: 11a68244e16b0c35e122dd55b4e7c595e0fb67a1
37 changes: 24 additions & 13 deletions trunk/drivers/md/dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -846,34 +846,45 @@ static void dm_end_request(struct request *clone, int error)
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.
Expand Down

0 comments on commit 5139052

Please sign in to comment.