[dm-devel] [PATCH v2 1/4] nvme: return BLK_STS_DO_NOT_RETRY if the DNR bit is set

Hannes Reinecke hare at suse.de
Fri Apr 16 13:51:33 UTC 2021


On 4/16/21 1:15 AM, Mike Snitzer wrote:
> If the DNR bit is set we should not retry the command.
> 
> We care about the retryable vs not retryable distinction at the block
> layer so propagate the equivalent of the DNR bit by introducing
> BLK_STS_DO_NOT_RETRY. Update blk_path_error() to _not_ retry if it
> is set.
> 
> This change runs with the suggestion made here:
> https://lore.kernel.org/linux-nvme/20190813170144.GA10269@lst.de/
> 
> Suggested-by: Christoph Hellwig <hch at lst.de>
> Signed-off-by: Mike Snitzer <snitzer at redhat.com>
> ---
>  drivers/nvme/host/core.c  | 3 +++
>  include/linux/blk_types.h | 8 ++++++++
>  2 files changed, 11 insertions(+)
> 
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 0896e21642be..540d6fd8ffef 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -237,6 +237,9 @@ static void nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl)
>  
>  static blk_status_t nvme_error_status(u16 status)
>  {
> +	if (unlikely(status & NVME_SC_DNR))
> +		return BLK_STS_DO_NOT_RETRY;
> +
>  	switch (status & 0x7ff) {
>  	case NVME_SC_SUCCESS:
>  		return BLK_STS_OK;
> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
> index db026b6ec15a..1ca724948c56 100644
> --- a/include/linux/blk_types.h
> +++ b/include/linux/blk_types.h
> @@ -142,6 +142,13 @@ typedef u8 __bitwise blk_status_t;
>   */
>  #define BLK_STS_ZONE_ACTIVE_RESOURCE	((__force blk_status_t)16)
>  
> +/*
> + * BLK_STS_DO_NOT_RETRY is returned from the driver in the completion path
> + * if the device returns a status indicating that if the same command is
> + * re-submitted it is expected to fail.
> + */
> +#define BLK_STS_DO_NOT_RETRY	((__force blk_status_t)17)
> +
>  /**
>   * blk_path_error - returns true if error may be path related
>   * @error: status the request was completed with
> @@ -157,6 +164,7 @@ typedef u8 __bitwise blk_status_t;
>  static inline bool blk_path_error(blk_status_t error)
>  {
>  	switch (error) {
> +	case BLK_STS_DO_NOT_RETRY:
>  	case BLK_STS_NOTSUPP:
>  	case BLK_STS_NOSPC:
>  	case BLK_STS_TARGET:
> 
Reviewed-by: Hannes Reinecke <hare at suse.de>

Hannes
-- 
Dr. Hannes Reinecke		        Kernel Storage Architect
hare at suse.de			               +49 911 74053 688
SUSE Software Solutions Germany GmbH, 90409 Nürnberg
GF: F. Imendörffer, HRB 36809 (AG Nürnberg)





More information about the dm-devel mailing list