提交 db212f2e 编写于 作者: A Arun Easi 提交者: Martin K. Petersen

scsi: qla2xxx: Fix loss of NVMe namespaces after driver reload test

Driver registration of localport can race when it happens at the remote
port discovery time. Fix this by calling the registration under a mutex.

Link: https://lore.kernel.org/r/20220310092604.22950-4-njavali@marvell.com
Fixes: e84067d7 ("scsi: qla2xxx: Add FC-NVMe F/W initialization and transport registration")
Cc: stable@vger.kernel.org
Reported-by: NMarco Patalano <mpatalan@redhat.com>
Tested-by: NMarco Patalano <mpatalan@redhat.com>
Reviewed-by: NHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: NArun Easi <aeasi@marvell.com>
Signed-off-by: NNilesh Javali <njavali@marvell.com>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 6a45c8e1
...@@ -782,8 +782,6 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha) ...@@ -782,8 +782,6 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)
ha = vha->hw; ha = vha->hw;
tmpl = &qla_nvme_fc_transport; tmpl = &qla_nvme_fc_transport;
WARN_ON(vha->nvme_local_port);
if (ql2xnvme_queues < MIN_NVME_HW_QUEUES || ql2xnvme_queues > MAX_NVME_HW_QUEUES) { if (ql2xnvme_queues < MIN_NVME_HW_QUEUES || ql2xnvme_queues > MAX_NVME_HW_QUEUES) {
ql_log(ql_log_warn, vha, 0xfffd, ql_log(ql_log_warn, vha, 0xfffd,
"ql2xnvme_queues=%d is out of range(MIN:%d - MAX:%d). Resetting ql2xnvme_queues to:%d\n", "ql2xnvme_queues=%d is out of range(MIN:%d - MAX:%d). Resetting ql2xnvme_queues to:%d\n",
...@@ -797,7 +795,7 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha) ...@@ -797,7 +795,7 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)
(uint8_t)(ha->max_qpairs ? ha->max_qpairs : 1)); (uint8_t)(ha->max_qpairs ? ha->max_qpairs : 1));
ql_log(ql_log_info, vha, 0xfffb, ql_log(ql_log_info, vha, 0xfffb,
"Number of NVME queues used for this port: %d\n", "Number of NVME queues used for this port: %d\n",
qla_nvme_fc_transport.max_hw_queues); qla_nvme_fc_transport.max_hw_queues);
pinfo.node_name = wwn_to_u64(vha->node_name); pinfo.node_name = wwn_to_u64(vha->node_name);
...@@ -805,13 +803,25 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha) ...@@ -805,13 +803,25 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)
pinfo.port_role = FC_PORT_ROLE_NVME_INITIATOR; pinfo.port_role = FC_PORT_ROLE_NVME_INITIATOR;
pinfo.port_id = vha->d_id.b24; pinfo.port_id = vha->d_id.b24;
ql_log(ql_log_info, vha, 0xffff, mutex_lock(&ha->vport_lock);
"register_localport: host-traddr=nn-0x%llx:pn-0x%llx on portID:%x\n", /*
pinfo.node_name, pinfo.port_name, pinfo.port_id); * Check again for nvme_local_port to see if any other thread raced
qla_nvme_fc_transport.dma_boundary = vha->host->dma_boundary; * with this one and finished registration.
*/
ret = nvme_fc_register_localport(&pinfo, tmpl, if (!vha->nvme_local_port) {
get_device(&ha->pdev->dev), &vha->nvme_local_port); ql_log(ql_log_info, vha, 0xffff,
"register_localport: host-traddr=nn-0x%llx:pn-0x%llx on portID:%x\n",
pinfo.node_name, pinfo.port_name, pinfo.port_id);
qla_nvme_fc_transport.dma_boundary = vha->host->dma_boundary;
ret = nvme_fc_register_localport(&pinfo, tmpl,
get_device(&ha->pdev->dev),
&vha->nvme_local_port);
mutex_unlock(&ha->vport_lock);
} else {
mutex_unlock(&ha->vport_lock);
return 0;
}
if (ret) { if (ret) {
ql_log(ql_log_warn, vha, 0xffff, ql_log(ql_log_warn, vha, 0xffff,
"register_localport failed: ret=%x\n", ret); "register_localport failed: ret=%x\n", ret);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册