linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] scsi: More detailed I/O errors
@ 2013-06-05  7:10 Hannes Reinecke
  2013-06-05  7:10 ` [PATCH 1/3] scsi: Document enhanced error codes Hannes Reinecke
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Hannes Reinecke @ 2013-06-05  7:10 UTC (permalink / raw)
  To: James Bottomley
  Cc: linux-scsi, Dave Chinner, Theodore T'so, linux-fsdevel,
	Hannes Reinecke

As discussed at LSF the SCSI stack already knows about several
error conditions, it's just not well documented.
Also there are some more conditions upper layers might be
interested in.

This patchset improves the documentation of the existing
I/O error codes and adds two more error codes, ENOSPC
for thin provisioning failure and ENODATA for medium error.

Hannes Reinecke (3):
  scsi: Document enhanced error codes
  scsi: Return ENOSPC on thin provisioning failure
  scsi: Return ENODATA on medium error

 drivers/scsi/scsi_error.c | 26 ++++++++++++++++++++++----
 drivers/scsi/scsi_lib.c   | 21 +++++++++++++++++++++
 include/scsi/scsi.h       |  4 ++++
 3 files changed, 47 insertions(+), 4 deletions(-)

-- 
1.7.12.4


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] scsi: Document enhanced error codes
  2013-06-05  7:10 [PATCH 0/3] scsi: More detailed I/O errors Hannes Reinecke
@ 2013-06-05  7:10 ` Hannes Reinecke
  2013-06-06  5:49   ` Ren Mingxin
  2013-06-05  7:11 ` [PATCH 2/3] scsi: Return ENOSPC on thin provisioning failure Hannes Reinecke
  2013-06-05  7:11 ` [PATCH 3/3] scsi: Return ENODATA on medium error Hannes Reinecke
  2 siblings, 1 reply; 9+ messages in thread
From: Hannes Reinecke @ 2013-06-05  7:10 UTC (permalink / raw)
  To: James Bottomley
  Cc: linux-scsi, Dave Chinner, Theodore T'so, linux-fsdevel,
	Hannes Reinecke

Document the various error codes returned on I/O failure.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/scsi_error.c |  7 +++++--
 drivers/scsi/scsi_lib.c   | 11 +++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index f43de1e..443b0e3 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -229,8 +229,11 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
  * scsi_check_sense - Examine scsi cmd sense
  * @scmd:	Cmd to have sense checked.
  *
- * Return value:
- *	SUCCESS or FAILED or NEEDS_RETRY or TARGET_ERROR
+ * Possible return values:
+ *	SUCCESS
+ *	FAILED
+ *	NEEDS_RETRY
+ *	TARGET_ERROR
  *
  * Notes:
  *	When a deferred error is detected the current command has
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 86d5220..12bfa73 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -700,6 +700,17 @@ void scsi_release_buffers(struct scsi_cmnd *cmd)
 }
 EXPORT_SYMBOL(scsi_release_buffers);
 
+/**
+ * __scsi_error_from_host_byte - translate SCSI error code into errno
+ * @cmd:	SCSI command (unused)
+ * @result:	scsi error code
+ *
+ * Translate SCSI error code into standard UNIX errno.
+ * Return values:
+ * -ENOLINK	temporary transport failure
+ * -EREMOTEIO	permanent target failure, do not retry
+ * -EBADE	permanent nexus failure, retry on other path
+ */
 static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
 {
 	int error = 0;
-- 
1.7.12.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] scsi: Return ENOSPC on thin provisioning failure
  2013-06-05  7:10 [PATCH 0/3] scsi: More detailed I/O errors Hannes Reinecke
  2013-06-05  7:10 ` [PATCH 1/3] scsi: Document enhanced error codes Hannes Reinecke
@ 2013-06-05  7:11 ` Hannes Reinecke
  2013-06-05  7:11 ` [PATCH 3/3] scsi: Return ENODATA on medium error Hannes Reinecke
  2 siblings, 0 replies; 9+ messages in thread
