Commit ea43d970 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Christoph Hellwig
Browse files

nvme: fix identify error status silent ignore



Commit 59c7c3ca intended to only silently ignore non retry-able
errors (DNR bit set) such that we can still identify misbehaving
controllers, and in the other hand propagate retry-able errors (DNR bit
cleared) so we don't wrongly abandon a namespace just because it happens
to be temporarily inaccessible.

The goal remains the same as the original commit where this was
introduced but unfortunately had the logic backwards.

Fixes: 59c7c3ca ("nvme: fix possible hang when ns scanning fails during error recovery")
Reported-by: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent e7eea44e
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -1116,10 +1116,16 @@ static int nvme_identify_ns_descs(struct nvme_ctrl *ctrl, unsigned nsid,
		dev_warn(ctrl->device,
			"Identify Descriptors failed (%d)\n", status);
		 /*
		  * Don't treat an error as fatal, as we potentially already
		  * have a NGUID or EUI-64.
		  * Don't treat non-retryable errors as fatal, as we potentially
		  * already have a NGUID or EUI-64.  If we failed with DNR set,
		  * we want to silently ignore the error as we can still
		  * identify the device, but if the status has DNR set, we want
		  * to propagate the error back specifically for the disk
		  * revalidation flow to make sure we don't abandon the
		  * device just because of a temporal retry-able error (such
		  * as path of transport errors).
		  */
		if (status > 0 && !(status & NVME_SC_DNR))
		if (status > 0 && (status & NVME_SC_DNR))
			status = 0;
		goto free_data;
	}