Hannes Reinecke wrote: > Sergei Shtylyov wrote: >> Hello. >> >> Hannes Reinecke wrote: >> >>> Actually, I think we have two separate issues here: >>> 1) The need of having more detailed I/O errors even in the fs layer. This >>> we've already discussed at the LSF, consensus here is to allow other >>> errors than just 'EIO'. >>> Instead of Mike's approach I would rather use existing error codes >>> here; >>> this will make the transition somewhat easier. >>> Initially I would propose to return 'ENOLINK' for a transport failure, >>> 'EIO' for a non-retryable failure on the target, and 'ENODEV' for a >>> retryable failure on the target. >> Are you sure it's not vice versa: EIO for retryable and ENODEV for >> non-retryable failures. ENODEV looks more like permanent condition to me. >> > Ok, can do. > And looking a the error numbers again, maybe we should be using 'EREMOTEIO' > for non-retryable failures. > > So we would be ending with: > > ENOLINK: transport failure > EIO: retryable remote failure > EREMOTEIO: non-retryable remote failure > And here is the corresponding patch. Compile tested only; just to give an idea of the possible implementation. I have decided to pass the I/O failure information in-line: - scsi_check_sense() might now return 'TARGET_ERROR' to signal a permanent error - scsi_decide_disposition() sets the driver byte of the result field to 'DID_TARGET_FAILURE' if a return code of 'TARGET_ERROR' is encountered. - scsi_io_completion() sets the error to ENOLINK for DID_TRANSPORT_FAILFAST, EREMOTEIO for DID_TARGET_FAILURE, and EIO for any other error. It also resets DID_TARGET_FAILURE back to DID_OK once the error code is set. I'm not 100% happy with this patch; DID_TARGET_FAILURE is really just a communication vehicle to signal the permanent target failure. I looked at passing this information directly via an explicit argument to scsi_finish_command(), but this would include changing scsi_io_completion(), too. As both of them are exported / public interfaces I didn't like modifying them. Another possibility would be to re-use / redefine the 'DRIVER_' bits; they don't seem to be used a the moment. Eg 'DRIVER_HARD' for permanent errors, DRIVER_SOFT for link failures. Opinions welcome. Cheers, Hannes -- Dr. Hannes Reinecke zSeries & Storage hare@suse.de +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Markus Rex, HRB 16746 (AG Nürnberg)