From: Hannes Reinecke @ 2013-06-05  7:11 UTC (permalink / raw)
  To: James Bottomley
  Cc: linux-scsi, Dave Chinner, Theodore T'so, linux-fsdevel,
	Hannes Reinecke

When the thin provisioning hard threshold is reached we
should return ENOSPC to inform upper layers about this fact.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/scsi_error.c | 12 +++++++++++-
 drivers/scsi/scsi_lib.c   |  5 +++++
 include/scsi/scsi.h       |  2 ++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 443b0e3..bf5e61a 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -234,6 +234,7 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
  *	FAILED
  *	NEEDS_RETRY
  *	TARGET_ERROR
+ *	ALLOC_ERROR
  *
  * Notes:
  *	When a deferred error is detected the current command has
@@ -359,11 +360,15 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
 		return SUCCESS;
 
 		/* these are not supported */
+	case DATA_PROTECT:
+		if (sshdr.asc == 0x27 && sshdr.ascq == 0x07) {
+			/* Thin provisioning hard threshold reached */
+			return ALLOC_ERROR;
+		}
 	case COPY_ABORTED:
 	case VOLUME_OVERFLOW:
 	case MISCOMPARE:
 	case BLANK_CHECK:
-	case DATA_PROTECT:
 		return TARGET_ERROR;
 
 	case MEDIUM_ERROR:
@@ -849,6 +854,7 @@ retry:
 		case NEEDS_RETRY:
 		case FAILED:
 		case TARGET_ERROR:
+		case ALLOC_ERROR:
 			break;
 		case ADD_TO_MLQUEUE:
 			rtn = NEEDS_RETRY;
@@ -1588,6 +1594,10 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
 			 */
 			set_host_byte(scmd, DID_TARGET_FAILURE);
 			rtn = SUCCESS;
+		} else if (rtn == ALLOC_ERROR) {
+			/* target hit out-of-space condition */
+			set_host_byte(scmd, DID_ALLOC_FAILURE);
+			rtn = SUCCESS;
 		}
 		/* if rtn == FAILED, we have no sense information;
 		 * returning FAILED will wake the error handler thread
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 12bfa73..209a4d5 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -710,6 +710,7 @@ EXPORT_SYMBOL(scsi_release_buffers);
  * -ENOLINK	temporary transport failure
  * -EREMOTEIO	permanent target failure, do not retry
  * -EBADE	permanent nexus failure, retry on other path
+ * -ENOSPC	No write space available
  */
 static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
 {
@@ -727,6 +728,10 @@ static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
 		set_host_byte(cmd, DID_OK);
 		error = -EBADE;
 		break;
+	case DID_ALLOC_FAILURE:
+		set_host_byte(cmd, DID_OK);
+		error = -ENOSPC;
+		break;
 	default:
 		error = -EIO;
 		break;
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
index 66216c1..5ead86b 100644
--- a/include/scsi/scsi.h
+++ b/include/scsi/scsi.h
@@ -452,6 +452,7 @@ static inline int scsi_is_wlun(unsigned int lun)
 				 * other paths */
 #define DID_NEXUS_FAILURE 0x11  /* Permanent nexus failure, retry on other
 				 * paths might yield different results */
+#define DID_ALLOC_FAILURE 0x12  /* Space allocation on the device failed */
 #define DRIVER_OK       0x00	/* Driver status                           */
 
 /*
@@ -482,6 +483,7 @@ static inline int scsi_is_wlun(unsigned int lun)
 #define SCSI_RETURN_NOT_HANDLED   0x2008
 #define FAST_IO_FAIL	0x2009
 #define TARGET_ERROR    0x200A
+#define ALLOC_ERROR     0x200B
 
 /*
  * Midlevel queue return values.
-- 
1.7.12.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] scsi: Return ENODATA on medium error
  2013-06-05  7:10 [PATCH 0/3] scsi: More detailed I/O errors Hannes Reinecke
  2013-06-05  7:10 ` [PATCH 1/3] scsi: Document enhanced error codes Hannes Reinecke
  2013-06-05  7:11 ` [PATCH 2/3] scsi: Return ENOSPC on thin provisioning failure Hannes Reinecke
@ 2013-06-05  7:11 ` Hannes Reinecke
  2013-06-06  7:52   ` Ren Mingxin
  2 siblings, 1 reply; 9+ messages in thread
From: Hannes Reinecke @ 2013-06-05  7:11 UTC (permalink / raw)
  To: James Bottomley
  Cc: linux-scsi, Dave Chinner, Theodore T'so, linux-fsdevel,
	Hannes Reinecke

When a medium error is detected the SCSI stack should return
ENODATA to the upper layers.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/scsi_error.c | 7 ++++++-
 drivers/scsi/scsi_lib.c   | 5 +++++
 include/scsi/scsi.h       | 2 ++
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index bf5e61a..2ded10a 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -235,6 +235,7 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
  *	NEEDS_RETRY
  *	TARGET_ERROR
  *	ALLOC_ERROR
+ *	MEDIA_FAILURE
  *
  * Notes:
  *	When a deferred error is detected the current command has
@@ -375,7 +376,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
 		if (sshdr.asc == 0x11 || /* UNRECOVERED READ ERR */
 		    sshdr.asc == 0x13 || /* AMNF DATA FIELD */
 		    sshdr.asc == 0x14) { /* RECORD NOT FOUND */
-			return TARGET_ERROR;
+			return MEDIA_FAILURE;
 		}
 		return NEEDS_RETRY;
 
