Commit da6c5c720c52cc717124f8f0830b710ea6a092fd

Authored by Tejun Heo
Committed by Jens Axboe
1 parent 80a761fd33

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

... ... @@ -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
... ... @@ -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.