diff options
Diffstat (limited to 'drivers/md/dm-mpath.c')
-rw-r--r-- | drivers/md/dm-mpath.c | 22 |
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; |