@@ -1598,6 +1599,10 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
 			/* target hit out-of-space condition */
 			set_host_byte(scmd, DID_ALLOC_FAILURE);
 			rtn = SUCCESS;
+		} else if (rtn == MEDIA_FAILURE) {
+			/* medium error */
+			set_host_byte(scmd, DID_MEDIUM_ERROR);
+			rtn = SUCCESS;
 		}
 		/* if rtn == FAILED, we have no sense information;
 		 * returning FAILED will wake the error handler thread
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 209a4d5..39d626e 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -711,6 +711,7 @@ EXPORT_SYMBOL(scsi_release_buffers);
  * -EREMOTEIO	permanent target failure, do not retry
  * -EBADE	permanent nexus failure, retry on other path
  * -ENOSPC	No write space available
+ * -ENODATA	Medium error
  */
 static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
 {
@@ -732,6 +733,10 @@ static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
 		set_host_byte(cmd, DID_OK);
 		error = -ENOSPC;
 		break;
+	case DID_MEDIUM_ERROR:
+		set_host_byte(cmd, DID_OK);
+		error = -ENODATA;
+		break;
 	default:
 		error = -EIO;
 		break;
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
index 5ead86b..c397684 100644
--- a/include/scsi/scsi.h
+++ b/include/scsi/scsi.h
@@ -453,6 +453,7 @@ static inline int scsi_is_wlun(unsigned int lun)
 #define DID_NEXUS_FAILURE 0x11  /* Permanent nexus failure, retry on other
 				 * paths might yield different results */
 #define DID_ALLOC_FAILURE 0x12  /* Space allocation on the device failed */
+#define DID_MEDIUM_ERROR  0x13  /* Medium error */
 #define DRIVER_OK       0x00	/* Driver status                           */
 
 /*
@@ -484,6 +485,7 @@ static inline int scsi_is_wlun(unsigned int lun)
 #define FAST_IO_FAIL	0x2009
 #define TARGET_ERROR    0x200A
 #define ALLOC_ERROR     0x200B
+#define MEDIA_FAILURE   0x200C
 
 /*
  * Midlevel queue return values.
-- 
1.7.12.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] scsi: Document enhanced error codes
  2013-06-05  7:10 ` [PATCH 1/3] scsi: Document enhanced error codes Hannes Reinecke
@ 2013-06-06  5:49   ` Ren Mingxin
  2013-06-06  6:58     ` Hannes Reinecke
  0 siblings, 1 reply; 9+ messages in thread
From: Ren Mingxin @ 2013-06-06  5:49 UTC (permalink / raw)
  To: Hannes Reinecke
  Cc: James Bottomley, linux-scsi, Dave Chinner, Theodore T'so,
	linux-fsdevel

Hi, Hannes:

I have two questions about the comments:

On 06/05/2013 03:10 PM, Hannes Reinecke wrote:
> Document the various error codes returned on I/O failure.
>
> Signed-off-by: Hannes Reinecke<hare@suse.de>
> ---
>   drivers/scsi/scsi_error.c |  7 +++++--
>   drivers/scsi/scsi_lib.c   | 11 +++++++++++
>   2 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> index f43de1e..443b0e3 100644
> --- a/drivers/scsi/scsi_error.c
> +++ b/drivers/scsi/scsi_error.c
> @@ -229,8 +229,11 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
>    * scsi_check_sense - Examine scsi cmd sense
>    * @scmd:	Cmd to have sense checked.
>    *
> - * Return value:
> - *	SUCCESS or FAILED or NEEDS_RETRY or TARGET_ERROR
> + * Possible return values:
> + *	SUCCESS
> + *	FAILED
> + *	NEEDS_RETRY
> + *	TARGET_ERROR

This is more likely to be a historical non-update issue -
there is another possible return value 'ADD_TO_MLQUEUE' which may be
returned by the handler check_sense() or the case of this
scsi_check_sense() below, right?

     switch (sshdr.sense_key) {
     case HARDWARE_ERROR:
         if (scmd->device->retry_hwerror)
             return ADD_TO_MLQUEUE;

>
>    *
>    * Notes:
>    *	When a deferred error is detected the current command has
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 86d5220..12bfa73 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -700,6 +700,17 @@ void scsi_release_buffers(struct scsi_cmnd *cmd)
>   }
>   EXPORT_SYMBOL(scsi_release_buffers);
>
> +/**
> + * __scsi_error_from_host_byte - translate SCSI error code into errno
> + * @cmd:	SCSI command (unused)
> + * @result:	scsi error code
> + *
> + * Translate SCSI error code into standard UNIX errno.
> + * Return values:
> + * -ENOLINK	temporary transport failure
> + * -EREMOTEIO	permanent target failure, do not retry
> + * -EBADE	permanent nexus failure, retry on other path

Sorry, I'm afraid that I'm not clear why '-EIO' is not listed here...

Perhaps some of them are not necessary to document for some reasons?

Thanks,
Ren

> + */
>   static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
>   {
>   	int error = 0;


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] scsi: Document enhanced error codes
  2013-06-06  5:49   ` Ren Mingxin
@ 2013-06-06  6:58     ` Hannes Reinecke
  0 siblings, 0 replies; 9+ messages in thread
From: Hannes Reinecke @ 2013-06-06  6:58 UTC (permalink / raw)
  To: Ren Mingxin
  Cc: James Bottomley, linux-scsi, Dave Chinner, Theodore T'so,
	linux-fsdevel

On 06/06/2013 07:49 AM, Ren Mingxin wrote:
> Hi, Hannes:
>
> I have two questions about the comments:
>
> On 06/05/2013 03:10 PM, Hannes Reinecke wrote:
>> Document the various error codes returned on I/O failure.
>>
>> Signed-off-by: Hannes Reinecke<hare@suse.de>
>> ---
>>   drivers/scsi/scsi_error.c |  7 +++++--
>>   drivers/scsi/scsi_lib.c   | 11 +++++++++++
>>   2 files changed, 16 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
>> index f43de1e..443b0e3 100644
>> --- a/drivers/scsi/scsi_error.c
>> +++ b/drivers/scsi/scsi_error.c
>> @@ -229,8 +229,11 @@ static inline void scsi_eh_prt_fail_stats(struct
>> Scsi_Host *shost,
>>    * scsi_check_sense - Examine scsi cmd sense
>>    * @scmd:    Cmd to have sense checked.
>>    *
>> - * Return value:
>> - *    SUCCESS or FAILED or NEEDS_RETRY or TARGET_ERROR
>> + * Possible return values:
>> + *    SUCCESS
>> + *    FAILED
>> + *    NEEDS_RETRY
>> + *    TARGET_ERROR
>
> This is more likely to be a historical non-update issue -
> there is another possible return value 'ADD_TO_MLQUEUE' which may be
> returned by the handler check_sense() or the case of this
> scsi_check_sense() below, right?
>
>      switch (sshdr.sense_key) {
>      case HARDWARE_ERROR:
>          if (scmd->device->retry_hwerror)
>              return ADD_TO_MLQUEUE;
>
Blast. You are correct. Will be fixing it up.

>>
>>    *
>>    * Notes:
>>    *    When a deferred error is detected the current command has
>> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
>> index 86d5220..12bfa73 100644
>> --- a/drivers/scsi/scsi_lib.c
>> +++ b/drivers/scsi/scsi_lib.c
>> @@ -700,6 +700,17 @@ void scsi_release_buffers(struct scsi_cmnd *cmd)
>>   }
>>   EXPORT_SYMBOL(scsi_release_buffers);
>>
>> +/**
>> + * __scsi_error_from_host_byte - translate SCSI error code into errno
>> + * @cmd:    SCSI command (unused)
>> + * @result:    scsi error code
>> + *
>> + * Translate SCSI error code into standard UNIX errno.
>> + * Return values:
>> + * -ENOLINK    temporary transport failure
>> + * -EREMOTEIO    permanent target failure, do not retry
>> + * -EBADE    permanent nexus failure, retry on other path
>
> Sorry, I'm afraid that I'm not clear why '-EIO' is not listed here...
>
> Perhaps some of them are not necessary to document for some reasons?
>
Hmm. What with EIO being the default I've seen no need to document this.
But yes, you are right, it should be documented.

Cheers,

Hannes


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] scsi: Return ENODATA on medium error
  2013-06-05  7:11 ` [PATCH 3/3] scsi: Return ENODATA on medium error Hannes Reinecke
@ 2013-06-06  7:52   ` Ren Mingxin
  2013-06-06 14:40     ` Hannes Reinecke
  0 siblings, 1 reply; 9+ messages in thread
From: Ren Mingxin @ 2013-06-06  7:52 UTC (permalink / raw)
  To: Hannes Reinecke
  Cc: James Bottomley, linux-scsi, Dave Chinner, Theodore T'so,
	linux-fsdevel

Hi, Hannes:

On 06/05/2013 03:11 PM, Hannes Reinecke wrote:
> When a medium error is detected the SCSI stack should return
> ENODATA to the upper layers.
>
> Signed-off-by: Hannes Reinecke<hare@suse.de>
> ---
>   drivers/scsi/scsi_error.c | 7 ++++++-
>   drivers/scsi/scsi_lib.c   | 5 +++++
>   include/scsi/scsi.h       | 2 ++
>   3 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> index bf5e61a..2ded10a 100644
> --- a/drivers/scsi/scsi_error.c
> +++ b/drivers/scsi/scsi_error.c
> @@ -235,6 +235,7 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
>    *	NEEDS_RETRY
>    *	TARGET_ERROR
>    *	ALLOC_ERROR
> + *	MEDIA_FAILURE
>    *
>    * Notes:
>    *	When a deferred error is detected the current command has
> @@ -375,7 +376,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
>   		if (sshdr.asc == 0x11 || /* UNRECOVERED READ ERR */
>   		    sshdr.asc == 0x13 || /* AMNF DATA FIELD */
>   		    sshdr.asc == 0x14) { /* RECORD NOT FOUND */
> -			return TARGET_ERROR;
> +			return MEDIA_FAILURE;
>   		}
>   		return NEEDS_RETRY;
>
> @@ -1598,6 +1599,10 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
>   			/* target hit out-of-space condition */
>   			set_host_byte(scmd, DID_ALLOC_FAILURE);
>   			rtn = SUCCESS;
> +		} else if (rtn == MEDIA_FAILURE) {
> +			/* medium error */
> +			set_host_byte(scmd, DID_MEDIUM_ERROR);
> +			rtn = SUCCESS;
>   		}
>   		/* if rtn == FAILED, we have no sense information;
>   		 * returning FAILED will wake the error handler thread
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 209a4d5..39d626e 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -711,6 +711,7 @@ EXPORT_SYMBOL(scsi_release_buffers);
>    * -EREMOTEIO	permanent target failure, do not retry
>    * -EBADE	permanent nexus failure, retry on other path
>    * -ENOSPC	No write space available
> + * -ENODATA	Medium error
>    */
>   static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
>   {
> @@ -732,6 +733,10 @@ static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
>   		set_host_byte(cmd, DID_OK);
>   		error = -ENOSPC;
>   		break;
> +	case DID_MEDIUM_ERROR:
> +		set_host_byte(cmd, DID_OK);
> +		error = -ENODATA;
> +		break;

It seems that there is a debugging requirement to announce the
meaning of these new added error codes in the function
blk_update_request()like this:

diff --git a/block/blk-core.c b/block/blk-core.c
index 33c33bc..a396eb6 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -2315,6 +2315,12 @@ bool blk_update_request(struct request *req, int 
error, unsigned int nr_bytes)
                 case -EBADE:
                         error_type = "critical nexus";
                         break;
+               case -ENOSPC:
+                       error_type = "critical space allocation";
+                       break;
+               case -ENODATA:
+                       error_type = "critical medium";
+                       break;
                 case -EIO:
                 default:
                         error_type = "I/O";

# To tell the truth, I'm not understand why this patchset is needed
# in practice for I've only just got limited info about LSF. I guess
# this is one of the improvements for SCSI EH. Could you give an
# example/condition the upper layers interest in?

Thanks,
Ren

>   	default:
>   		error = -EIO;
>   		break;
> diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
> index 5ead86b..c397684 100644
> --- a/include/scsi/scsi.h
> +++ b/include/scsi/scsi.h
> @@ -453,6 +453,7 @@ static inline int scsi_is_wlun(unsigned int lun)
>   #define DID_NEXUS_FAILURE 0x11  /* Permanent nexus failure, retry on other
>   				 * paths might yield different results */
>   #define DID_ALLOC_FAILURE 0x12  /* Space allocation on the device failed */
> +#define DID_MEDIUM_ERROR  0x13  /* Medium error */
>   #define DRIVER_OK       0x00	/* Driver status                           */
>
>   /*
> @@ -484,6 +485,7 @@ static inline int scsi_is_wlun(unsigned int lun)
>   #define FAST_IO_FAIL	0x2009
>   #define TARGET_ERROR    0x200A
>   #define ALLOC_ERROR     0x200B
> +#define MEDIA_FAILURE   0x200C
>
>   /*
>    * Midlevel queue return values.


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 1/3] scsi: Document enhanced error codes
  2013-06-06  8:26 [PATCHv2 0/3] scsi: More detailed I/O errors Hannes Reinecke
@ 2013-06-06  8:26 ` Hannes Reinecke
  0 siblings, 0 replies; 9+ messages in thread
From: Hannes Reinecke @ 2013-06-06  8:26 UTC (permalink / raw)
  To: James Bottomley
  Cc: linux-scsi, Dave Chinner, Theodore T'so, linux-fsdevel,
	Ren Mingxin, Hannes Reinecke

Document the various error codes returned on I/O failure.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/scsi_error.c |  8 ++++++--
 drivers/scsi/scsi_lib.c   | 12 ++++++++++++
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index f43de1e..5319eda 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -229,8 +229,12 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
  * scsi_check_sense - Examine scsi cmd sense
  * @scmd:	Cmd to have sense checked.
  *
- * Return value:
- *	SUCCESS or FAILED or NEEDS_RETRY or TARGET_ERROR
+ * Possible return values:
+ *	SUCCESS
+ *	FAILED
+ *	NEEDS_RETRY
+ *	TARGET_ERROR
+ *	ADD_TO_MLQUEUE
  *
  * Notes:
  *	When a deferred error is detected the current command has
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 86d5220..9bfee08 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -700,6 +700,18 @@ void scsi_release_buffers(struct scsi_cmnd *cmd)
 }
 EXPORT_SYMBOL(scsi_release_buffers);
 
+/**
+ * __scsi_error_from_host_byte - translate SCSI error code into errno
+ * @cmd:	SCSI command (unused)
+ * @result:	scsi error code
+ *
+ * Translate SCSI error code into standard UNIX errno.
+ * Return values:
+ * -ENOLINK	temporary transport failure
+ * -EREMOTEIO	permanent target failure, do not retry
+ * -EBADE	permanent nexus failure, retry on other path
+ * -EIO		unclassified I/O error
+ */
 static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
 {
 	int error = 0;
-- 
1.7.12.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] scsi: Return ENODATA on medium error
  2013-06-06  7:52   ` Ren Mingxin
@ 2013-06-06 14:40     ` Hannes Reinecke
  0 siblings, 0 replies; 9+ messages in thread
From: Hannes Reinecke @ 2013-06-06 14:40 UTC (permalink / raw)
  To: Ren Mingxin
  Cc: James Bottomley, linux-scsi, Dave Chinner, Theodore T'so,
	linux-fsdevel

On 06/06/2013 09:52 AM, Ren Mingxin wrote:
> Hi, Hannes:
> 
> On 06/05/2013 03:11 PM, Hannes Reinecke wrote:
>> When a medium error is detected the SCSI stack should return
>> ENODATA to the upper layers.
>>
>> Signed-off-by: Hannes Reinecke<hare@suse.de>
>> ---
>>   drivers/scsi/scsi_error.c | 7 ++++++-
>>   drivers/scsi/scsi_lib.c   | 5 +++++
>>   include/scsi/scsi.h       | 2 ++
>>   3 files changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
>> index bf5e61a..2ded10a 100644
>> --- a/drivers/scsi/scsi_error.c
>> +++ b/drivers/scsi/scsi_error.c
>> @@ -235,6 +235,7 @@ static inline void
>> scsi_eh_prt_fail_stats(struct Scsi_Host *shost,
>>    *    NEEDS_RETRY
>>    *    TARGET_ERROR
>>    *    ALLOC_ERROR
>> + *    MEDIA_FAILURE
>>    *
>>    * Notes:
>>    *    When a deferred error is detected the current command has
>> @@ -375,7 +376,7 @@ static int scsi_check_sense(struct scsi_cmnd
>> *scmd)
>>           if (sshdr.asc == 0x11 || /* UNRECOVERED READ ERR */
>>               sshdr.asc == 0x13 || /* AMNF DATA FIELD */
>>               sshdr.asc == 0x14) { /* RECORD NOT FOUND */
>> -            return TARGET_ERROR;
>> +            return MEDIA_FAILURE;
>>           }
>>           return NEEDS_RETRY;
>>
>> @@ -1598,6 +1599,10 @@ int scsi_decide_disposition(struct
>> scsi_cmnd *scmd)
>>               /* target hit out-of-space condition */
>>               set_host_byte(scmd, DID_ALLOC_FAILURE);
>>               rtn = SUCCESS;
>> +        } else if (rtn == MEDIA_FAILURE) {
>> +            /* medium error */
>> +            set_host_byte(scmd, DID_MEDIUM_ERROR);
>> +            rtn = SUCCESS;
>>           }
>>           /* if rtn == FAILED, we have no sense information;
>>            * returning FAILED will wake the error handler thread
>> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
>> index 209a4d5..39d626e 100644
>> --- a/drivers/scsi/scsi_lib.c
>> +++ b/drivers/scsi/scsi_lib.c
>> @@ -711,6 +711,7 @@ EXPORT_SYMBOL(scsi_release_buffers);
>>    * -EREMOTEIO    permanent target failure, do not retry
>>    * -EBADE    permanent nexus failure, retry on other path
>>    * -ENOSPC    No write space available
>> + * -ENODATA    Medium error
>>    */
>>   static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd,
>> int result)
>>   {
>> @@ -732,6 +733,10 @@ static int __scsi_error_from_host_byte(struct
>> scsi_cmnd *cmd, int result)
>>           set_host_byte(cmd, DID_OK);
>>           error = -ENOSPC;
>>           break;
>> +    case DID_MEDIUM_ERROR:
>> +        set_host_byte(cmd, DID_OK);
>> +        error = -ENODATA;
>> +        break;
> 
> It seems that there is a debugging requirement to announce the
> meaning of these new added error codes in the function
> blk_update_request()like this:
> 
> diff --git a/block/blk-core.c b/block/blk-core.c
> index 33c33bc..a396eb6 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -2315,6 +2315,12 @@ bool blk_update_request(struct request *req,
> int error, unsigned int nr_bytes)
>                 case -EBADE:
>                         error_type = "critical nexus";
>                         break;
> +               case -ENOSPC:
> +                       error_type = "critical space allocation";
> +                       break;
> +               case -ENODATA:
> +                       error_type = "critical medium";
> +                       break;
>                 case -EIO:
>                 default:
>                         error_type = "I/O";
> 
And indeed, that's true. I'll be updating the patches.

> # To tell the truth, I'm not understand why this patchset is needed
> # in practice for I've only just got limited info about LSF. I guess
> # this is one of the improvements for SCSI EH. Could you give an
> # example/condition the upper layers interest in?
> 
No, this is actually related, but independent of the SCSI EH rework.
Filesystem folks expressed their interest in these kind of errors.
'ENODATA' is especially of interest, as this mean you will _never_
get the data back. Any other type of error has at least a
theoretical chance to recover the data.

And ENOSPC needs to be differentiated, too, as this is some sort of
'temporary write error'. So when the fs is able to free-up some
space this error might actually be fixed, so it's worth inform the
filesystem about it.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-06-06 14:40 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-05  7:10 [PATCH 0/3] scsi: More detailed I/O errors Hannes Reinecke
2013-06-05  7:10 ` [PATCH 1/3] scsi: Document enhanced error codes Hannes Reinecke
2013-06-06  5:49   ` Ren Mingxin
2013-06-06  6:58     ` Hannes Reinecke
2013-06-05  7:11 ` [PATCH 2/3] scsi: Return ENOSPC on thin provisioning failure Hannes Reinecke
2013-06-05  7:11 ` [PATCH 3/3] scsi: Return ENODATA on medium error Hannes Reinecke
2013-06-06  7:52   ` Ren Mingxin
2013-06-06 14:40     ` Hannes Reinecke
  -- strict thread matches above, loose matches on Subject: below --
2013-06-06  8:26 [PATCHv2 0/3] scsi: More detailed I/O errors Hannes Reinecke
2013-06-06  8:26 ` [PATCH 1/3] scsi: Document enhanced error codes Hannes Reinecke

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).