Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2497300pxj; Mon, 10 May 2021 04:32:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwsDoJk7cwsPSuN46+ALtmjeq/ANYKfOK/69aJXpwCNKAlgLry75bbkge9M+e7u5LmFqWJx X-Received: by 2002:a6b:ef1a:: with SMTP id k26mr14936868ioh.197.1620646351171; Mon, 10 May 2021 04:32:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620646351; cv=none; d=google.com; s=arc-20160816; b=BEdkv5YniNqQgYZPYwmwpJH1uUymXR4OmKMDTKow/bAINcjy8HqPmeOBBfZxORUQeZ VOnDblyZKo9IL1sFIjq3OD22OiDugiTyJKGgTRI5xVAJYTyZTQ0+TRjqWdVvjJquJO3k P2rGeftHH5GOETm+inw/u6qfvyuKI6k0YL4lWEs72J9ZXao8z8EYubSC8z5VjLusx8NK cwv3NfuW8VdPrODbWqMTiLmsxgRbB1o5K8MNMvXj9FhTF3zmpyDt9nZ0tTRkxWhOzPcd 84eAQKWEdncAlM6JJpDqVg2yK1b549oDJetW7Ir3xwLfvfrBSzT0y1UydhQDj+DQ4U2/ KArw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=W5WjA2GJmh4ZHwaPtTi8bVvejVtIxsUHnFjk+rcpMdo=; b=MC0MGU9nNLqnmJGma5rJslSD+1DvoSSGtlg3MyaedXlK010H2WoL+Z/9aHRc42DPgo Efa8C9xudS0keJX7iTWVOeLWddtvGANb2LP5fzrVq0dolPGQWZrnKXbjJDGYT18nC5oq tKtUEaORV3JlEItQWhhfdMEU1dm/i8XmiZG0rRkYPWkXbzjAYgv3boRrKQ8vbEeu7OOQ rlOdbUEHyRINFa8GpbLam5y7RGQYPLDmHjvDrY+bz8Ac+5KHIegTRjjEh3Flm4XKAh0z EgQTnWIIH0JG2UkEIPC+e1ztuMEOEz3LgK9kzsaDl25o08wh5lljuEu76RQ1p8svcMfR bs/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=u64siDZZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s201si13566256ios.76.2021.05.10.04.32.18; Mon, 10 May 2021 04:32:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=u64siDZZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234753AbhEJL3y (ORCPT + 99 others); Mon, 10 May 2021 07:29:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:52744 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234777AbhEJK5C (ORCPT ); Mon, 10 May 2021 06:57:02 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 9BC29614A5; Mon, 10 May 2021 10:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620643753; bh=r18eagK+TWWaSO464JTLqmWqludixdPBwKpeMcvU/ww=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u64siDZZFJ4ZMkrgmn9lMiMutMe1VEkoe57svEs9JaeTzrAKnQhGD0PHl9BQLw9pw Al/ThqDb/d5vXpmi9BOlVyp7/ZH0i90lthybu60UA91k0Z82YN2/lNA+PvUdDs8DQb OrhdFVXWT5a4Yc43FgiMbHuF2lUHHfL8gj7KFp1g= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dick Kennedy , James Smart , "Martin K. Petersen" , Sasha Levin Subject: [PATCH 5.11 145/342] scsi: lpfc: Fix ADISC handling that never frees nodes Date: Mon, 10 May 2021 12:18:55 +0200 Message-Id: <20210510102014.865441383@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510102010.096403571@linuxfoundation.org> References: <20210510102010.096403571@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: James Smart [ Upstream commit 309b477462df7542355ac984674a6e89c01c89aa ] While testing target port swap test with ADISC enabled, several nodes remain in UNUSED state. These nodes are never freed and rmmod hangs for long time before finising with "0233 Nodelist not empty" error. During PLOGI completion lpfc_plogi_confirm_nport() looks for existing nodes with same WWPN. If found, the existing node is used to continue discovery. The node on which plogi was performed is freed. When ADISC is enabled, an ADISC els request is triggered in response to an RSCN. It's possible that the ADISC may be rejected by the remote port causing the ADISC completion handler to clear the port and node name in the node. If this occurs, if a PLOGI is received it causes a node lookup based on wwpn to now fail, causing the port swap logic to kick in which allocates a new node and swaps to it. This effectively orphans the original node structure. Fix the situation by detecting when the lookup fails and forgo the node swap and node allocation by using the node on which the PLOGI was issued. Link: https://lore.kernel.org/r/20210301171821.3427-15-jsmart2021@gmail.com Co-developed-by: Dick Kennedy Signed-off-by: Dick Kennedy Signed-off-by: James Smart Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/lpfc/lpfc_els.c | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 20f3b21ef05c..69e8a127b44f 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -1597,7 +1597,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, struct lpfc_nodelist *new_ndlp; struct serv_parm *sp; uint8_t name[sizeof(struct lpfc_name)]; - uint32_t rc, keepDID = 0, keep_nlp_flag = 0; + uint32_t keepDID = 0, keep_nlp_flag = 0; uint32_t keep_new_nlp_flag = 0; uint16_t keep_nlp_state; u32 keep_nlp_fc4_type = 0; @@ -1619,7 +1619,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName); /* return immediately if the WWPN matches ndlp */ - if (new_ndlp == ndlp) + if (!new_ndlp || (new_ndlp == ndlp)) return ndlp; if (phba->sli_rev == LPFC_SLI_REV4) { @@ -1638,30 +1638,11 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, (new_ndlp ? new_ndlp->nlp_flag : 0), (new_ndlp ? new_ndlp->nlp_fc4_type : 0)); - if (!new_ndlp) { - rc = memcmp(&ndlp->nlp_portname, name, - sizeof(struct lpfc_name)); - if (!rc) { - if (active_rrqs_xri_bitmap) - mempool_free(active_rrqs_xri_bitmap, - phba->active_rrq_pool); - return ndlp; - } - new_ndlp = lpfc_nlp_init(vport, ndlp->nlp_DID); - if (!new_ndlp) { - if (active_rrqs_xri_bitmap) - mempool_free(active_rrqs_xri_bitmap, - phba->active_rrq_pool); - return ndlp; - } - } else { - keepDID = new_ndlp->nlp_DID; - if (phba->sli_rev == LPFC_SLI_REV4 && - active_rrqs_xri_bitmap) - memcpy(active_rrqs_xri_bitmap, - new_ndlp->active_rrqs_xri_bitmap, - phba->cfg_rrq_xri_bitmap_sz); - } + keepDID = new_ndlp->nlp_DID; + + if (phba->sli_rev == LPFC_SLI_REV4 && active_rrqs_xri_bitmap) + memcpy(active_rrqs_xri_bitmap, new_ndlp->active_rrqs_xri_bitmap, + phba->cfg_rrq_xri_bitmap_sz); /* At this point in this routine, we know new_ndlp will be * returned. however, any previous GID_FTs that were done -- 2.30.2