Skip to content

Commit

Permalink
[SCSI] dm mpath: propagate target errors immediately
Browse files Browse the repository at this point in the history
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: Mike Snitzer <[email protected]>
Signed-off-by: Hannes Reinecke <[email protected]>
Acked-by: Alasdair G Kergon <[email protected]>
Signed-off-by: James Bottomley <[email protected]>
  • Loading branch information
hreinecke authored and James Bottomley committed Feb 12, 2011
1 parent 63583cc commit 751b2a7
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions drivers/md/dm-mpath.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
r = -EIO;
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;
Expand Down

0 comments on commit 751b2a7

Please sign in to comment.