Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da6c5c72 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

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: default avatarTejun Heo <tj@kernel.org>
Cc: Niel Lambrechts <niel.lambrechts@gmail.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 80a761fd
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -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
+0 −13
Original line number Diff line number Diff line
@@ -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;

+4 −2
Original line number Diff line number Diff line
@@ -897,7 +897,9 @@ 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);
		if (blk_end_request_err(req, -EIO))
			scsi_requeue_command(q, cmd);
		else
			scsi_next_command(cmd);
		break;
	case ACTION_REPREP: