Commit da6c5c720c52cc717124f8f0830b710ea6a092fd
Committed by
Jens Axboe
1 parent
80a761fd33
Exists in
master
and in
4 other branches
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>
Showing 3 changed files with 4 additions and 21 deletions Side-by-side Diff
block/blk-merge.c
... | ... | @@ -380,12 +380,6 @@ |
380 | 380 | if (blk_integrity_rq(req) != blk_integrity_rq(next)) |
381 | 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 | 384 | * If we are allowed to merge, then append bio list |
391 | 385 | * from next to rq and release next. merge_requests_fn |
block/elevator.c
... | ... | @@ -100,19 +100,6 @@ |
100 | 100 | if (bio_integrity(bio) != blk_integrity_rq(rq)) |
101 | 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 | 103 | if (!elv_iosched_allow_merge(rq, bio)) |
117 | 104 | return 0; |
118 | 105 |
drivers/scsi/scsi_lib.c
... | ... | @@ -897,8 +897,10 @@ |
897 | 897 | if (driver_byte(result) & DRIVER_SENSE) |
898 | 898 | scsi_print_sense("", cmd); |
899 | 899 | } |
900 | - blk_end_request_all(req, -EIO); | |
901 | - scsi_next_command(cmd); | |
900 | + if (blk_end_request_err(req, -EIO)) | |
901 | + scsi_requeue_command(q, cmd); | |
902 | + else | |
903 | + scsi_next_command(cmd); | |
902 | 904 | break; |
903 | 905 | case ACTION_REPREP: |
904 | 906 | /* Unprep the request and put it back at the head of the queue. |