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

Commit 751b2a7d authored by Hannes Reinecke's avatar Hannes Reinecke Committed by James Bottomley
Browse files

[SCSI] dm mpath: propagate target errors immediately



DM now has more information about the nature of the underlying storage
failure.  Path failure is avoided if a request failed due to a target
error.  Instead the target error is immediately passed up the stack.

Discard requests that fail due to non-target errors may now be retried.

Errors restricted to the path will be retried or returned if no
paths are available, irregarding the no_path_retry setting.

Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Acked-by: default avatarAlasdair G Kergon <agk@redhat.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 63583cca
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -1283,24 +1283,22 @@ static int do_end_io(struct multipath *m, struct request *clone,
	if (!error && !clone->errors)
		return 0;	/* I/O complete */

	if (error == -EOPNOTSUPP)
		return error;

	if (clone->cmd_flags & REQ_DISCARD)
		/*
		 * Pass all discard request failures up.
		 * FIXME: only fail_path if the discard failed due to a
		 * transport problem.  This requires precise understanding
		 * of the underlying failure (e.g. the SCSI sense).
		 */
	if (error == -EOPNOTSUPP || error == -EREMOTEIO)
		return error;

	if (mpio->pgpath)
		fail_path(mpio->pgpath);

	spin_lock_irqsave(&m->lock, flags);
	if (!m->nr_valid_paths && !m->queue_if_no_path && !__must_push_back(m))
	if (!m->nr_valid_paths) {
		if (!m->queue_if_no_path) {
			if (!__must_push_back(m))
				r = -EIO;
		} else {
			if (error == -EBADE)
				r = error;
		}
	}
	spin_unlock_irqrestore(&m->lock, flags);

	return r;