Skip to content

Commit

Permalink
scsi,block: update SCSI to handle mixed merge failures
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Niel Lambrechts <[email protected]>
Cc: James Bottomley <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
htejun authored and Jens Axboe committed Sep 11, 2009
1 parent 80a761f commit da6c5c7
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 21 deletions.
6 changes: 0 additions & 6 deletions block/blk-merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,12 +380,6 @@ static int attempt_merge(struct request_queue *q, struct request *req,
if (blk_integrity_rq(req) != blk_integrity_rq(next))
return 0;

/* don't merge requests of different failfast settings */
if (blk_failfast_dev(req) != blk_failfast_dev(next) ||
blk_failfast_transport(req) != blk_failfast_transport(next) ||
blk_failfast_driver(req) != blk_failfast_driver(next))
return 0;

/*
* If we are allowed to merge, then append bio list
* from next to rq and release next. merge_requests_fn
Expand Down
13 changes: 0 additions & 13 deletions block/elevator.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,19 +100,6 @@ int elv_rq_merge_ok(struct request *rq, struct bio *bio)
if (bio_integrity(bio) != blk_integrity_rq(rq))
return 0;

/*
* Don't merge if failfast settings don't match.
*
* FIXME: The negation in front of each condition is necessary
* because bio and request flags use different bit positions
* and the accessors return those bits directly. This
* ugliness will soon go away.
*/
if (!bio_failfast_dev(bio) != !blk_failfast_dev(rq) ||
!bio_failfast_transport(bio) != !blk_failfast_transport(rq) ||
!bio_failfast_driver(bio) != !blk_failfast_driver(rq))
return 0;

if (!elv_iosched_allow_merge(rq, bio))
return 0;

Expand Down
6 changes: 4 additions & 2 deletions drivers/scsi/scsi_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -897,8 +897,10 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
if (driver_byte(result) & DRIVER_SENSE)
scsi_print_sense("", cmd);
}
blk_end_request_all(req, -EIO);
scsi_next_command(cmd);
if (blk_end_request_err(req, -EIO))
scsi_requeue_command(q, cmd);
else
scsi_next_command(cmd);
break;
case ACTION_REPREP:
/* Unprep the request and put it back at the head of the queue.
Expand Down

0 comments on commit da6c5c7

Please sign in to comment.