From patchwork Sat Sep 30 00:34:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Smart X-Patchwork-Id: 9978877 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E92716037F for ; Sat, 30 Sep 2017 00:35:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DB94C298D4 for ; Sat, 30 Sep 2017 00:35:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D0707298D7; Sat, 30 Sep 2017 00:35:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 95720298D4 for ; Sat, 30 Sep 2017 00:35:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752635AbdI3AfK (ORCPT ); Fri, 29 Sep 2017 20:35:10 -0400 Received: from mail-qk0-f194.google.com ([209.85.220.194]:37523 "EHLO mail-qk0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752595AbdI3Ae7 (ORCPT ); Fri, 29 Sep 2017 20:34:59 -0400 Received: by mail-qk0-f194.google.com with SMTP id z143so773940qkb.4 for ; Fri, 29 Sep 2017 17:34:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HEKMeuwmGW+YmVMjLp5H72YPTOMjjtX3rbSL9qk5ILk=; b=JlaSeso38/Hy25XRYmNtNsVV9zGVJeGx7N93RjEw0n7ug2HBbtBKn7VOuIsGVsbx57 PwVOn7nyXzvbeFTOD4fEIqSmhrESQxWiDRitStwSWygcOCL21wHdMsjQZ+MrdiRYI0Es AVBOzQxEoRwURgQKg5oZ7qffdNLYyC+8fk/UmAK+HQcgWttcNVAc2oX30ZClRH5K0wYB 9ob1p2QjT5vhQxG1exZCu9kmp4AbmyHP55azn5HY1gT0/AeKe5THOyYq5hbytHo7OstE gZQhxF2cfz38sl8BHbQ4r/DBtY4TF70ccaur6rIo+vx0BSvPKHDf/gRbBx+U4GnsntKJ 4sQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HEKMeuwmGW+YmVMjLp5H72YPTOMjjtX3rbSL9qk5ILk=; b=CjgaKOFbQlgWz21Xq0H/UGA3WaP90MZ3zs/4IuAEr26/mcCvLcrI6U0TpIZ73rI6dd iCkohRuHvhs5O/DT0NUqEmldEz7SoOO5ieRzjROxzXLuoL7Vi/CMVj3Fm24503kF3CJz +r1aUxO5Ln5ruUgD1yaIC4ZS4bbD0jX36uklHidJ5vxrN+UNqvm/YVmLxnC2GJRyE7zW TRX8XQWryn/yMr27+HfkpqQHv3kiza2994Bp5ood3rvKhvv0mWjciE5hPAcg7xdnkRTm Ru50A87DcNNGqzXCHfyJBIIUyiwpZLjdUcIXimBM77MGzxklCNWjT6Yn3jl3XctldDq5 R3eg== X-Gm-Message-State: AMCzsaXhf03QNEJt7fakCo4aN1lyhDx+twbxkXdvCQmwq8jBna57NYOM fknYZ6DYj789LI+gk4nwA3WPPQ== X-Google-Smtp-Source: AOwi7QAmGRcA8O8/lF10BpVsWYW73jwJxbT/Qds4yPE250PlAZ2BfOyug2SaNtiDauzA1rz8yQRAhw== X-Received: by 10.55.204.9 with SMTP id r9mr3419794qki.33.1506731698986; Fri, 29 Sep 2017 17:34:58 -0700 (PDT) Received: from pallmd1.broadcom.com ([192.19.255.250]) by smtp.gmail.com with ESMTPSA id u32sm3596918qte.25.2017.09.29.17.34.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 29 Sep 2017 17:34:58 -0700 (PDT) From: James Smart To: linux-scsi@vger.kernel.org Cc: Dick Kennedy , James Smart Subject: [PATCH v2 04/21] lpfc: Fix lpfc nvme host rejecting IO with Not Ready message Date: Fri, 29 Sep 2017 17:34:30 -0700 Message-Id: <20170930003447.10747-5-jsmart2021@gmail.com> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20170930003447.10747-1-jsmart2021@gmail.com> References: <20170930003447.10747-1-jsmart2021@gmail.com> Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Dick Kennedy In a link bounce scenario, a condition can occur where the discovery engine swaps an ndlp structure (address changbe for an nport). While the swap was successfully executed by the discovery engine, the driver did not properly detect a change in the ndlp bound to the nvme rport. This error resulted in the nvme host transport issuing an IO to the correct nvme rport, but the lpfc driver addressed a ndlp with an NLP_UNUSED status and failed the io. This resulting it it looking like there were missing namespaces and applications failed due to io errors. To fix, in lpfc_nvme_register_rport, rework the "rebind" case to break the nvme rport<->ndlp association when the ndlp already has an nrport. Then rebind the rport to the correct ndlp data and backpointers. Signed-off-by: Dick Kennedy Signed-off-by: James Smart Reviewed-by: Johannes Thumshirn --- drivers/scsi/lpfc/lpfc_nvme.c | 46 ++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c index 79ba3ce063a4..2ad23b356bfe 100644 --- a/drivers/scsi/lpfc/lpfc_nvme.c +++ b/drivers/scsi/lpfc/lpfc_nvme.c @@ -2296,6 +2296,7 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) struct lpfc_nvme_rport *rport; struct nvme_fc_remote_port *remote_port; struct nvme_fc_port_info rpinfo; + struct lpfc_nodelist *prev_ndlp; lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NVME_DISC, "6006 Register NVME PORT. DID x%06x nlptype x%x\n", @@ -2332,7 +2333,7 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) * new rport. */ rport = remote_port->private; - if (ndlp->nrport == rport) { + if (ndlp->nrport) { lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NVME_DISC, "6014 Rebinding lport to " @@ -2343,24 +2344,33 @@ lpfc_nvme_register_port(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) remote_port->port_role, ndlp->nlp_type, ndlp->nlp_DID); - } else { - /* New rport. */ - rport->remoteport = remote_port; - rport->lport = lport; - rport->ndlp = lpfc_nlp_get(ndlp); - if (!rport->ndlp) - return -1; - ndlp->nrport = rport; - lpfc_printf_vlog(vport, KERN_INFO, - LOG_NVME_DISC | LOG_NODE, - "6022 Binding new rport to " - "lport %p Rport WWNN 0x%llx, " - "Rport WWPN 0x%llx DID " - "x%06x Role x%x\n", - lport, - rpinfo.node_name, rpinfo.port_name, - rpinfo.port_id, rpinfo.port_role); + prev_ndlp = rport->ndlp; + + /* Sever the ndlp<->rport connection before dropping + * the ndlp ref from register. + */ + ndlp->nrport = NULL; + rport->ndlp = NULL; + if (prev_ndlp) + lpfc_nlp_put(ndlp); } + + /* Clean bind the rport to the ndlp. */ + rport->remoteport = remote_port; + rport->lport = lport; + rport->ndlp = lpfc_nlp_get(ndlp); + if (!rport->ndlp) + return -1; + ndlp->nrport = rport; + lpfc_printf_vlog(vport, KERN_INFO, + LOG_NVME_DISC | LOG_NODE, + "6022 Binding new rport to " + "lport %p Rport WWNN 0x%llx, " + "Rport WWPN 0x%llx DID " + "x%06x Role x%x\n", + lport, + rpinfo.node_name, rpinfo.port_name, + rpinfo.port_id, rpinfo.port_role); } else { lpfc_printf_vlog(vport, KERN_ERR, LOG_NVME_DISC | LOG_NODE,