aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-mpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-mpath.c')
-rw-r--r--drivers/md/dm-mpath.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index b82d28819e2a..4b0b63c290a6 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -1283,24 +1283,22 @@ static int do_end_io(struct multipath *m, struct request *clone,
1283 if (!error && !clone->errors) 1283 if (!error && !clone->errors)
1284 return 0; /* I/O complete */ 1284 return 0; /* I/O complete */
1285 1285
1286 if (error == -EOPNOTSUPP) 1286 if (error == -EOPNOTSUPP || error == -EREMOTEIO)
1287 return error;
1288
1289 if (clone->cmd_flags & REQ_DISCARD)
1290 /*
1291 * Pass all discard request failures up.
1292 * FIXME: only fail_path if the discard failed due to a
1293 * transport problem. This requires precise understanding
1294 * of the underlying failure (e.g. the SCSI sense).
1295 */
1296 return error; 1287 return error;
1297 1288
1298 if (mpio->pgpath) 1289 if (mpio->pgpath)
1299 fail_path(mpio->pgpath); 1290 fail_path(mpio->pgpath);
1300 1291
1301 spin_lock_irqsave(&m->lock, flags); 1292 spin_lock_irqsave(&m->lock, flags);
1302 if (!m->nr_valid_paths && !m->queue_if_no_path && !__must_push_back(m)) 1293 if (!m->nr_valid_paths) {
1303 r = -EIO; 1294 if (!m->queue_if_no_path) {
1295 if (!__must_push_back(m))
1296 r = -EIO;
1297 } else {
1298 if (error == -EBADE)
1299 r = error;
1300 }
1301 }
1304 spin_unlock_irqrestore(&m->lock, flags); 1302 spin_unlock_irqrestore(&m->lock, flags);
1305 1303
1306 return r; 1304 return r;