[PATCH V2] nvme: make use of nvme error status codes in block layer

Guan Junxiong guanjunxiong at huawei.com
Mon Apr 17 17:32:03 PDT 2017


Hi,Jay:

On 2017/4/18 0:45, J Freyensee wrote:
> On Mon, 2017-04-17 at 21:15 +0800, Guan Junxiong wrote:
>> From: Junxiong Guan <guanjunxiong at huawei.com>
>>
>> For more detailed information about nvme error status when ending
>> blk_mq request,some of nvme error status codes can be categorized into
>> different errnos explicitly.This patch makes conversion from those nvme
>> error status to errno detail so that block layer can make use of the
>> detailed error information.
> 
> 
> This is a good list but it's not the complete list.  It also seems to be
> somewhat arbitrary list of chosen NVMe error codes to convert, with respect
> to include/linux/nvme.h, which is a little tedious to track.

You are right it's not the complete list. Actually, some of the error codes
such as NVME_SC_FIRMWARE_SLOT can not be converted to errno properly, so it
is converted to EIO by default.

> How about fold the conversion based on how the NVMe errors are grouped in
> nvme.h?  So there would be one patch for:
> 
> 	/*
> 	 * Generic Command Status:
> 	 */
> 
> one patch for:
> 
> 	/*
> 	 * Command Specific Status:
> 	 */
> 
> etc...
> 
> This would make it easier to track and maintain what NVMe errors have been
> accounted for the errno conversion between submitted patches and what is
> implemented in the code.
> 


That's a good suggestion I will alter this patch folding the conversion based
on how the NVMe errors and resubmit.

>> ---
>>  drivers/nvme/host/core.c | 29 +++++++++++++++++++++++++++++
>>  1 file changed, 29 insertions(+)
>>
>> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
>> index 9bf758e3c911..95180ac0c710 100644
>> --- a/drivers/nvme/host/core.c
>> +++ b/drivers/nvme/host/core.c
>> @@ -73,6 +73,35 @@ static int nvme_error_status(struct request *req)
>>  		return 0;
>>  	case NVME_SC_CAP_EXCEEDED:
>>  		return -ENOSPC;
>> +	case NVME_SC_READ_ONLY:
>> +	case NVME_SC_ACCESS_DENIED:
>> +		return -EACCES;
>> +	case NVME_SC_LBA_RANGE:
>> +		return -EFAULT;
>> +	case NVME_SC_CONNECT_CTRL_BUSY:
>> +		return -EBUSY;
>> +	case NVME_SC_INVALID_OPCODE:
>> +	case NVME_SC_INVALID_FIELD:
>> +	case NVME_SC_INVALID_NS:
>> +	case NVME_SC_SGL_INVALID_LAST:
>> +	case NVME_SC_SGL_INVALID_COUNT:
>> +	case NVME_SC_SGL_INVALID_DATA:
>> +	case NVME_SC_SGL_INVALID_METADATA:
>> +	case NVME_SC_SGL_INVALID_TYPE:
>> +	case NVME_SC_SGL_INVALID_OFFSET:
>> +	case NVME_SC_SGL_INVALID_SUBTYPE:
>> +	case NVME_SC_CQ_INVALID:
>> +	case NVME_SC_QID_INVALID:
>> +	case NVME_SC_QUEUE_SIZE:
>> +	case NVME_SC_FIRMWARE_SLOT:
>> +	case NVME_SC_FIRMWARE_IMAGE:
>> +	case NVME_SC_INVALID_VECTOR:
>> +	case NVME_SC_INVALID_LOG_PAGE:
>> +	case NVME_SC_INVALID_FORMAT:
>> +	case NVME_SC_CTRL_LIST_INVALID:
>> +		return -EINVAL;
>> +	case NVME_SC_CMD_SEQ_ERROR:
>> +		return -EPROTO;
>>  	default:
>>  		return -EIO;
>>  	}
> 
> .
> 




More information about the Linux-nvme mailing list