aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-mpath.c
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2013-07-01 09:16:26 -0400
committerJames Bottomley <JBottomley@Parallels.com>2013-08-23 12:54:53 -0400
commit7e782af57649f8a8e943d80104c946a5cd7af7cc (patch)
tree3ad0cfe04ce16a2a07c50cdfa55a60149de50fc7 /drivers/md/dm-mpath.c
parenta9d6ceb838755c24dde8a0ca02c3378926fc63db (diff)
[SCSI] Return ENODATA on medium error
When a medium error is detected the SCSI stack should return ENODATA to the upper layers. [jejb: fix whitespace error] Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/md/dm-mpath.c')
-rw-r--r--drivers/md/dm-mpath.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index 5adede17ddf6..b759a127f9c3 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -1261,6 +1261,20 @@ static void activate_path(struct work_struct *work)
1261 pg_init_done, pgpath); 1261 pg_init_done, pgpath);
1262} 1262}
1263 1263
1264static int noretry_error(int error)
1265{
1266 switch (error) {
1267 case -EOPNOTSUPP:
1268 case -EREMOTEIO:
1269 case -EILSEQ:
1270 case -ENODATA:
1271 return 1;
1272 }
1273
1274 /* Anything else could be a path failure, so should be retried */
1275 return 0;
1276}
1277
1264/* 1278/*
1265 * end_io handling 1279 * end_io handling
1266 */ 1280 */
@@ -1284,7 +1298,7 @@ static int do_end_io(struct multipath *m, struct request *clone,
1284 if (!error && !clone->errors) 1298 if (!error && !clone->errors)
1285 return 0; /* I/O complete */ 1299 return 0; /* I/O complete */
1286 1300
1287 if (error == -EOPNOTSUPP || error == -EREMOTEIO || error == -EILSEQ) 1301 if (noretry_error(error))
1288 return error; 1302 return error;
1289 1303
1290 if (mpio->pgpath) 1304 if (mpio->pgpath)