From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A1B5C283C81 for ; Thu, 10 Apr 2025 11:41:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285273; cv=none; b=ifI4ysi2iimglmR2SRkZYo5yEruX0IUj+RG/zsVd4KvVzY9GJ/PdDtu8bCDBtca5ivP9eiIUemzwkfHgFc6enChfmpkjxe9F0HL8UAweRjYwqLD7ew9/g2Srs7zKaxAVP9j6CDikmRuSbhV6pWCKZdKMjBLwB9XXphQ5+LgTyKQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285273; c=relaxed/simple; bh=jEKbG5pfx1l0nP/U7lRUSa0XqnGWbsgWmnMw8er6V34=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SJmSODIbkuP5XSbv3Eb2kpzKwbaZZ5Q3OYBVH+x+efLN+zP6Wsvt9bVLpKe8ZR5TSNXZtZsSZdLBsI1tjrXn8PPeB7lP9xAkVgMhP7Bm/Vv5JlgVpoyFqxa8doUFpuiGsPSy1GVu0t3Lrc1cWxBkZpcDkkhyihca3Hdc3amE1nI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fQVjMQqv; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fQVjMQqv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 33504C4CEDD; Thu, 10 Apr 2025 11:41:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285273; bh=jEKbG5pfx1l0nP/U7lRUSa0XqnGWbsgWmnMw8er6V34=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fQVjMQqvlaM7G3ik66t0tpAAYsYmtjv/eYkW9w6eC7whcI3G3wX883S8ZbJtQ3qg4 wqai5YH8XntLRQc2HJSq8tw32yipB53dilScRoY0dSeKfn38CGAA7G85yRut+JvXQ/ v7lV8uPhKIGsAPMFlZzezWLFoPyThVmbW0ITKUMRD5Nn+VRq8Y9BGGZUfYQhlFCdts RGJRZX8TgHPIwHfqnbDDuFNJKrq3p3A9e0uTJBlsa6LCQtI8NH7iCDKHGbsUVtCG5V IZxksDYve8srILpL7htQcm7j/PdPX0hIQ7Vj2xWJa8cVjl1OlCsEhNhe6MGHMNMJ5M agQgdCwDvU9lg== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:04 +0200 Subject: [PATCH v4 01/14] nvmet-fcloop: track ref counts for nports Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-1-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 A nport object is always used in association with targerport, remoteport, tport and rport objects. Add explicit references for any of the associated object. This ensures that nport is not removed too early on shutdown sequences. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 133 +++++++++++++++++++++++++++++----------= ---- 1 file changed, 90 insertions(+), 43 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 641201e62c1bafa13986642c6c4067b35f784edd..2b23e43ef4403fa4d70c66263f7= 750165d2ddc72 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1047,8 +1047,14 @@ static void fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) { struct fcloop_rport *rport =3D remoteport->private; + unsigned long flags; =20 flush_work(&rport->ls_work); + + spin_lock_irqsave(&fcloop_lock, flags); + rport->nport->rport =3D NULL; + spin_unlock_irqrestore(&fcloop_lock, flags); + fcloop_nport_put(rport->nport); } =20 @@ -1056,8 +1062,14 @@ static void fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) { struct fcloop_tport *tport =3D targetport->private; + unsigned long flags; =20 flush_work(&tport->ls_work); + + spin_lock_irqsave(&fcloop_lock, flags); + tport->nport->tport =3D NULL; + spin_unlock_irqrestore(&fcloop_lock, flags); + fcloop_nport_put(tport->nport); } =20 @@ -1184,6 +1196,37 @@ __wait_localport_unreg(struct fcloop_lport *lport) return ret; } =20 +static struct fcloop_nport * +__fcloop_nport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_nport *nport; + + list_for_each_entry(nport, &fcloop_nports, nport_list) { + if (nport->node_name !=3D node_name || + nport->port_name !=3D port_name) + continue; + + if (fcloop_nport_get(nport)) + return nport; + + break; + } + + return NULL; +} + +static struct fcloop_nport * +fcloop_nport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_nport *nport; + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + nport =3D __fcloop_nport_lookup(node_name, port_name); + spin_unlock_irqrestore(&fcloop_lock, flags); + + return nport; +} =20 static ssize_t fcloop_delete_local_port(struct device *dev, struct device_attribute *attr, @@ -1365,6 +1408,8 @@ __unlink_remote_port(struct fcloop_nport *nport) { struct fcloop_rport *rport =3D nport->rport; =20 + lockdep_assert_held(&fcloop_lock); + if (rport && nport->tport) nport->tport->remoteport =3D NULL; nport->rport =3D NULL; @@ -1377,9 +1422,6 @@ __unlink_remote_port(struct fcloop_nport *nport) static int __remoteport_unreg(struct fcloop_nport *nport, struct fcloop_rport *rport) { - if (!rport) - return -EALREADY; - return nvme_fc_unregister_remoteport(rport->remoteport); } =20 @@ -1387,8 +1429,8 @@ static ssize_t fcloop_delete_remote_port(struct device *dev, struct device_attribute *att= r, const char *buf, size_t count) { - struct fcloop_nport *nport =3D NULL, *tmpport; - static struct fcloop_rport *rport; + struct fcloop_nport *nport; + struct fcloop_rport *rport; u64 nodename, portname; unsigned long flags; int ret; @@ -1397,24 +1439,24 @@ fcloop_delete_remote_port(struct device *dev, struc= t device_attribute *attr, if (ret) return ret; =20 - spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tmpport, &fcloop_nports, nport_list) { - if (tmpport->node_name =3D=3D nodename && - tmpport->port_name =3D=3D portname && tmpport->rport) { - nport =3D tmpport; - rport =3D __unlink_remote_port(nport); - break; - } - } + nport =3D fcloop_nport_lookup(nodename, portname); + if (!nport) + return -ENOENT; =20 + spin_lock_irqsave(&fcloop_lock, flags); + rport =3D __unlink_remote_port(nport); spin_unlock_irqrestore(&fcloop_lock, flags); =20 - if (!nport) - return -ENOENT; + if (!rport) { + ret =3D -ENOENT; + goto out_nport_put; + } =20 ret =3D __remoteport_unreg(nport, rport); =20 +out_nport_put: + fcloop_nport_put(nport); + return ret ? ret : count; } =20 @@ -1465,6 +1507,8 @@ __unlink_target_port(struct fcloop_nport *nport) { struct fcloop_tport *tport =3D nport->tport; =20 + lockdep_assert_held(&fcloop_lock); + if (tport && nport->rport) nport->rport->targetport =3D NULL; nport->tport =3D NULL; @@ -1475,9 +1519,6 @@ __unlink_target_port(struct fcloop_nport *nport) static int __targetport_unreg(struct fcloop_nport *nport, struct fcloop_tport *tport) { - if (!tport) - return -EALREADY; - return nvmet_fc_unregister_targetport(tport->targetport); } =20 @@ -1485,8 +1526,8 @@ static ssize_t fcloop_delete_target_port(struct device *dev, struct device_attribute *att= r, const char *buf, size_t count) { - struct fcloop_nport *nport =3D NULL, *tmpport; - struct fcloop_tport *tport =3D NULL; + struct fcloop_nport *nport; + struct fcloop_tport *tport; u64 nodename, portname; unsigned long flags; int ret; @@ -1495,24 +1536,24 @@ fcloop_delete_target_port(struct device *dev, struc= t device_attribute *attr, if (ret) return ret; =20 - spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tmpport, &fcloop_nports, nport_list) { - if (tmpport->node_name =3D=3D nodename && - tmpport->port_name =3D=3D portname && tmpport->tport) { - nport =3D tmpport; - tport =3D __unlink_target_port(nport); - break; - } - } + nport =3D fcloop_nport_lookup(nodename, portname); + if (!nport) + return -ENOENT; =20 + spin_lock_irqsave(&fcloop_lock, flags); + tport =3D __unlink_target_port(nport); spin_unlock_irqrestore(&fcloop_lock, flags); =20 - if (!nport) - return -ENOENT; + if (!tport) { + ret =3D -ENOENT; + goto out_nport_put; + } =20 ret =3D __targetport_unreg(nport, tport); =20 +out_nport_put: + fcloop_nport_put(nport); + return ret ? ret : count; } =20 @@ -1609,8 +1650,8 @@ static int __init fcloop_init(void) =20 static void __exit fcloop_exit(void) { - struct fcloop_lport *lport =3D NULL; - struct fcloop_nport *nport =3D NULL; + struct fcloop_lport *lport; + struct fcloop_nport *nport; struct fcloop_tport *tport; struct fcloop_rport *rport; unsigned long flags; @@ -1621,7 +1662,7 @@ static void __exit fcloop_exit(void) for (;;) { nport =3D list_first_entry_or_null(&fcloop_nports, typeof(*nport), nport_list); - if (!nport) + if (!nport || !fcloop_nport_get(nport)) break; =20 tport =3D __unlink_target_port(nport); @@ -1629,13 +1670,19 @@ static void __exit fcloop_exit(void) =20 spin_unlock_irqrestore(&fcloop_lock, flags); =20 - ret =3D __targetport_unreg(nport, tport); - if (ret) - pr_warn("%s: Failed deleting target port\n", __func__); + if (tport) { + ret =3D __targetport_unreg(nport, tport); + if (ret) + pr_warn("%s: Failed deleting target port\n", __func__); + } =20 - ret =3D __remoteport_unreg(nport, rport); - if (ret) - pr_warn("%s: Failed deleting remote port\n", __func__); + if (rport) { + ret =3D __remoteport_unreg(nport, rport); + if (ret) + pr_warn("%s: Failed deleting remote port\n", __func__); + } + + fcloop_nport_put(nport); =20 spin_lock_irqsave(&fcloop_lock, flags); } --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01488283C81 for ; Thu, 10 Apr 2025 11:41:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285279; cv=none; b=Q7J0LEHjKjxTfcRpw7v7er94+T9VtuG92rsbDEQ5c5kxgDSWUmItBylR6zUAxZN7JgcHmbEZtiaLjEx0Tg76zwgkuP26U4vHjPIEdZ7CdR0vPejqdOHyk/mhtuMbIi4g7c4uK2VVdAhn2c4t0xbD5T7NFzDbBjBs6zJ+PKzaTr4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285279; c=relaxed/simple; bh=Tey/jPpQIblgm+n0ERiQKMTVIjHrNonHGj1c23bE1TI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IG64ZDXLaL/lkRfWliUlVp/BX7id4j7OlewObELRn3/eG/jBhE2GWog8vl+3sKv/QMabv+I6jGTD0HOZfFZDlaThlgUTP4LbUcgpaB7p+6G4EvaVbQHUE82lD+H4fAcwnFDnANHXEZ7UmyDryrLg+yJC1NdR1eDAsveFWKVq47g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mqIjYDlL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mqIjYDlL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A27F9C4CEE9; Thu, 10 Apr 2025 11:41:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285276; bh=Tey/jPpQIblgm+n0ERiQKMTVIjHrNonHGj1c23bE1TI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mqIjYDlLXig4f1bLZyKqHY6vo2hLsJSz7sogICU/asF+8rnxjO5aTpy1lw9I8wYH5 Ux41jY72blOsdUitvFUB4nnIL6/I/gkuVrloxalfSuMqOkZVaiTb6T6Kvc6829mOPz aPXt95JlG0SxrucOnVbPJb/RExa53TmCz+paac1S7T9CSIlPuFI/d1UKqEKvwpb1SW PJMJK6j1mhgqvgxCElQ9P+sART/8M14gZ+nOBqp3oXL/dnE85QeogSA5bvE8OC5G6A CoJyA+VkIUwHCAU7NOPFvOiqu/gwy5qmL42zhPiyraWTPO67aIVskseLDDLs4VmZ9C xaw+G2JsywR+w== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:05 +0200 Subject: [PATCH v4 02/14] nvmet-fcloop: remove nport from list on last user Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-2-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The nport object has an association with the rport and lport object, that means we can only remove an nport object from the global nport_list after the last user of an rport or lport is gone. Reviewed-by: Hannes Reinecke Reviewed-by: Christoph Hellwig Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 2b23e43ef4403fa4d70c66263f7750165d2ddc72..2cce7649af276528360395b6d58= f03183c11da20 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1019,9 +1019,15 @@ fcloop_lport_get(struct fcloop_lport *lport) static void fcloop_nport_put(struct fcloop_nport *nport) { + unsigned long flags; + if (!refcount_dec_and_test(&nport->ref)) return; =20 + spin_lock_irqsave(&fcloop_lock, flags); + list_del(&nport->nport_list); + spin_unlock_irqrestore(&fcloop_lock, flags); + kfree(nport); } =20 @@ -1414,8 +1420,6 @@ __unlink_remote_port(struct fcloop_nport *nport) nport->tport->remoteport =3D NULL; nport->rport =3D NULL; =20 - list_del(&nport->nport_list); - return rport; } =20 --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 014212836A6 for ; Thu, 10 Apr 2025 11:41:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285279; cv=none; b=nCLl7Hd/vDoqrIOs1UMLBg30KAAIrzQXrI80leet1EVzXLaRJPfro344kjs9toSIVcja9IBtkhx2x2k9AZf4ktoeuyh58ltPMS/qP0Dtijk4Jpw40rUr7aVJVOzaz+qLH/NKLGEARzMhZn25Oi69hu+/kOmVd3QOprmwSUlpeDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285279; c=relaxed/simple; bh=Xe+d02CG83R08Gc8sX/2gu0ycajhZ1Rrr/zsZ5RfWWA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZS3PBhiQU3BVqyUs8Q4dWsYtOapvRFTrXnOROcphCbyd+JqfR2V37aNgqubkN2hYSS6XEevWTHi47vZ0cwFmQzRnUJQK/CwEjDBbVzSvtnYvuLHiwPE/W3clgUn9hYoxE+cFuheARnfzhi6O0Ap968+swjXV/4Uq/HF7BHQNoTA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BEKmiB0q; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BEKmiB0q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3318BC4CEDD; Thu, 10 Apr 2025 11:41:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285278; bh=Xe+d02CG83R08Gc8sX/2gu0ycajhZ1Rrr/zsZ5RfWWA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BEKmiB0qDeXrnAlF9JeulniDcVleD+VAadq+5N5Ky03i1q5spabCXmIu+xwAa3kcE mqA8SkBKiGBAQm6yrJTBzE4B0jyBsBD+QCcE7hKSQ2N/3dA+RcTCIVlcov7O/yXjhv 6Wk7OCXDB90OGqdC0LEsrtvkcnLQ654glqbPdAXPYkQimgjHzEPhWcafiawIqZFjPP bTYCk1o87Nz/ekWrYF4vHmOGDz9fsRzomTEi9pymG6v0iXkoUjef5i3YAz64UmM4+W nRuWU2t+k41oYOgYwqnYmX5ywAbEG4Wubr7tJGp8sMC1EqEmfTzB5sxjwl4TDbb2g2 x0NEAF0LaA6Hg== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:06 +0200 Subject: [PATCH v4 03/14] nvmet-fcloop: refactor fcloop_nport_alloc and track lport Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-3-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The checks for a valid input values are mixed with the logic to insert a newly allocated nport. Refactor the function so that first the checks are done. This allows to untangle the setup steps into a more linear form which reduces the complexity of the functions. Also start tracking lport when a lport is assigned to a nport. This ensures, that the lport is not going away as long it is still referenced by a nport. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 107 ++++++++++++++++++++++++++-------------= ---- 1 file changed, 64 insertions(+), 43 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 2cce7649af276528360395b6d58f03183c11da20..a8134127ad8087190d674251a88= 545da3f8800d7 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1028,6 +1028,9 @@ fcloop_nport_put(struct fcloop_nport *nport) list_del(&nport->nport_list); spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (nport->lport) + fcloop_lport_put(nport->lport); + kfree(nport); } =20 @@ -1234,6 +1237,25 @@ fcloop_nport_lookup(u64 node_name, u64 port_name) return nport; } =20 +static struct fcloop_lport * +__fcloop_lport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_lport *lport; + + list_for_each_entry(lport, &fcloop_lports, lport_list) { + if (lport->localport->node_name !=3D node_name || + lport->localport->port_name !=3D port_name) + continue; + + if (fcloop_lport_get(lport)) + return lport; + + break; + } + + return NULL; +} + static ssize_t fcloop_delete_local_port(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -1272,8 +1294,8 @@ fcloop_delete_local_port(struct device *dev, struct d= evice_attribute *attr, static struct fcloop_nport * fcloop_alloc_nport(const char *buf, size_t count, bool remoteport) { - struct fcloop_nport *newnport, *nport =3D NULL; - struct fcloop_lport *tmplport, *lport =3D NULL; + struct fcloop_nport *newnport, *nport; + struct fcloop_lport *lport; struct fcloop_ctrl_options *opts; unsigned long flags; u32 opts_mask =3D (remoteport) ? RPORT_OPTS : TGTPORT_OPTS; @@ -1288,10 +1310,8 @@ fcloop_alloc_nport(const char *buf, size_t count, bo= ol remoteport) goto out_free_opts; =20 /* everything there ? */ - if ((opts->mask & opts_mask) !=3D opts_mask) { - ret =3D -EINVAL; + if ((opts->mask & opts_mask) !=3D opts_mask) goto out_free_opts; - } =20 newnport =3D kzalloc(sizeof(*newnport), GFP_KERNEL); if (!newnport) @@ -1307,60 +1327,61 @@ fcloop_alloc_nport(const char *buf, size_t count, b= ool remoteport) refcount_set(&newnport->ref, 1); =20 spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tmplport, &fcloop_lports, lport_list) { - if (tmplport->localport->node_name =3D=3D opts->wwnn && - tmplport->localport->port_name =3D=3D opts->wwpn) - goto out_invalid_opts; - - if (tmplport->localport->node_name =3D=3D opts->lpwwnn && - tmplport->localport->port_name =3D=3D opts->lpwwpn) - lport =3D tmplport; + lport =3D __fcloop_lport_lookup(opts->wwnn, opts->wwpn); + if (lport) { + /* invalid configuration */ + fcloop_lport_put(lport); + goto out_free_newnport; } =20 if (remoteport) { - if (!lport) - goto out_invalid_opts; - newnport->lport =3D lport; - } - - list_for_each_entry(nport, &fcloop_nports, nport_list) { - if (nport->node_name =3D=3D opts->wwnn && - nport->port_name =3D=3D opts->wwpn) { - if ((remoteport && nport->rport) || - (!remoteport && nport->tport)) { - nport =3D NULL; - goto out_invalid_opts; - } - - fcloop_nport_get(nport); - - spin_unlock_irqrestore(&fcloop_lock, flags); - - if (remoteport) - nport->lport =3D lport; - if (opts->mask & NVMF_OPT_ROLES) - nport->port_role =3D opts->roles; - if (opts->mask & NVMF_OPT_FCADDR) - nport->port_id =3D opts->fcaddr; + lport =3D __fcloop_lport_lookup(opts->lpwwnn, opts->lpwwpn); + if (!lport) { + /* invalid configuration */ goto out_free_newnport; } } =20 - list_add_tail(&newnport->nport_list, &fcloop_nports); + nport =3D __fcloop_nport_lookup(opts->wwnn, opts->wwpn); + if (nport) { + if ((remoteport && nport->rport) || + (!remoteport && nport->tport)) { + /* invalid configuration */ + goto out_put_nport; + } =20 + /* found existing nport, discard the new nport */ + kfree(newnport); + } else { + list_add_tail(&newnport->nport_list, &fcloop_nports); + nport =3D newnport; + } + + if (opts->mask & NVMF_OPT_ROLES) + nport->port_role =3D opts->roles; + if (opts->mask & NVMF_OPT_FCADDR) + nport->port_id =3D opts->fcaddr; + if (lport) { + if (!nport->lport) + nport->lport =3D lport; + else + fcloop_lport_put(lport); + } spin_unlock_irqrestore(&fcloop_lock, flags); =20 kfree(opts); - return newnport; + return nport; =20 -out_invalid_opts: - spin_unlock_irqrestore(&fcloop_lock, flags); +out_put_nport: + if (lport) + fcloop_lport_put(lport); + fcloop_nport_put(nport); out_free_newnport: + spin_unlock_irqrestore(&fcloop_lock, flags); kfree(newnport); out_free_opts: kfree(opts); - return nport; + return NULL; } =20 static ssize_t --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9063A284B47 for ; Thu, 10 Apr 2025 11:41:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285281; cv=none; b=RUxXuvLspv+Zcu18s3nxWjDEXJPUNBzhM8+y+somjHix3agEFEH7ga+xBZaIoewvjG/ANk6nvvtWsj80GfqLkayy0bImB91RMrH3IGWHfkT6+FN1GpApuWUKSY2eQkTqX2fpEjxD9Q59Zq0Z8ZPDw7IWHAHU1/QSYtLetWlj8bs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285281; c=relaxed/simple; bh=F6amLIDQUFRoq7o9H5ZznvD/2tad4/3TkumHpgROHvE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CaboLLYFbG6ITdzAnGwAnGQDTSGbvEsZTO4W1/274GDc1bu2gGr/fpnj+tQwxIWeti0zGsViSafUiNMwl2QbqJKwZhHeo0hc1jwKRTzlrERjwC1cgpWxv13o14Lic1EFt5L5fEq9yG0XDvCXi+WJTc19q4PxVzcD9uio5ICU1ao= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=b3GnRhVH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="b3GnRhVH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AE7B0C4CEEE; Thu, 10 Apr 2025 11:41:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285281; bh=F6amLIDQUFRoq7o9H5ZznvD/2tad4/3TkumHpgROHvE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=b3GnRhVHYh8qPegXoQx+EUNzTsbNdojx6k+vSBid2yX7Ct82EOddOc3Hv/NYbc1Ee S/7pzWJieRWVzaUbW52uQ5Z/cX3JojW070pPccBLe6PVYauxmCIEjHdgb00eZF0CtN t9resfh9eVAfj8FIlRbGyvXHPqBQ4R6KdyzjIxKD4AXQB9ht1WooYRvcMwSF1CKyYU t+Ha0/+J5IcDYvuii8mLSaT0TW7069aJN63WwqzjFHfR35TyUGoVoHruRnXFlpstix aEJXtCVR7JeE0f59PdBZ8Vtabe0rnw3Sk6PM7VB9ueILyIWzrgfPULCrF1xygyc0hq 25WnzfEPJDB3w== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:07 +0200 Subject: [PATCH v4 04/14] nvmet-fcloop: refactor fcloop_delete_local_port Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-4-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Use the newly introduced fcloop_lport_lookup instead of the open coded version. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index a8134127ad8087190d674251a88545da3f8800d7..1a8ae33c1699be3b7a2a7170dff= 77e324c127ebb 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1256,32 +1256,32 @@ __fcloop_lport_lookup(u64 node_name, u64 port_name) return NULL; } =20 +static struct fcloop_lport * +fcloop_lport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_lport *lport; + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + lport =3D __fcloop_lport_lookup(node_name, port_name); + spin_unlock_irqrestore(&fcloop_lock, flags); + + return lport; +} + static ssize_t fcloop_delete_local_port(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct fcloop_lport *tlport, *lport =3D NULL; + struct fcloop_lport *lport; u64 nodename, portname; - unsigned long flags; int ret; =20 ret =3D fcloop_parse_nm_options(dev, &nodename, &portname, buf); if (ret) return ret; =20 - spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tlport, &fcloop_lports, lport_list) { - if (tlport->localport->node_name =3D=3D nodename && - tlport->localport->port_name =3D=3D portname) { - if (!fcloop_lport_get(tlport)) - break; - lport =3D tlport; - break; - } - } - spin_unlock_irqrestore(&fcloop_lock, flags); - + lport =3D fcloop_lport_lookup(nodename, portname); if (!lport) return -ENOENT; =20 --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 161DE284B5E for ; Thu, 10 Apr 2025 11:41:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285284; cv=none; b=TxYjNUu1tzDJ8AM92jhWneV9Y9rzcUrdQeYEcmlk9PTQKQSwdeEvvw16aCtuWuvbQwLuEkJ+K3T8wTgnrLEk6bDcfsAeYTW0VEWv5WHUKckwN42B8I/qFgslXqTxWtCJBZnhSeWp/+SXlh+w6frpDht73uqW9++PvkkTCQ8/vXw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285284; c=relaxed/simple; bh=EWB/sYzoB8CsG9hgCZR+RFlRMAyDx5p/cXloDsy+UNE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FebLPOsz9vnEN8YOxizZjLJNkUEhXE5YQK4QHD1KjDdP+oT459A2W0pWpSG1VVXDhTFxbRIm5LofSSj2jdREHyv3cUE5aVOTnjWlmxxmbAWpBuI8v76Ee53fAup3Xo3EPlTJkOxwb/jjut6vH0L7pxHaWk4oxorlfSoyzfuiJwY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JPUZt9RS; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JPUZt9RS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37028C4CEDD; Thu, 10 Apr 2025 11:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285283; bh=EWB/sYzoB8CsG9hgCZR+RFlRMAyDx5p/cXloDsy+UNE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JPUZt9RSeiO/4YQ+MT8jIdFJcRgt7qA0dP1SZOktGtqhvXqAISDEIbq6F9H+FNjYK BPER5HUO1SHEV23d3JJJXIcejJuZMYL+AEi7+XNrdc3vpATcgOBSgdB0AAB7pvBpg5 qEFm3brS/PLSabgWffWrZD4H9nmdupYyXGbOfl+q/8/So3wJgptnWdGl4h9b1DCBv5 kMMF8Z6inz4Z9PSJ6Pb4JLV816MmwYD07c0v4IUiwimX+FPlIPQodC21sH4hhgtW3X KkVbGAH3zDiQOjqk4bDAVSzQkBmRCbqJYKW/MmDcl79nUPGhZP9ctmbPCadd+ungjH 7gV5MvrXbtA2Q== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:08 +0200 Subject: [PATCH v4 05/14] nvmet-fcloop: update refs on tfcp_req Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-5-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Track the lifetime of the in-flight tfcp_req to ensure the object is not freed too early. Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 1a8ae33c1699be3b7a2a7170dff77e324c127ebb..b54467b285181d6909c6592eb16= 6cf4fe6fbe54c 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -566,7 +566,8 @@ fcloop_call_host_done(struct nvmefc_fcp_req *fcpreq, } =20 /* release original io reference on tgt struct */ - fcloop_tfcp_req_put(tfcp_req); + if (tfcp_req) + fcloop_tfcp_req_put(tfcp_req); } =20 static bool drop_fabric_opcode; @@ -671,6 +672,7 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) break; default: spin_unlock_irqrestore(&tfcp_req->reqlock, flags); + fcloop_tfcp_req_put(tfcp_req); WARN_ON(1); return; } @@ -958,8 +960,10 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, =20 spin_lock(&inireq->inilock); tfcp_req =3D inireq->tfcp_req; - if (tfcp_req) - fcloop_tfcp_req_get(tfcp_req); + if (tfcp_req) { + if (!fcloop_tfcp_req_get(tfcp_req)) + tfcp_req =3D NULL; + } spin_unlock(&inireq->inilock); =20 if (!tfcp_req) --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9062A2853F5 for ; Thu, 10 Apr 2025 11:41:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285286; cv=none; b=dMKbyOFQ2SuAarlK5VcqD7BUjnll6jr/Kx2T9scY9+VWnojXZdD6QYWZeeBKbdETs1Uh+cUjgINBsH4lITFCf1y1q6d+7eGXwBIeiyIDPVC0iFoGh3eRFFIVeg+fkLbVyU5m5TUr0XrZHEpKHb1XPJmOoXqR/NWZ25J7ph7mKqA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285286; c=relaxed/simple; bh=gsPh10Lo83G0mW4lltW0uPRenCo3upye1tmBE7bC6JA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pPED1Dv7hE4hwMhPox+CQi5KLX9kOCYxYkMw6HOAUnZ3xbKPvGAaI8pi+T1SAWPIOv6DoMxKr4PSYGsU3pBNqNm68Np465Zwm63aaeFKK8acEjda+DPXgNt9n9MNHR0E0yxriImYuv3qUTxmbMAKvNRric9ftJjNGJ19lmh3Zuw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uTocnAdO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uTocnAdO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AADB1C4CEEA; Thu, 10 Apr 2025 11:41:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285286; bh=gsPh10Lo83G0mW4lltW0uPRenCo3upye1tmBE7bC6JA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=uTocnAdOBpZdHRCjpIy9DsGg7NpJQLu63ymhBc829iPlAgqT9PR9MoJD9kdBXJZtX R+y0KDrnvCQca4RurmBVtkrfxNzp3S5YWICZbtYzsvV7BGfEGvzch+2HPfeaP8uBbb eYTnMJ5rzf3XkBr/TgYY87pFsNDj1G0lgGVk+N6ZQydYva92LW7eciwKqhTEld8+/1 IvJXXGYWx2GKi1GJ8Oc1DdOfqtyltAPleyq2gE0MG88xF+Ln9dVUgFmRPImYdqWYrV LxLwm+kPj3AXqMXKSPRAtKWtJcoMdkFZ6RUQ39mnIANcEOLm4OcbF0NHcEgT+uC/i7 vCAKQS1RF7vig== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:09 +0200 Subject: [PATCH v4 06/14] nvmet-fcloop: add missing fcloop_callback_host_done Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-6-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Add the missing fcloop_call_host_done calls so that the caller frees resources when something goes wrong. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index b54467b285181d6909c6592eb166cf4fe6fbe54c..0c0117e03adc81c643e90a7e783= 2ff087a4c2fd7 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -966,9 +966,10 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, } spin_unlock(&inireq->inilock); =20 - if (!tfcp_req) + if (!tfcp_req) { /* abort has already been called */ - return; + goto out_host_done; + } =20 /* break initiator/target relationship for io */ spin_lock_irqsave(&tfcp_req->reqlock, flags); @@ -983,7 +984,7 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, default: spin_unlock_irqrestore(&tfcp_req->reqlock, flags); WARN_ON(1); - return; + goto out_host_done; } spin_unlock_irqrestore(&tfcp_req->reqlock, flags); =20 @@ -997,6 +998,11 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, */ fcloop_tfcp_req_put(tfcp_req); } + + return; + +out_host_done: + fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); } =20 static void --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1834285409 for ; Thu, 10 Apr 2025 11:41:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285288; cv=none; b=TlzyHhHBOvrSo0fS0ptG5H8K1u2ITADVWvhMN40pQJuhcv3e5os5PR0uNACeQnTWZSJB4A1GOh/s5Pq0F1t3sz5HzZY2lHNUkXtNPH7O368aoJ1klqQfoB7ZlnXEaf0PAYi3ImGVSnvz2G0fi4bufVcKVjHAVnvGyLd9RGYTMXo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285288; c=relaxed/simple; bh=bWfF/z6J6VjDnFu295fwOKQGsLQiUbigzuCMF8Epxkw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=brEFf/UA/g0Rbh4LWR4TCWpPDgefEzfsdLMZyynjtjy/9/GKY9zravRGlo/YAClZGm/W2wfWfCgYZqtm/iylqdNODl1yvL0eZi8woJhRivMgM/Tg9DgAIvGnmMOhJpPSpkN1/blTdknddOKAZodvgkEbayVnEIICZ4ghMfFJRYc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JPiVKglf; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JPiVKglf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3438FC4CEE3; Thu, 10 Apr 2025 11:41:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285288; bh=bWfF/z6J6VjDnFu295fwOKQGsLQiUbigzuCMF8Epxkw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JPiVKglfVo+fyuImYcbulSnJ7vhHV+tBKSfXGj1B0SpwuzPduy5PAe8H9E6JRewjc kCGDaNHa6PCDQFZmHCIBWpNrM8U3na1TqiVFdSNq0FUAV/G2yHgZptx21kAHEuV4Iq g7Q7WXa8Gdt3DoU8EZ5NOGWJrPbZAtC0DZlbbWK7LHO1aKydPOx5dJpiMpEUeUakRv xgV/daa9VIBExMnf6geVP/zgpIZLtxDEacLmwjCPjKgOQl0r9WZbjYmxyfXzhP8kU6 bzcTOKTstm+QC0Z6pOdNJ0IAjA2JgStNQRdjXG5X3u84xH/xOhbbXhV0BCfGsaieg5 qsgKITGpMWqbw== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:10 +0200 Subject: [PATCH v4 07/14] nvmet-fcloop: access fcpreq only when holding reqlock Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-7-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The abort handling logic expects that the state and the fcpreq are only accessed when holding the reqlock lock. While at it, only handle the aborts in the abort handler. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 0c0117e03adc81c643e90a7e7832ff087a4c2fd7..9adaee3c7129f7e270842c5d09f= 78de2e108479a 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -619,12 +619,13 @@ fcloop_fcp_recv_work(struct work_struct *work) { struct fcloop_fcpreq *tfcp_req =3D container_of(work, struct fcloop_fcpreq, fcp_rcv_work); - struct nvmefc_fcp_req *fcpreq =3D tfcp_req->fcpreq; + struct nvmefc_fcp_req *fcpreq; unsigned long flags; int ret =3D 0; bool aborted =3D false; =20 spin_lock_irqsave(&tfcp_req->reqlock, flags); + fcpreq =3D tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_START: tfcp_req->inistate =3D INI_IO_ACTIVE; @@ -639,16 +640,19 @@ fcloop_fcp_recv_work(struct work_struct *work) } spin_unlock_irqrestore(&tfcp_req->reqlock, flags); =20 - if (unlikely(aborted)) - ret =3D -ECANCELED; - else { - if (likely(!check_for_drop(tfcp_req))) - ret =3D nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, - &tfcp_req->tgt_fcp_req, - fcpreq->cmdaddr, fcpreq->cmdlen); - else - pr_info("%s: dropped command ********\n", __func__); + if (unlikely(aborted)) { + /* the abort handler will call fcloop_call_host_done */ + return; + } + + if (unlikely(check_for_drop(tfcp_req))) { + pr_info("%s: dropped command ********\n", __func__); + return; } + + ret =3D nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, + &tfcp_req->tgt_fcp_req, + fcpreq->cmdaddr, fcpreq->cmdlen); if (ret) fcloop_call_host_done(fcpreq, tfcp_req, ret); } @@ -663,9 +667,10 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) unsigned long flags; =20 spin_lock_irqsave(&tfcp_req->reqlock, flags); - fcpreq =3D tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_ABORTED: + fcpreq =3D tfcp_req->fcpreq; + tfcp_req->fcpreq =3D NULL; break; case INI_IO_COMPLETED: completed =3D true; @@ -688,10 +693,6 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) nvmet_fc_rcv_fcp_abort(tfcp_req->tport->targetport, &tfcp_req->tgt_fcp_req); =20 - spin_lock_irqsave(&tfcp_req->reqlock, flags); - tfcp_req->fcpreq =3D NULL; - spin_unlock_irqrestore(&tfcp_req->reqlock, flags); - fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); /* call_host_done releases reference for abort downcall */ } --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DB462857C5 for ; Thu, 10 Apr 2025 11:41:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285291; cv=none; b=I+w4cx/B0TVRRgtLgfCLqSHB8NEvxiz4qBeWBFZq4FIbDonHc5I4sr3ct6ACw7hp2tX4McbvbwOesj2VTyOHvgrajKdSFmDtISQJr926kyVBwtkRFslNiA0N+PYfN8cTOKy93cW9VKqTHpyvNzi/H/fgwfuUDQrIkS86NVP08qY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285291; c=relaxed/simple; bh=YmvfucME6p9mQbq10tqk6j4ONnoLmEFU9LLeZ/eqRUU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZozUfXWBeWg2Goh0Cx7PhapypRUuVaPUKV11wbvOCNhzi78M/WYG7hB7ZeyN0LbB+ILuZEfLWM0xHXcekgyod1xucWBCGza6t7jnIdkobrpWrXpwINafAJX1H6LC1njOD/t4Bia8xHW5Sdokv8UAOU2GMdEi4cPOgL07TzEeiII= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OAKdTuuO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OAKdTuuO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AFF79C4CEDD; Thu, 10 Apr 2025 11:41:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285291; bh=YmvfucME6p9mQbq10tqk6j4ONnoLmEFU9LLeZ/eqRUU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=OAKdTuuOp3z+8uQkNv+aYvD/BSRa/BluRzuoMfRxj5aP+P8AsZcwiJ/qXpNUbznfA 9nXZRh9HRwWKY72Rvyu+hUlacQ1Y84yroRWxdn8eYwR4JWfnNVsMl2GwqAxTMCF3PU ym1OT7WOKMZXb1xNgQ9q6CAZzoBSxN313U63O2WJ4IbGokGkWHOG3Igga9GYp3HO5U OoOe/Z8aU5bVw2VseXZoRU5Pq6pB9NMoZI7Dp/Jkse59+ovaAH0BERdUv4MXnRHpZV riCSUR8PiI3gLiAemLOuOFEkYordcoDPB5Y7H/u0m9op8Z5ynf3T8/3Zw/ugrihvcn kiTgNRnWoy8XQ== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:11 +0200 Subject: [PATCH v4 08/14] nvmet-fcloop: prevent double port deletion Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-8-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The delete callback can be called either via the unregister function or from the transport directly. Thus it is necessary ensure resources are not freed multiple times. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 9adaee3c7129f7e270842c5d09f78de2e108479a..014cc66f92cb1db0a81a79d2109= eae3fff5fd38a 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -215,6 +215,9 @@ struct fcloop_lport_priv { struct fcloop_lport *lport; }; =20 +/* The port is already being removed, avoid double free */ +#define PORT_DELETED 0 + struct fcloop_rport { struct nvme_fc_remote_port *remoteport; struct nvmet_fc_target_port *targetport; @@ -223,6 +226,7 @@ struct fcloop_rport { spinlock_t lock; struct list_head ls_list; struct work_struct ls_work; + unsigned long flags; }; =20 struct fcloop_tport { @@ -233,6 +237,7 @@ struct fcloop_tport { spinlock_t lock; struct list_head ls_list; struct work_struct ls_work; + unsigned long flags; }; =20 struct fcloop_nport { @@ -1067,14 +1072,20 @@ static void fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) { struct fcloop_rport *rport =3D remoteport->private; + bool delete_port =3D true; unsigned long flags; =20 flush_work(&rport->ls_work); =20 spin_lock_irqsave(&fcloop_lock, flags); + if (test_and_set_bit(PORT_DELETED, &rport->flags)) + delete_port =3D false; rport->nport->rport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (!delete_port) + return; + fcloop_nport_put(rport->nport); } =20 @@ -1082,14 +1093,20 @@ static void fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) { struct fcloop_tport *tport =3D targetport->private; + bool delete_port =3D true; unsigned long flags; =20 flush_work(&tport->ls_work); =20 spin_lock_irqsave(&fcloop_lock, flags); + if (test_and_set_bit(PORT_DELETED, &tport->flags)) + delete_port =3D false; tport->nport->tport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (!delete_port) + return; + fcloop_nport_put(tport->nport); } =20 @@ -1433,6 +1450,7 @@ fcloop_create_remote_port(struct device *dev, struct = device_attribute *attr, rport->nport =3D nport; rport->lport =3D nport->lport; nport->rport =3D rport; + rport->flags =3D 0; spin_lock_init(&rport->lock); INIT_WORK(&rport->ls_work, fcloop_rport_lsrqst_work); INIT_LIST_HEAD(&rport->ls_list); @@ -1530,6 +1548,7 @@ fcloop_create_target_port(struct device *dev, struct = device_attribute *attr, tport->nport =3D nport; tport->lport =3D nport->lport; nport->tport =3D tport; + tport->flags =3D 0; spin_lock_init(&tport->lock); INIT_WORK(&tport->ls_work, fcloop_tport_lsrqst_work); INIT_LIST_HEAD(&tport->ls_list); --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A6DDA2857DB for ; Thu, 10 Apr 2025 11:41:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285293; cv=none; b=sz98PbqA0oLlS1qLc9XTEhIet1UFiNbLcfHSSDP7DhvqfaUJzvelhgMgvpMl0hgm/yG1JICyMMOP3tcpGpJgMkrXyANRsz3bMSfiVUFNVi6NpbHNfEb8/7LVpLOAk6IR5lgPvG4SzGrdXbME5FLC7k0dAlr+PPueG0S8ApGg5zo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285293; c=relaxed/simple; bh=mXSrbFVuNJV6VkeoxAR0XoweTJRrbm3vnqZ/Tfb8XTU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IgB51V6KRavuyl1+YL1KNj/3VQSMChRtueQPj4ksFCUZSY4LOjV4CuRzhhBP7Vq807GOvzQWqlx8pXQNa2Xm7YbJzTG61dD6/x58L+o5iiqGcCLHBfMwislD6ocyRxC36oycwXK6nRQ1b2rqKR5xdpEG+6N9eliZiktnMUeb+iU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=t1E2Dw/Y; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="t1E2Dw/Y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 32616C4CEE3; Thu, 10 Apr 2025 11:41:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285293; bh=mXSrbFVuNJV6VkeoxAR0XoweTJRrbm3vnqZ/Tfb8XTU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=t1E2Dw/YfggToWw8ncn614jn4Ni5v4/5WRmuWFlrgjEVFc3fhIjKFsdATcdnpeOo8 XM/1xeyKNttK8T+mqzMSHmU1K6UaC6BxHlqblEbNozwasq3GEMt92DRB6e4kxPmghN tWKGrN4CEqSn0xQEv2DOkrXlV225sT797VT5kf+vuTZ4HCdDuanv44bm89qqWh4Un2 G0JxRYqqbRf9spZt8GS7c3zqvA4kZ2+IXxjD9mI9CZ29tjXDWYpYwulfI13xjhD7zP UW7RXKIWA9CdiiTbz20dxYPl/4V5aiQCVIa/+Y62OGrhC8tIcsECgb9WAmbAP5VK9k /SYPgs8eRtSQg== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:12 +0200 Subject: [PATCH v4 09/14] nvmet-fcloop: allocate/free fcloop_lsreq directly Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-9-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 fcloop depends on the host or the target to allocate the fcloop_lsreq object. This means that the lifetime of the fcloop_lsreq is tied to either the host or the target. Consequently, the host or the target must cooperate during shutdown. Unfortunately, this approach does not work well when the target forces a shutdown, as there are dependencies that are difficult to resolve in a clean way. The simplest solution is to decouple the lifetime of the fcloop_lsreq object by managing them directly within fcloop. Since this is not a performance-critical path and only a small number of LS objects are used during setup and cleanup, it does not significantly impact performance to allocate them during normal operation. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 63 +++++++++++++++++++++++++++++++---------= ---- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 014cc66f92cb1db0a81a79d2109eae3fff5fd38a..47ce51183a66b4b37fc850cced2= ddf70be2cdb42 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -293,6 +293,9 @@ struct fcloop_ini_fcpreq { spinlock_t inilock; }; =20 +/* SLAB cache for fcloop_lsreq structures */ +struct kmem_cache *lsreq_cache; + static inline struct fcloop_lsreq * ls_rsp_to_lsreq(struct nvmefc_ls_rsp *lsrsp) { @@ -343,6 +346,7 @@ fcloop_rport_lsrqst_work(struct work_struct *work) * callee may free memory containing tls_req. * do not reference lsreq after this. */ + kmem_cache_free(lsreq_cache, tls_req); =20 spin_lock(&rport->lock); } @@ -354,10 +358,13 @@ fcloop_h2t_ls_req(struct nvme_fc_local_port *localpor= t, struct nvme_fc_remote_port *remoteport, struct nvmefc_ls_req *lsreq) { - struct fcloop_lsreq *tls_req =3D lsreq->private; struct fcloop_rport *rport =3D remoteport->private; + struct fcloop_lsreq *tls_req; int ret =3D 0; =20 + tls_req =3D kmem_cache_alloc(lsreq_cache, GFP_KERNEL); + if (!tls_req) + return -ENOMEM; tls_req->lsreq =3D lsreq; INIT_LIST_HEAD(&tls_req->ls_list); =20 @@ -394,14 +401,17 @@ fcloop_h2t_xmt_ls_rsp(struct nvmet_fc_target_port *ta= rgetport, =20 lsrsp->done(lsrsp); =20 - if (remoteport) { - rport =3D remoteport->private; - spin_lock(&rport->lock); - list_add_tail(&tls_req->ls_list, &rport->ls_list); - spin_unlock(&rport->lock); - queue_work(nvmet_wq, &rport->ls_work); + if (!remoteport) { + kmem_cache_free(lsreq_cache, tls_req); + return 0; } =20 + rport =3D remoteport->private; + spin_lock(&rport->lock); + list_add_tail(&tls_req->ls_list, &rport->ls_list); + spin_unlock(&rport->lock); + queue_work(nvmet_wq, &rport->ls_work); + return 0; } =20 @@ -427,6 +437,7 @@ fcloop_tport_lsrqst_work(struct work_struct *work) * callee may free memory containing tls_req. * do not reference lsreq after this. */ + kmem_cache_free(lsreq_cache, tls_req); =20 spin_lock(&tport->lock); } @@ -437,8 +448,8 @@ static int fcloop_t2h_ls_req(struct nvmet_fc_target_port *targetport, void *hosthandl= e, struct nvmefc_ls_req *lsreq) { - struct fcloop_lsreq *tls_req =3D lsreq->private; struct fcloop_tport *tport =3D targetport->private; + struct fcloop_lsreq *tls_req; int ret =3D 0; =20 /* @@ -446,6 +457,10 @@ fcloop_t2h_ls_req(struct nvmet_fc_target_port *targetp= ort, void *hosthandle, * hosthandle ignored as fcloop currently is * 1:1 tgtport vs remoteport */ + + tls_req =3D kmem_cache_alloc(lsreq_cache, GFP_KERNEL); + if (!tls_req) + return -ENOMEM; tls_req->lsreq =3D lsreq; INIT_LIST_HEAD(&tls_req->ls_list); =20 @@ -462,6 +477,9 @@ fcloop_t2h_ls_req(struct nvmet_fc_target_port *targetpo= rt, void *hosthandle, ret =3D nvme_fc_rcv_ls_req(tport->remoteport, &tls_req->ls_rsp, lsreq->rqstaddr, lsreq->rqstlen); =20 + if (ret) + kmem_cache_free(lsreq_cache, tls_req); + return ret; } =20 @@ -481,14 +499,17 @@ fcloop_t2h_xmt_ls_rsp(struct nvme_fc_local_port *loca= lport, lsreq->rsplen : lsrsp->rsplen)); lsrsp->done(lsrsp); =20 - if (targetport) { - tport =3D targetport->private; - spin_lock(&tport->lock); - list_add_tail(&tls_req->ls_list, &tport->ls_list); - spin_unlock(&tport->lock); - queue_work(nvmet_wq, &tport->ls_work); + if (!targetport) { + kmem_cache_free(lsreq_cache, tls_req); + return 0; } =20 + tport =3D targetport->private; + spin_lock(&tport->lock); + list_add_tail(&tls_req->ls_list, &tport->ls_list); + spin_unlock(&tport->lock); + queue_work(nvmet_wq, &tport->ls_work); + return 0; } =20 @@ -1131,7 +1152,6 @@ static struct nvme_fc_port_template fctemplate =3D { /* sizes of additional private data for data structures */ .local_priv_sz =3D sizeof(struct fcloop_lport_priv), .remote_priv_sz =3D sizeof(struct fcloop_rport), - .lsrqst_priv_sz =3D sizeof(struct fcloop_lsreq), .fcprqst_priv_sz =3D sizeof(struct fcloop_ini_fcpreq), }; =20 @@ -1154,7 +1174,6 @@ static struct nvmet_fc_target_template tgttemplate = =3D { .target_features =3D 0, /* sizes of additional private data for data structures */ .target_priv_sz =3D sizeof(struct fcloop_tport), - .lsrqst_priv_sz =3D sizeof(struct fcloop_lsreq), }; =20 static ssize_t @@ -1674,15 +1693,20 @@ static const struct class fcloop_class =3D { }; static struct device *fcloop_device; =20 - static int __init fcloop_init(void) { int ret; =20 + lsreq_cache =3D kmem_cache_create("lsreq_cache", + sizeof(struct fcloop_lsreq), 0, + 0, NULL); + if (!lsreq_cache) + return -ENOMEM; + ret =3D class_register(&fcloop_class); if (ret) { pr_err("couldn't register class fcloop\n"); - return ret; + goto out_destroy_cache; } =20 fcloop_device =3D device_create_with_groups( @@ -1700,6 +1724,8 @@ static int __init fcloop_init(void) =20 out_destroy_class: class_unregister(&fcloop_class); +out_destroy_cache: + kmem_cache_destroy(lsreq_cache); return ret; } =20 @@ -1765,6 +1791,7 @@ static void __exit fcloop_exit(void) =20 device_destroy(&fcloop_class, MKDEV(0, 0)); class_unregister(&fcloop_class); + kmem_cache_destroy(lsreq_cache); } =20 module_init(fcloop_init); --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 361C6283CB5 for ; Thu, 10 Apr 2025 11:41:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285296; cv=none; b=Vw8qK7P/HRE25Yf86PYbEoHudb5os26yxb7VEtNOOem86coInMFMdePdHgt7WtW0biquKj6OH8jLeTAJJGWEgANKYodohgABjjdrRiovQlHn8IT/bfwPdnGtHA8Aw6wg65me5QHwlak3lAcdaXCP+XqJ7SSRf6TjyDmkp6OhBlU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285296; c=relaxed/simple; bh=TzcGZfdwmdfAFPVttrRv4/p72KsoezPGz0D2QH9DrFQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AihZ+Pz72WKz6TSZAzc3L3WOK2/XcHB201LoDWmYG5W/mC4cgabJa5KxwpWtfFxPvfrdRhc91ZocAWhAMK520V4PGZRbsPQZXx2Eag9yRblSpN4O2XRgUJ1vqQSJilhGEz+GHwel/lPiH09YlVCuceLisyaMuEY0HgJnU8f1quQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gyg2oaoE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gyg2oaoE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B7E1EC4CEE3; Thu, 10 Apr 2025 11:41:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285296; bh=TzcGZfdwmdfAFPVttrRv4/p72KsoezPGz0D2QH9DrFQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=gyg2oaoEXkHrhB4O2ADFNyiyN9QhK298KwQVdeoSAUsldopps39bjhYDF5Ftszt4m KU9n/XZnKn0e0ftM5RTz3lC3zItQFd/b3tixkrkoEKxFsDA01k5s0wnBTKenGFZDxT 6UfkeACIPmUBPJkh3LNB3mwsBGxXFv0NmXswgx9ntaux34gHnM4A3tqC9Ng37xWzi5 YvZOAhybD+dARu2+ALAIuyz7OakiEyKk63h8l47voLDQFX5kpYkxXP8gQUh0F6ACSB FWN9EhytN8tNi97vXAThzhP2KTk9AIvLX3tb8WLIxjFm0H+OLyDvwI76ze0y5PSArH D3iYlvr60fcHw== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:13 +0200 Subject: [PATCH v4 10/14] nvmet-fcloop: don't wait for lport cleanup Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-10-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The lifetime of the fcloop_lsreq is not tight to the lifetime of the host or target port, thus there is no need anymore to synchronize the cleanup path anymore. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 47ce51183a66b4b37fc850cced2ddf70be2cdb42..ca11230bffedb0f2313a99e24e5= 4e892daf0d644 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -207,7 +207,6 @@ static LIST_HEAD(fcloop_nports); struct fcloop_lport { struct nvme_fc_local_port *localport; struct list_head lport_list; - struct completion unreg_done; refcount_t ref; }; =20 @@ -1083,9 +1082,6 @@ fcloop_localport_delete(struct nvme_fc_local_port *lo= calport) struct fcloop_lport_priv *lport_priv =3D localport->private; struct fcloop_lport *lport =3D lport_priv->lport; =20 - /* release any threads waiting for the unreg to complete */ - complete(&lport->unreg_done); - fcloop_lport_put(lport); } =20 @@ -1238,18 +1234,9 @@ fcloop_create_local_port(struct device *dev, struct = device_attribute *attr, } =20 static int -__wait_localport_unreg(struct fcloop_lport *lport) +__localport_unreg(struct fcloop_lport *lport) { - int ret; - - init_completion(&lport->unreg_done); - - ret =3D nvme_fc_unregister_localport(lport->localport); - - if (!ret) - wait_for_completion(&lport->unreg_done); - - return ret; + return nvme_fc_unregister_localport(lport->localport); } =20 static struct fcloop_nport * @@ -1332,7 +1319,7 @@ fcloop_delete_local_port(struct device *dev, struct d= evice_attribute *attr, if (!lport) return -ENOENT; =20 - ret =3D __wait_localport_unreg(lport); + ret =3D __localport_unreg(lport); fcloop_lport_put(lport); =20 return ret ? ret : count; @@ -1776,7 +1763,7 @@ static void __exit fcloop_exit(void) =20 spin_unlock_irqrestore(&fcloop_lock, flags); =20 - ret =3D __wait_localport_unreg(lport); + ret =3D __localport_unreg(lport); if (ret) pr_warn("%s: Failed deleting local port\n", __func__); =20 --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2D09D28A3E4 for ; Thu, 10 Apr 2025 11:41:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285299; cv=none; b=RSUBAgZe2kB2JGOssuURzSr5iTofST7VbV2ZFbX/ybg3eG18rTSUpn4092x1TPpXas4qekRAeRLwfw4DzZSFvKLyAU8Ng5qC3QgTjkYgaz0+kW/c+qLmwPu7qguIjxajc9eFxArHBvsPXJ2P1w1bs/fLOHUKhqXZCI9RQ/8cqiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285299; c=relaxed/simple; bh=6MtNYpYf3+gfKph3AscTQcqFhTmhfVMJlOnasxAT7Vg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fQ/0szaapfHyAaykXke4if/yBRDhhEQTx5wJSshhlFhs3Jqt38IxaDNgKc7L37BxAjd9XlV+1ANJlWrmGDXFlsaB2sYKjmyO754gIPwF1emtQPTk7tTKlTy/Fxmo1d/WZKEp15M2pMy60h7e6K5E3WcKmvuyC2G+iI8m7nzeonk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RKYrhUOP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RKYrhUOP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 527F5C4CEE3; Thu, 10 Apr 2025 11:41:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285298; bh=6MtNYpYf3+gfKph3AscTQcqFhTmhfVMJlOnasxAT7Vg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RKYrhUOPJX2S7Twyok9CWRNVkP79/thYWfoZHsLWwPfQUys5rs3pPZi07wg4FMbEo tmo1PY40RnSuE8kNIejj6yqiQm5E9Mj71/XfQXO5VENYiPuQPgzP5Bel1NYbj91y9L ra6qH67yPlJWLkNyO/5m4YZeC6nRVCY37emDAEcDhkJOOCBpH9T7K+UhVNpgkjrwEa pQbMB8RKlNa8yJA0nAZCh45s1OgykraEQ9S5I/a6B8yaNFzu4Zl9f6EfamRqfkTrSr gZ02aGF8tFQgFtsp3iwTB/R/7smIN3OVEzlGbx3aZ5sp7gT4UGVO1IVT+/DyvBP9ZJ +K1sEGW9jqv9A== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:14 +0200 Subject: [PATCH v4 11/14] nvmet-fcloop: drop response if targetport is gone Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-11-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 When the target port is gone, the lsrsp pointer is invalid. Thus don't call the done function anymore instead just drop the response. This happens when the target sends a disconnect association. After this the target starts tearing down all resources and doesn't expect any response. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index ca11230bffedb0f2313a99e24e54e892daf0d644..bb45721ec0f028399d810cbd789= 1bc6975801752 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -493,16 +493,25 @@ fcloop_t2h_xmt_ls_rsp(struct nvme_fc_local_port *loca= lport, struct nvmet_fc_target_port *targetport =3D rport->targetport; struct fcloop_tport *tport; =20 - memcpy(lsreq->rspaddr, lsrsp->rspbuf, - ((lsreq->rsplen < lsrsp->rsplen) ? - lsreq->rsplen : lsrsp->rsplen)); - lsrsp->done(lsrsp); - if (!targetport) { + /* + * The target port is gone. The target doesn't expect any + * response anymore and the ->done call is not valid + * because the resources have been freed by + * nvmet_fc_free_pending_reqs. + * + * We end up here from delete association exchange: + * nvmet_fc_xmt_disconnect_assoc sends an async request. + */ kmem_cache_free(lsreq_cache, tls_req); return 0; } =20 + memcpy(lsreq->rspaddr, lsrsp->rspbuf, + ((lsreq->rsplen < lsrsp->rsplen) ? + lsreq->rsplen : lsrsp->rsplen)); + lsrsp->done(lsrsp); + tport =3D targetport->private; spin_lock(&tport->lock); list_add_tail(&tls_req->ls_list, &tport->ls_list); --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A923E28A3F1 for ; Thu, 10 Apr 2025 11:41:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285301; cv=none; b=HK9zK3YKUxTUuJzgjGcZxPRUxh763ZQEEiNoGvJigoVzxDqvvQ77e/mTgCdBgr5EYWDoQtJbd4vIHQjmSl9pWCrmArkOrcYF+sygHMnOnNfl5gwdGAmNIs8w1SlU2C6eMJ6efKjGICLdr/+3IUuJy9btFsBXmNnt7YkzosDonXE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285301; c=relaxed/simple; bh=NnHI6Paao3NgdBRHQkL+L4jcP1yEUV4TLY9mPyueH3w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nE9XC7Y7//66VRQX6N42SmMXeZ+L41dlYb0yTIMGsK+e3Eg46rbQm0PlcToss2IRh8LLn3ew9YMqAlm+dyVwD2x8et+inuSD9aEkXeA1J/ngfZUTsccwwiFp0GIEIRaVeu/gZaKJIMUPb6Zj0tRrno2BB+P/4JPZUybkUdAWpCE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=e2qKf0AM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="e2qKf0AM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C57C4C4CEDD; Thu, 10 Apr 2025 11:41:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285301; bh=NnHI6Paao3NgdBRHQkL+L4jcP1yEUV4TLY9mPyueH3w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=e2qKf0AMCaLLMEFGlYHPb6s/OE8opf6eKug2Fpx8tjsITRS6WK6LE2kjl+jA6mkdR 099OVM1euKWxtNzY6c6b25XfIZNbc1NOlutrjzyY4A1bf6opQO/9CJifvlof7gDkv0 yo7tmztcVKNGm0NxbAvcbSWMo3iQFUGJOZle0POJJBptYRuLf3vjGe7qrGgMG7Mvg/ gytvEqhb0OIs2vHG4QT/UC7ZsvpOm4Z0DswxG/faVC6SH8ZINxV5nLf+MlL+dNHu7y p9BOImNFhiDF83YV2lgAU2LA+vREOj8lVq+QcPOSrTXYzay8TkwWNzh2aJOpb1ERa/ FLz9CihdRXnyw== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:15 +0200 Subject: [PATCH v4 12/14] nvmet-fc: free pending reqs on tgtport unregister Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-12-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 When nvmet_fc_unregister_targetport is called by the LLDD, it's not possible to communicate with the host, thus all pending request will not be process. Thus explicitly free them. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner --- drivers/nvme/target/fc.c | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 7b50130f10f6578e6e49fe8ea661de34dfbb3683..75ddb7425605dd6623db38a133b= 63e201592354c 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1580,6 +1580,39 @@ nvmet_fc_delete_ctrl(struct nvmet_ctrl *ctrl) spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); } =20 +static void +nvmet_fc_free_pending_reqs(struct nvmet_fc_tgtport *tgtport) +{ + struct nvmet_fc_ls_req_op *lsop; + struct nvmefc_ls_req *lsreq; + struct nvmet_fc_ls_iod *iod; + int i; + + iod =3D tgtport->iod; + for (i =3D 0; i < NVMET_LS_CTX_COUNT; iod++, i++) + cancel_work(&iod->work); + + /* + * After this point the connection is lost and thus any pending + * request can't be processed by the normal completion path. This + * is likely a request from nvmet_fc_send_ls_req_async. + */ + while ((lsop =3D list_first_entry_or_null(&tgtport->ls_req_list, + struct nvmet_fc_ls_req_op, lsreq_list))) { + list_del(&lsop->lsreq_list); + + if (!lsop->req_queued) + continue; + + lsreq =3D &lsop->ls_req; + fc_dma_unmap_single(tgtport->dev, lsreq->rqstdma, + (lsreq->rqstlen + lsreq->rsplen), + DMA_BIDIRECTIONAL); + nvmet_fc_tgtport_put(tgtport); + kfree(lsop); + } +} + /** * nvmet_fc_unregister_targetport - transport entry point called by an * LLDD to deregister/remove a previously @@ -1608,13 +1641,7 @@ nvmet_fc_unregister_targetport(struct nvmet_fc_targe= t_port *target_port) =20 flush_workqueue(nvmet_wq); =20 - /* - * should terminate LS's as well. However, LS's will be generated - * at the tail end of association termination, so they likely don't - * exist yet. And even if they did, it's worthwhile to just let - * them finish and targetport ref counting will clean things up. - */ - + nvmet_fc_free_pending_reqs(tgtport); nvmet_fc_tgtport_put(tgtport); =20 return 0; --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C82DC28A406 for ; Thu, 10 Apr 2025 11:41:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285303; cv=none; b=Viunjf5wY8Nvt/NnPFX4BKr0Y9YaK8O5e6hu6qk3hnxfLu6lbqztEtU3irUinOQ7bncuLGRwf+mlv/5k2zL7CdXlsMIPylFFpRi0zuUJsoMZoByjT//Sq4j99z7vAnPzCYd2+XXRajTYPLy75DE1UAcpoxxTE9CU7GM5x1XBQ/Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285303; c=relaxed/simple; bh=fBx9lCEtPCxPfGwK8FPJiN/ERtJIwVRE9R9bu+NJtAM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PSNiUOEf4jYmLp67yQcOHwSfZXeuSyzvOVUNmggrZj3L3GV+Vtkb7MWZag1Xpgkydi8pamWCJHFECCQNWjaxz1sMBj9A4VHCndlhdAIZO9DMxvQT3/Qge/dePHEC6SK75ukRQgSLcaCoba5jYNcZ/rVLyfaPN1WG2l+oG9jJcm0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BBjUC+X4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BBjUC+X4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4B496C4CEE3; Thu, 10 Apr 2025 11:41:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285303; bh=fBx9lCEtPCxPfGwK8FPJiN/ERtJIwVRE9R9bu+NJtAM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=BBjUC+X4Pub6tnTDG2BVwJPLmYXImqSuFQ1czmvz9ocQSPutlJsnyJ+M1oz3gZmxe 3ridExuVNu86zziw8jX/8kdFqVYsUdej8Iv3+TE7J15l0e3eoIPFoO9dXnIdO4Q1Zm pCTIFS5j7eAOEY/UbrTn7xM2jXTvAGwC08SdotNm+WOTxbrAp9eKnw2zDMdc3s21LJ vrs6C5oSvxMGF2uGST9s2iW4HDWOErpc2Y/Ii52xxI4eV86SD2e1jB9sKJdYBTjJzl YU8bkSCmZIc/uQn2U654z0NfPT8y2aX9f97469JRac5i3clMpLvc5XPrHjPq6iZGpl /6BU0Mh7pMxQQ== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:16 +0200 Subject: [PATCH v4 13/14] nvmet-fc: take tgtport refs for portentry Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-13-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Ensure that the tgtport is not going away as long portentry has a pointer on it. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner --- drivers/nvme/target/fc.c | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 75ddb7425605dd6623db38a133b63e201592354c..2835772677f9486324ef77d9021= b49f8d153e916 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1254,6 +1254,7 @@ nvmet_fc_portentry_bind(struct nvmet_fc_tgtport *tgtp= ort, { lockdep_assert_held(&nvmet_fc_tgtlock); =20 + nvmet_fc_tgtport_get(tgtport); pe->tgtport =3D tgtport; tgtport->pe =3D pe; =20 @@ -1273,8 +1274,10 @@ nvmet_fc_portentry_unbind(struct nvmet_fc_port_entry= *pe) unsigned long flags; =20 spin_lock_irqsave(&nvmet_fc_tgtlock, flags); - if (pe->tgtport) + if (pe->tgtport) { + nvmet_fc_tgtport_put(pe->tgtport); pe->tgtport->pe =3D NULL; + } list_del(&pe->pe_list); spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); } @@ -1292,8 +1295,10 @@ nvmet_fc_portentry_unbind_tgt(struct nvmet_fc_tgtpor= t *tgtport) =20 spin_lock_irqsave(&nvmet_fc_tgtlock, flags); pe =3D tgtport->pe; - if (pe) + if (pe) { + nvmet_fc_tgtport_put(pe->tgtport); pe->tgtport =3D NULL; + } tgtport->pe =3D NULL; spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); } @@ -1316,6 +1321,9 @@ nvmet_fc_portentry_rebind_tgt(struct nvmet_fc_tgtport= *tgtport) list_for_each_entry(pe, &nvmet_fc_portentry_list, pe_list) { if (tgtport->fc_target_port.node_name =3D=3D pe->node_name && tgtport->fc_target_port.port_name =3D=3D pe->port_name) { + if (!nvmet_fc_tgtport_get(tgtport)) + continue; + WARN_ON(pe->tgtport); tgtport->pe =3D pe; pe->tgtport =3D tgtport; @@ -2887,12 +2895,17 @@ nvmet_fc_add_port(struct nvmet_port *port) list_for_each_entry(tgtport, &nvmet_fc_target_list, tgt_list) { if ((tgtport->fc_target_port.node_name =3D=3D traddr.nn) && (tgtport->fc_target_port.port_name =3D=3D traddr.pn)) { + if (!nvmet_fc_tgtport_get(tgtport)) + continue; + /* a FC port can only be 1 nvmet port id */ if (!tgtport->pe) { nvmet_fc_portentry_bind(tgtport, pe, port); ret =3D 0; } else ret =3D -EALREADY; + + nvmet_fc_tgtport_put(tgtport); break; } } @@ -2908,11 +2921,21 @@ static void nvmet_fc_remove_port(struct nvmet_port *port) { struct nvmet_fc_port_entry *pe =3D port->priv; + struct nvmet_fc_tgtport *tgtport =3D NULL; + unsigned long flags; + + spin_lock_irqsave(&nvmet_fc_tgtlock, flags); + if (pe->tgtport && nvmet_fc_tgtport_get(pe->tgtport)) + tgtport =3D pe->tgtport; + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); =20 nvmet_fc_portentry_unbind(pe); =20 - /* terminate any outstanding associations */ - __nvmet_fc_free_assocs(pe->tgtport); + if (tgtport) { + /* terminate any outstanding associations */ + __nvmet_fc_free_assocs(tgtport); + nvmet_fc_tgtport_put(tgtport); + } =20 kfree(pe); } @@ -2921,10 +2944,21 @@ static void nvmet_fc_discovery_chg(struct nvmet_port *port) { struct nvmet_fc_port_entry *pe =3D port->priv; - struct nvmet_fc_tgtport *tgtport =3D pe->tgtport; + struct nvmet_fc_tgtport *tgtport =3D NULL; + unsigned long flags; + + spin_lock_irqsave(&nvmet_fc_tgtlock, flags); + if (pe->tgtport && nvmet_fc_tgtport_get(pe->tgtport)) + tgtport =3D pe->tgtport; + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); + + if (!tgtport) + return; =20 if (tgtport && tgtport->ops->discovery_event) tgtport->ops->discovery_event(&tgtport->fc_target_port); + + nvmet_fc_tgtport_put(tgtport); } =20 static ssize_t --=20 2.49.0 From nobody Sun Feb 8 11:06:39 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2E1E728A41A for ; Thu, 10 Apr 2025 11:41:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285306; cv=none; b=CYuE+ZTYAD4nha0HpMwAHvGUeS1dOGW7+bK435VQdLmu5aF8Z07oWPqrcIfkXgprXdMX1t0C3SYPvelDY9WjS4KabOFT9W1877oaB1rORBttpnTcwJJRRTCWsEPH+7KO4lWosIvo/6tGziOBlHbXtCq//fMsMc5cBgcN0fmC1F4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744285306; c=relaxed/simple; bh=/cLfvZPaGaKqTv5rGWJ2lfAMdaEHdJl7YqBZZkkNksw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=s00uIrdHy+4rCb+o43swh3D48TfSygSCbKWROrvtUhUfqrhUULrFvchB3JENQWroytRgbhrOYRIMXRsNSNqjKHSTU64KgyG5GZdateVfJexr6P1ZC81ISjrFqwm7gqNwM2w6M/lzEDpR1JTlWYRyeXiDklZzz1z9E1i6akcyj2Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cZG7O4CX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cZG7O4CX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B400BC4CEEA; Thu, 10 Apr 2025 11:41:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1744285306; bh=/cLfvZPaGaKqTv5rGWJ2lfAMdaEHdJl7YqBZZkkNksw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cZG7O4CXmGL0MyfFfIjmuxA0yarKJ8L0fZF71b3Za1BdNbUR4WoW6fQr2tIqjOJua Lo6k2SnvJyP3yvMRD18WWaxSQGG6Fb/nINm+vGobEOwv7ltJKknJV+lH0EAlkcTDd2 DQd4/PXo3SgVTG64u0sE4oXFTCPQABuy5+wfmY5JlBYsdhZ38x7QROXBDpBJdOuw8G S+/qlghzShEheGHiXj8INFLEjAQGwWfwFHpjb7+zix3qA6/uFyZykTqTc/BqOFAgTr Vee9LNRxs1W9lT6H3Fj1QGS3Y/Dwfouqx0zjZ6GXLCBo/of7Rx94kr/Yr8pnyPfzg6 he+aVtzyio2gg== From: Daniel Wagner Date: Thu, 10 Apr 2025 13:41:17 +0200 Subject: [PATCH v4 14/14] nvme-fc: do not reference lsrsp after failure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250410-nvmet-fcloop-v4-14-7e5c42b7b2cb@kernel.org> References: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> In-Reply-To: <20250410-nvmet-fcloop-v4-0-7e5c42b7b2cb@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The lsrsp object is maintained by the LLDD. The lifetime of the lsrsp object is implicit. Because there is no explicit cleanup/free call into the LLDD, it is not safe to assume after xml_rsp_fails, that the lsrsp is still valid. The LLDD could have freed the object already. With the recent changes how fcloop tracks the resources, this is the case. Thus don't access lsrsp after xml_rsp_fails. Signed-off-by: Daniel Wagner --- drivers/nvme/host/fc.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index 2257c3c96dd2da11097d2d0d4a5bb8ece1bebc6a..fdafa3e9e66fa9b8954209efa14= d3b207cb8653c 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c @@ -1410,9 +1410,8 @@ nvme_fc_xmt_disconnect_assoc(struct nvme_fc_ctrl *ctr= l) } =20 static void -nvme_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp) +nvme_fc_xmt_ls_rsp_free(struct nvmefc_ls_rcv_op *lsop) { - struct nvmefc_ls_rcv_op *lsop =3D lsrsp->nvme_fc_private; struct nvme_fc_rport *rport =3D lsop->rport; struct nvme_fc_lport *lport =3D rport->lport; unsigned long flags; @@ -1433,6 +1432,14 @@ nvme_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp) nvme_fc_rport_put(rport); } =20 +static void +nvme_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp) +{ + struct nvmefc_ls_rcv_op *lsop =3D lsrsp->nvme_fc_private; + + nvme_fc_xmt_ls_rsp_free(lsop); +} + static void nvme_fc_xmt_ls_rsp(struct nvmefc_ls_rcv_op *lsop) { @@ -1450,7 +1457,7 @@ nvme_fc_xmt_ls_rsp(struct nvmefc_ls_rcv_op *lsop) dev_warn(lport->dev, "LLDD rejected LS RSP xmt: LS %d status %d\n", w0->ls_cmd, ret); - nvme_fc_xmt_ls_rsp_done(lsop->lsrsp); + nvme_fc_xmt_ls_rsp_free(lsop); return; } } --=20 2.49.0