aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2009-09-11 08:26:40 -0400
committerJens Axboe <jens.axboe@oracle.com>2009-09-11 08:33:30 -0400
commitda6c5c720c52cc717124f8f0830b710ea6a092fd (patch)
treef54c880aec9289895721e707d4b22e456b277127 /block
parent80a761fd33cf812f771e212139157bf8f58d4b3f (diff)
scsi,block: update SCSI to handle mixed merge failures
Update scsi_io_completion() such that it only fails requests till the next error boundary and retry the leftover. This enables block layer to merge requests with different failfast settings and still behave correctly on errors. Allow merge of requests of different failfast settings. As SCSI is currently the only subsystem which follows failfast status, there's no need to worry about other block drivers for now. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Niel Lambrechts <niel.lambrechts@gmail.com> Cc: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block')
-rw-r--r--block/blk-merge.c6
-rw-r--r--block/elevator.c13
2 files changed, 0 insertions, 19 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c
index 7c9ca01baa45..b0de8574fdc8 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -380,12 +380,6 @@ static int attempt_merge(struct request_queue *q, struct request *req,
380 if (blk_integrity_rq(req) != blk_integrity_rq(next)) 380 if (blk_integrity_rq(req) != blk_integrity_rq(next))
381 return 0; 381 return 0;
382 382
383 /* don't merge requests of different failfast settings */
384 if (blk_failfast_dev(req) != blk_failfast_dev(next) ||
385 blk_failfast_transport(req) != blk_failfast_transport(next) ||
386 blk_failfast_driver(req) != blk_failfast_driver(next))
387 return 0;
388
389 /* 383 /*
390 * If we are allowed to merge, then append bio list 384 * If we are allowed to merge, then append bio list
391 * from next to rq and release next. merge_requests_fn 385 * from next to rq and release next. merge_requests_fn
diff --git a/block/elevator.c b/block/elevator.c
index 2d511f9105e1..ca861927ba41 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -100,19 +100,6 @@ int elv_rq_merge_ok(struct request *rq, struct bio *bio)
100 if (bio_integrity(bio) != blk_integrity_rq(rq)) 100 if (bio_integrity(bio) != blk_integrity_rq(rq))
101 return 0; 101 return 0;
102 102
103 /*
104 * Don't merge if failfast settings don't match.
105 *
106 * FIXME: The negation in front of each condition is necessary
107 * because bio and request flags use different bit positions
108 * and the accessors return those bits directly. This
109 * ugliness will soon go away.
110 */
111 if (!bio_failfast_dev(bio) != !blk_failfast_dev(rq) ||
112 !bio_failfast_transport(bio) != !blk_failfast_transport(rq) ||
113 !bio_failfast_driver(bio) != !blk_failfast_driver(rq))
114 return 0;
115
116 if (!elv_iosched_allow_merge(rq, bio)) 103 if (!elv_iosched_allow_merge(rq, bio))
117 return 0; 104 return 0;
118 105