Error handler default is to retry - else use DM_ERROR_IO. Rename error handler to dm_scsi_err_handler. --- diff/drivers/md/dm-hw-handler.c 2004-10-29 15:38:04.000000000 +0100 +++ source/drivers/md/dm-hw-handler.c 2004-10-29 15:39:07.000000000 +0100 @@ -149,7 +149,7 @@ return 0; } -unsigned dm_hw_handler_err(struct hw_handler *hwh, struct bio *bio) +unsigned dm_scsi_err_handler(struct hw_handler *hwh, struct bio *bio) { int sense_key, asc, ascq; @@ -173,7 +173,7 @@ case 0x0d: /* volume overflow */ case 0x0e: /* data miscompare */ case 0x0f: /* reserved - no idea either. */ - return 0; + return MP_ERROR_IO; /* For these errors it's unclear whether they * come from the device or the controller. @@ -184,14 +184,14 @@ case 0x04: /* Hardware error */ case 0x09: /* vendor specific */ case 0x0b: /* Aborted command */ - return MP_FAIL_PATH | MP_RETRY_IO; + return MP_FAIL_PATH; case 0x06: /* Unit attention - might want to decode */ if (asc == 0x04 && ascq == 0x01) /* "Unit in the process of * becoming ready" */ - return MP_RETRY_IO; - return MP_FAIL_PATH | MP_RETRY_IO; + return 0; + return MP_FAIL_PATH; /* FIXME: For Unit Not Ready we may want * to have a generic pg activation @@ -201,16 +201,16 @@ * error path? I don't think so. */ case 0x00: /* No sense */ case 0x01: /* Recovered error */ - return MP_RETRY_IO; + return 0; } } #endif /* We got no idea how to decode the other kinds of errors -> * assume generic error condition. */ - return MP_FAIL_PATH | MP_RETRY_IO; + return MP_FAIL_PATH; } EXPORT_SYMBOL(dm_register_hw_handler); EXPORT_SYMBOL(dm_unregister_hw_handler); -EXPORT_SYMBOL(dm_hw_handler_err); +EXPORT_SYMBOL(dm_scsi_err_handler); --- diff/drivers/md/dm-hw-handler.h 2004-10-29 15:38:42.000000000 +0100 +++ source/drivers/md/dm-hw-handler.h 2004-10-29 15:39:07.000000000 +0100 @@ -58,7 +58,7 @@ void dm_put_hw_handler(struct hw_handler_type *hwht); /* Default hwh_err_fn */ -unsigned dm_hw_handler_err(struct hw_handler *hwh, struct bio *bio); +unsigned dm_scsi_err_handler(struct hw_handler *hwh, struct bio *bio); /* Callback for hwh_pg_init_fn to use when complete */ void dm_pg_init_complete(struct path *path, unsigned err_flags); @@ -66,7 +66,7 @@ /* hwh_err_fn return flags */ #define MP_FAIL_PATH 1 #define MP_BYPASS_PG 2 -#define MP_RETRY_IO 4 +#define MP_ERROR_IO 4 /* Don't retry this I/O */ /* hwh_pg_init_fn return values */ #define MP_PG_INITIALISING 1 --- diff/drivers/md/dm-mpath.c 2004-10-29 15:39:01.000000000 +0100 +++ source/drivers/md/dm-mpath.c 2004-10-29 15:39:07.000000000 +0100 @@ -766,7 +766,7 @@ if (err_flags & MP_BYPASS_PG) bypass_pg(m, mpio->path->pg, 1); - if (!(err_flags & MP_RETRY_IO)) + if (err_flags & MP_ERROR_IO) return -EIO; dm_bio_restore(&mpio->details, bio);