History

nvme: fix possible hang when ns scanning fails during error recovery

When the controller is reconnecting, the host fails I/O and admin commands as the host cannot reach the controller. ns scanning may revalidate namespaces during that period and it is wrong to remove namespaces due to these failures as we may hang (see 205da2434301). One command that may fail is nvme_identify_ns_descs. Since we return success due to having ns identify descriptor list optional, we continue to compare ns identifiers in nvme_revalidate_disk, obviously fail and return -ENODEV to nvme_validate_ns, which will remove the namespace. Exactly what we don't want to happen.

Sagi Grimberg committed 6 years ago

Commit 59c7c3c1 parent a8de6631 file · +1 −1Browse files

Unified · Split

drivers/nvme/host/core.c+1−1
@@ -1110,7 +1110,7 @@ static int nvme_identify_ns_descs(struct nvme_ctrl *ctrl, unsigned nsid, · 1109 unmodified lines
1110 * Don't treat an error as fatal, as we potentially already1110 * Don't treat an error as fatal, as we potentially already
1111 * have a NGUID or EUI-64.1111 * have a NGUID or EUI-64.
1112 */1112 */
1113 if (status > 0)1113 if (status > 0 && !(status & NVME_SC_DNR))
1114 status = 0;1114 status = 0;
1115 goto free_data;1115 goto free_data;
1116 }1116 }