From nobody Sun Feb 8 16:05:22 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 EC3FC23535E for ; Wed, 26 Feb 2025 18:45:59 +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=1740595560; cv=none; b=I7oOLdvZvF6ndB0G+nOlR9l1AlBmp3Ypgnz9MtD0mrKn45nIySMVwynUOF+8VrV0rZOQEyCOpO24HbGjNT3grwoW4XVvzqNTqX2EJoW+n4qvmwVn2a/3khsbYwResY+Wn3Q6iogE9FfzWYs4RiZoRgoEBD5zrODoF1GInZcnyvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595560; c=relaxed/simple; bh=Kc4e83KgunYQeubPAAe08urkDG6fAFT7j2kclg3zHWg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aFHjoGpo+2TTUFPuTCCtuFZSSwA0NXXtNV2j8RPH2YS7Hi6+QlXm1qYUJwzyUsBKScKzkjjXKnXX6BV95A+/eLlcsi0lde+3ka5fQaysK/+7z6ExhwMaeCPAY30TzaOdCMzYkW5euax399FkwHfR+x7MxRfKc/iidLzYZFkBFHg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eGEMDyIZ; 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="eGEMDyIZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13BA2C4CEE9; Wed, 26 Feb 2025 18:45:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595559; bh=Kc4e83KgunYQeubPAAe08urkDG6fAFT7j2kclg3zHWg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eGEMDyIZtQQ7R0NoksWK/rVAa1ueZlaZXWjk0D2OqfnYfobPXyWares5WRQs0LwaP xbwFkJE0B/8UHMx7/nrtOfBQCfXRm/klF66DlNKAH3z4m6gUbN/0X/yyAQsc0YTsOP 8hQO/9uQoHDVrohmqojwC25EwO6LR2e0Rm0AI7Aiw6BQ4EOq60iPAM4Y9zUryZ9Swi 1E2i+Piv6aWPqL/Kcy9UJ+tcqGrOg76vYxCTyJgILNhHjfae55vwdXotsq8bm1JBsF D0b9z1vDeA/YMDW7M9nJl2thHuQvY4mglFnnQzdpPdvZyALGblOL01cYlPdcjBbRoY BuQQaMKmJLwVg== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:45:53 +0100 Subject: [PATCH 01/11] 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: <20250226-nvmet-fcloop-v1-1-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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. Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index e1abb27927ff74c9c55ddefd9581aab18bf3b00f..5493677a948d34391c7c08055df= efd91cc3ff33f 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1005,6 +1005,11 @@ fcloop_nport_free(struct kref *ref) { struct fcloop_nport *nport =3D container_of(ref, struct fcloop_nport, ref); + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + list_del(&nport->nport_list); + spin_unlock_irqrestore(&fcloop_lock, flags); =20 kfree(nport); } @@ -1363,8 +1368,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.48.1 From nobody Sun Feb 8 16:05:22 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 6D3ED235BF4 for ; Wed, 26 Feb 2025 18:46:02 +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=1740595562; cv=none; b=Aq53SXdrI8J7PkU4iK+y5EnLUWM9YxHXUE2/uOJy43uwVAvOVCSnaft/ZDoe0VLSF8lx3XsaBFylRseDywYuX83wLN1+nGiJ2eipimBY87PDfO3e8ef83fXEBJz14VNqzPHsiqANmK5VAT08uCd9GPIdaHctDBQX2S78VcR/wio= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595562; c=relaxed/simple; bh=GGboBiUAnzqzEkcPJLhVinGFyNQd+KTlEDa9DnpBz6o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EqKpqqmugpL2nyjSEsXwsvCzVdSfqBGciNZqafme84t3qwXZB8XWq8u3HrTL4EHkl/zyByg66A9sU9tGPhljBXAbtrTi3r5wRaEC+vzLnszrg7S4bjdSCYBTWv9fiSpRcMrqJati9TtQv+PD5nQa1M+fm8gnD91ytftr3XXEjAc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IVxzKg8Q; 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="IVxzKg8Q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 93C59C4CEE7; Wed, 26 Feb 2025 18:46:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595561; bh=GGboBiUAnzqzEkcPJLhVinGFyNQd+KTlEDa9DnpBz6o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IVxzKg8Qheh7Ol+EGR/xq1SAommDIl0ENloP8OFTqRtlC8TLqPwVmh/WT0edIMQZz WjPHVr2l8skhk0j0CEC4+wffRBmG9l9lcZ/GS60dxIUMfQWfhWYnrYeGQYRS7/6SEz 9HFSkipZBVNrHv82eQwamSsOT2z9nGVK22cI2RGj+5bAFsNGOO/z/KYNrlTWf4xkCp g8+STH3jyTAqdDCKqmYmlyQGE4B3lkS7d4DQ9VkRGw00aaK8BzWbab4AIJaacu/Oo1 tLZdDRhqveGv3hf+HISYVCkYDOGcFIHKqMMWcqTRh9HnM0rVCXNAew5rgC5loNXoJ4 JPXhI84MMCISg== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:45:54 +0100 Subject: [PATCH 02/11] nvmet-fcloop: add ref counting to 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: <20250226-nvmet-fcloop-v1-2-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 fcloop_lport objects live time is controlled by the user interface add_local_port and del_local_port. nport, rport and tport objects are pointing to the lport objects but here is no clear tracking. Let's introduce an explicit ref counter for the lport objects and prepare the stage for restructuring how lports are used. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 47 +++++++++++++++++++++++++++++++++-------= ---- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 5493677a948d34391c7c08055dfefd91cc3ff33f..ca46830d46ecbaae21f3ee3e69a= a7d52905abcae 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -208,6 +208,7 @@ struct fcloop_lport { struct nvme_fc_local_port *localport; struct list_head lport_list; struct completion unreg_done; + struct kref ref; }; =20 struct fcloop_lport_priv { @@ -1000,6 +1001,32 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localpor= t, } } =20 +static void +fcloop_lport_free(struct kref *ref) +{ + struct fcloop_lport *lport =3D + container_of(ref, struct fcloop_lport, ref); + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + list_del(&lport->lport_list); + spin_unlock_irqrestore(&fcloop_lock, flags); + + kfree(lport); +} + +static void +fcloop_lport_put(struct fcloop_lport *lport) +{ + kref_put(&lport->ref, fcloop_lport_free); +} + +static int +fcloop_lport_get(struct fcloop_lport *lport) +{ + return kref_get_unless_zero(&lport->ref); +} + static void fcloop_nport_free(struct kref *ref) { @@ -1145,6 +1172,7 @@ fcloop_create_local_port(struct device *dev, struct d= evice_attribute *attr, =20 lport->localport =3D localport; INIT_LIST_HEAD(&lport->lport_list); + kref_init(&lport->ref); =20 spin_lock_irqsave(&fcloop_lock, flags); list_add_tail(&lport->lport_list, &fcloop_lports); @@ -1161,13 +1189,6 @@ fcloop_create_local_port(struct device *dev, struct = device_attribute *attr, return ret ? ret : count; } =20 - -static void -__unlink_local_port(struct fcloop_lport *lport) -{ - list_del(&lport->lport_list); -} - static int __wait_localport_unreg(struct fcloop_lport *lport) { @@ -1180,7 +1201,7 @@ __wait_localport_unreg(struct fcloop_lport *lport) if (!ret) wait_for_completion(&lport->unreg_done); =20 - kfree(lport); + fcloop_lport_put(lport); =20 return ret; } @@ -1204,8 +1225,9 @@ fcloop_delete_local_port(struct device *dev, struct d= evice_attribute *attr, 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; - __unlink_local_port(lport); break; } } @@ -1215,6 +1237,7 @@ fcloop_delete_local_port(struct device *dev, struct d= evice_attribute *attr, return -ENOENT; =20 ret =3D __wait_localport_unreg(lport); + fcloop_lport_put(lport); =20 return ret ? ret : count; } @@ -1640,17 +1663,17 @@ static void __exit fcloop_exit(void) for (;;) { lport =3D list_first_entry_or_null(&fcloop_lports, typeof(*lport), lport_list); - if (!lport) + if (!lport || !fcloop_lport_get(lport)) break; =20 - __unlink_local_port(lport); - spin_unlock_irqrestore(&fcloop_lock, flags); =20 ret =3D __wait_localport_unreg(lport); if (ret) pr_warn("%s: Failed deleting local port\n", __func__); =20 + fcloop_lport_put(lport); + spin_lock_irqsave(&fcloop_lock, flags); } =20 --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 F00DA236436 for ; Wed, 26 Feb 2025 18:46:04 +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=1740595565; cv=none; b=WjjF6LPZwbueu8Hn+ASnAUaSZ8clfqhMd2tFhQjdhrUbHqlyzqb+SnHkKQ8aBxQShw3Dq7vC+gF4nZoi4HUH+BKP2OJUJWWYMtDVa+POnD2Ysd8Cpc5i43jwZ1zOXAE+OODty1+xZVA2xk+JFpOBjcIKnVVJrfn0uAk7wx6Zb1w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595565; c=relaxed/simple; bh=FE28cHM2Xu+6IwRPzQpF/Y9BjWJU8LBOSYm56nzMorc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r0WGFZfb7yDoQ1nrFIn8gikq6XaBpB3XGcu8hNDsF4pU0gPC7JIguHDtENF+4Wlgbrqgz45+syKfOdGkBa2zbcXVgcoesDBtDlD7KPPiGUKg/CYr4kiBgqSwxGnD1NzNQHlxm7FA/P6tOhamYo0Xqen8kY77Hur9hKpLKaO3HQ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LHSb4t8W; 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="LHSb4t8W" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1380DC4CED6; Wed, 26 Feb 2025 18:46:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595564; bh=FE28cHM2Xu+6IwRPzQpF/Y9BjWJU8LBOSYm56nzMorc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=LHSb4t8WjHOe36CjKcO4O8TgvN3XrISVlK3/CrJH1N++dPJKNjBlGGu7LO0cQ/eRU BsAe+XJWUk1GORxjKthDQ+iHO1uxT8ZfYonEtkziW3IrhbBLfcZYk1JEs5Atf5wIuH Oj1yEX6/fF8DNrZ3Nosk0hT7L+3E/hTBgh+jgR/0tx9qk/sG6eHgY9yd3P7jwat94J fD2FlMy2uqAwONvzEcZOxLL2lPxUFtp8UVR/Hr5Ht1QldylfATd2h06BC+5PHaiCSz U603RnIaK+cJ4xuLTsDpn3dkVtpPib5h88OmfPiIKSrqBjxADZmwnUwwoAvyIe7wWz fhCmRkY59oXDA== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:45:55 +0100 Subject: [PATCH 03/11] nvmet-fcloop: refactor fcloop_nport_alloc 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: <20250226-nvmet-fcloop-v1-3-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 There are many different operations done under the spin lock. Since the lport and nport are ref counted it's possible to only use for the list insert and lookup the spin lock. This allows us to untangle the setup steps into a more linear form which reduces the complexity of the functions. Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig --- drivers/nvme/target/fcloop.c | 156 +++++++++++++++++++++++----------------= ---- 1 file changed, 84 insertions(+), 72 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index ca46830d46ecbaae21f3ee3e69aa7d52905abcae..de1963c34bd88d0335f70de5695= 65740fd395a0a 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1038,6 +1038,8 @@ fcloop_nport_free(struct kref *ref) list_del(&nport->nport_list); spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (nport->lport) + fcloop_lport_put(nport->lport); kfree(nport); } =20 @@ -1206,33 +1208,63 @@ __wait_localport_unreg(struct fcloop_lport *lport) return ret; } =20 +static struct fcloop_lport * +fcloop_lport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_lport *lp, *lport =3D NULL; + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + list_for_each_entry(lp, &fcloop_lports, lport_list) { + if (lp->localport->node_name !=3D node_name || + lp->localport->port_name !=3D port_name) + continue; + + if (fcloop_lport_get(lp)) + lport =3D lp; + + break; + } + spin_unlock_irqrestore(&fcloop_lock, flags); + + return lport; +} + +static struct fcloop_nport * +fcloop_nport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_nport *np, *nport =3D NULL; + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + list_for_each_entry(np, &fcloop_nports, nport_list) { + if (np->node_name !=3D node_name || + np->port_name !=3D port_name) + continue; + + if (fcloop_nport_get(np)) + nport =3D np; + + break; + } + spin_unlock_irqrestore(&fcloop_lock, flags); + + return nport; +} =20 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 @@ -1245,9 +1277,9 @@ 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_ctrl_options *opts; + struct fcloop_nport *nport; + struct fcloop_lport *lport; unsigned long flags; u32 opts_mask =3D (remoteport) ? RPORT_OPTS : TGTPORT_OPTS; int ret; @@ -1261,79 +1293,59 @@ fcloop_alloc_nport(const char *buf, size_t count, b= ool 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) + lport =3D fcloop_lport_lookup(opts->wwnn, opts->wwpn); + if (lport) { + /* invalid configuration */ + fcloop_lport_put(lport); goto out_free_opts; + } =20 - INIT_LIST_HEAD(&newnport->nport_list); - newnport->node_name =3D opts->wwnn; - newnport->port_name =3D opts->wwpn; - if (opts->mask & NVMF_OPT_ROLES) - newnport->port_role =3D opts->roles; - if (opts->mask & NVMF_OPT_FCADDR) - newnport->port_id =3D opts->fcaddr; - kref_init(&newnport->ref); + nport =3D fcloop_nport_lookup(opts->wwnn, opts->wwpn); + if (nport && ((remoteport && nport->rport) || + (!remoteport && nport->tport))) { + /* invalid configuration */ + goto out_put_nport; + } =20 - spin_lock_irqsave(&fcloop_lock, flags); + if (!nport) { + nport =3D kzalloc(sizeof(*nport), GFP_KERNEL); + if (!nport) + goto out_free_opts; =20 - 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; + INIT_LIST_HEAD(&nport->nport_list); + nport->node_name =3D opts->wwnn; + nport->port_name =3D opts->wwpn; + kref_init(&nport->ref); =20 - if (tmplport->localport->node_name =3D=3D opts->lpwwnn && - tmplport->localport->port_name =3D=3D opts->lpwwpn) - lport =3D tmplport; + spin_lock_irqsave(&fcloop_lock, flags); + list_add_tail(&nport->nport_list, &fcloop_nports); + spin_unlock_irqrestore(&fcloop_lock, flags); } =20 + 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 (remoteport) { + lport =3D fcloop_lport_lookup(opts->lpwwnn, opts->lpwwpn); 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); + goto out_put_nport; =20 - 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; - goto out_free_newnport; - } + nport->lport =3D lport; } =20 - list_add_tail(&newnport->nport_list, &fcloop_nports); - - spin_unlock_irqrestore(&fcloop_lock, flags); - kfree(opts); - return newnport; + return nport; =20 -out_invalid_opts: - spin_unlock_irqrestore(&fcloop_lock, flags); -out_free_newnport: - kfree(newnport); +out_put_nport: + fcloop_nport_put(nport); out_free_opts: kfree(opts); - return nport; + return NULL; } =20 static ssize_t --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 5014C236457 for ; Wed, 26 Feb 2025 18:46:07 +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=1740595567; cv=none; b=aWU1AY8Zdc0SUC8RH/EVH0GmxXnTwVKNM8nFG/IZ/crHsmQmpCmm/hEB34IqkKG8NwOpUmfas8BiATIQGuuAHj7CxpkKwMlLUVxSfOIgT6Rt9+MvlxFwvgHuvWZRusstIvwR0qy+dw8/Dnd1m3rm+D0ikI61u8yGCNNgF72BGwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595567; c=relaxed/simple; bh=hpAwt8sa4lVKf33YbvMGj5JYpcBJeY0KnjyqEjt3T/8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=heHkFTqzloc0IforEQ1HbDbiYnR69S2JTb35mjKehiYeEzd/85ZGOl/E45dccJo6D9fnH7oSw7T55EsoN7OUvEmdeLvWq6pFcHik2jniePXuv3S2o++Nif2lkSdvlIu75HCvBlj3ZRtNW3NNTFkEghw0XoOrS/Im4JZ6Mz7ZnDo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Nwf8vNjS; 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="Nwf8vNjS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A881C4CEE7; Wed, 26 Feb 2025 18:46:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595567; bh=hpAwt8sa4lVKf33YbvMGj5JYpcBJeY0KnjyqEjt3T/8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Nwf8vNjSjzpId+uUtsOySrgqouR6zL4gSXLikn4qPEdF+Ea1GDSv79zHBgAIFJvFb JIyazK+Ot18xJcbfjEuyJ4yVgbAK5StVY5jzos4wkz48C5rHj4wqZjF3TvOCZhPyIg YzvDckqk32/OtJfTQ1V8VgJZBwXwnNnmuA4NUrb1G1EKitM3CQiQZKVSlB40cB3asn NmBsEaJifGmfcruL1lUop1oLCEpKxl5M5Dq60ESQotqE9lsKOyEpEia6s9AtYzXk68 2YCnk3OhUqKqfqS7dQDVNqMEgWZJ+2BCFvPbs8bW9lxd/QaKO+aAH/dxx7Jw6IIcHa RHNkg2Dm+mseg== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:45:56 +0100 Subject: [PATCH 04/11] 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: <20250226-nvmet-fcloop-v1-4-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 makes the unreliable reference updates in the two callback fcloop_targetport_delete and fcloop_remoteport_delete obsolete. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 57 +++++++++++++++++++++++++++++++++++-----= ---- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index de1963c34bd88d0335f70de569565740fd395a0a..80693705c069dd114b2d4f15d04= 82dd2d713a273 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1071,16 +1071,11 @@ fcloop_remoteport_delete(struct nvme_fc_remote_port= *remoteport) struct fcloop_rport *rport =3D remoteport->private; =20 flush_work(&rport->ls_work); - fcloop_nport_put(rport->nport); } =20 static void fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) { - struct fcloop_tport *tport =3D targetport->private; - - flush_work(&tport->ls_work); - fcloop_nport_put(tport->nport); } =20 #define FCLOOP_HW_QUEUES 4 @@ -1358,6 +1353,7 @@ fcloop_create_remote_port(struct device *dev, struct = device_attribute *attr, struct nvme_fc_port_info pinfo; int ret; =20 + /* nport ref get: rport */ nport =3D fcloop_alloc_nport(buf, count, true); if (!nport) return -EIO; @@ -1375,6 +1371,9 @@ fcloop_create_remote_port(struct device *dev, struct = device_attribute *attr, return ret; } =20 + /* nport ref get: remoteport */ + fcloop_nport_get(nport); + /* success */ rport =3D remoteport->private; rport->remoteport =3D remoteport; @@ -1403,16 +1402,27 @@ __unlink_remote_port(struct fcloop_nport *nport) nport->tport->remoteport =3D NULL; nport->rport =3D NULL; =20 + /* nport ref put: rport */ + fcloop_nport_put(nport); + return rport; } =20 static int __remoteport_unreg(struct fcloop_nport *nport, struct fcloop_rport *rport) { - if (!rport) - return -EALREADY; + int ret; =20 - return nvme_fc_unregister_remoteport(rport->remoteport); + if (!rport) { + ret =3D -EALREADY; + goto out; + } + + ret =3D nvme_fc_unregister_remoteport(rport->remoteport); +out: + /* nport ref put: remoteport */ + fcloop_nport_put(nport); + return ret; } =20 static ssize_t @@ -1434,6 +1444,9 @@ fcloop_delete_remote_port(struct device *dev, struct = device_attribute *attr, list_for_each_entry(tmpport, &fcloop_nports, nport_list) { if (tmpport->node_name =3D=3D nodename && tmpport->port_name =3D=3D portname && tmpport->rport) { + + if (!fcloop_nport_get(tmpport)) + break; nport =3D tmpport; rport =3D __unlink_remote_port(nport); break; @@ -1447,6 +1460,8 @@ fcloop_delete_remote_port(struct device *dev, struct = device_attribute *attr, =20 ret =3D __remoteport_unreg(nport, rport); =20 + fcloop_nport_put(nport); + return ret ? ret : count; } =20 @@ -1460,6 +1475,7 @@ fcloop_create_target_port(struct device *dev, struct = device_attribute *attr, struct nvmet_fc_port_info tinfo; int ret; =20 + /* nport ref get: tport */ nport =3D fcloop_alloc_nport(buf, count, false); if (!nport) return -EIO; @@ -1475,6 +1491,9 @@ fcloop_create_target_port(struct device *dev, struct = device_attribute *attr, return ret; } =20 + /* nport ref get: targetport */ + fcloop_nport_get(nport); + /* success */ tport =3D targetport->private; tport->targetport =3D targetport; @@ -1501,16 +1520,27 @@ __unlink_target_port(struct fcloop_nport *nport) nport->rport->targetport =3D NULL; nport->tport =3D NULL; =20 + /* nport ref put: tport */ + fcloop_nport_put(nport); + return tport; } =20 static int __targetport_unreg(struct fcloop_nport *nport, struct fcloop_tport *tport) { - if (!tport) - return -EALREADY; + int ret; =20 - return nvmet_fc_unregister_targetport(tport->targetport); + if (!tport) { + ret =3D -EALREADY; + goto out; + } + + ret =3D nvmet_fc_unregister_targetport(tport->targetport); +out: + /* nport ref put: targetport */ + fcloop_nport_put(nport); + return ret; } =20 static ssize_t @@ -1532,6 +1562,9 @@ fcloop_delete_target_port(struct device *dev, struct = device_attribute *attr, list_for_each_entry(tmpport, &fcloop_nports, nport_list) { if (tmpport->node_name =3D=3D nodename && tmpport->port_name =3D=3D portname && tmpport->tport) { + + if (!fcloop_nport_get(tmpport)) + break; nport =3D tmpport; tport =3D __unlink_target_port(nport); break; @@ -1545,6 +1578,8 @@ fcloop_delete_target_port(struct device *dev, struct = device_attribute *attr, =20 ret =3D __targetport_unreg(nport, tport); =20 + fcloop_nport_put(nport); + return ret ? ret : count; } =20 --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 1C172237164 for ; Wed, 26 Feb 2025 18:46:09 +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=1740595570; cv=none; b=XA5r7uA8wH3CXTCPxRlQIXGxnpwEmytsvT5EIDKiSBmykYQhGAga8I8uM25ecCT2Vb7EFfsSg6mE4Z5yELvVbvtoSplW7oR9hjbTBXTJJU8hXIkH9GEFs5heCWZALKzeg6mE83x+1Nl5FDWP2Te+JTHwQRV1qqcZLJk2qdJhjEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595570; c=relaxed/simple; bh=gdFyyvV3CV/ZqFGdzKB4cfzAhMwvR9qpkHzsViZuBwE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T/rp4bWEqtwR6pSHcGc5rgYkqmbOnV3qnCb6F45fskYR8X0VktxLe9MY+wKHw/xx270g51ukGPGUOffJalvKN1kCBbDqTYGfyl7IspdjCdmZOcETW9AgSvT/fRlC5e5zgGo4GGcNW7wvLA3KDaCDmpTow4ElNKpxpHVvizg8GV8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AGpRrc29; 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="AGpRrc29" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 48F5AC4CED6; Wed, 26 Feb 2025 18:46:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595569; bh=gdFyyvV3CV/ZqFGdzKB4cfzAhMwvR9qpkHzsViZuBwE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=AGpRrc29TsfXPoD+d4Y4asIqjRm2j2QzRzi+azZgP3pKM8/h/fwIDmznZd95p0+Vh FmlNGR31+G47egARQWq4/F9sMWvyhK2G8DxAAdapPdYN5XgMW6Zc46+lcRHTBxJzwP VXLmQpZQpfwT4carjghoGjaVLQx5az0Uf3MFXHTHL7XEO6jGsWMAzO6iQTaToxUaUF qZChoyjb6bXiA1pL+xkuAgWSMyFmXQUJsnxuDnCtrGC7MvJOV2hbLww0/s6ifX1dR0 QyUJutZ2UYcr3kBhW+wkNZN92DTE7LdZSY8zyICNF+Fq4R04ytbt7l6F1D1Vu4gJhJ I6lIvqpdjz1+Q== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:45:57 +0100 Subject: [PATCH 05/11] nvmet-fcloop: track tport with ref counting 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: <20250226-nvmet-fcloop-v1-5-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 tport object is created via nvmet_fc_register_targetport and freed via nvmet_fc_unregister_targetport. That means after the port is unregistered nothing should use it. Thus ensure with refcounting that there is no user left before the unregister step. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 52 +++++++++++++++++++++++++++++-----------= ---- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 80693705c069dd114b2d4f15d0482dd2d713a273..2269b4d20af2ef9bb423617b94a= 5f5326ea124bd 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -233,8 +233,12 @@ struct fcloop_tport { spinlock_t lock; struct list_head ls_list; struct work_struct ls_work; + struct kref ref; }; =20 +static int fcloop_tport_get(struct fcloop_tport *tport); +static void fcloop_tport_put(struct fcloop_tport *tport); + struct fcloop_nport { struct fcloop_rport *rport; struct fcloop_tport *tport; @@ -426,6 +430,7 @@ fcloop_tport_lsrqst_work(struct work_struct *work) spin_lock(&tport->lock); } spin_unlock(&tport->lock); + fcloop_tport_put(tport); } =20 static int @@ -444,12 +449,16 @@ fcloop_t2h_ls_req(struct nvmet_fc_target_port *target= port, void *hosthandle, tls_req->lsreq =3D lsreq; INIT_LIST_HEAD(&tls_req->ls_list); =20 + if (!tport) + return -ECONNABORTED; + if (!tport->remoteport) { tls_req->status =3D -ECONNREFUSED; 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 (queue_work(nvmet_wq, &tport->ls_work)) + fcloop_tport_get(tport); return ret; } =20 @@ -481,7 +490,8 @@ fcloop_t2h_xmt_ls_rsp(struct nvme_fc_local_port *localp= ort, spin_lock(&tport->lock); list_add_tail(&tport->ls_list, &tls_req->ls_list); spin_unlock(&tport->lock); - queue_work(nvmet_wq, &tport->ls_work); + if (queue_work(nvmet_wq, &tport->ls_work)) + fcloop_tport_get(tport); } =20 return 0; @@ -1496,6 +1506,8 @@ fcloop_create_target_port(struct device *dev, struct = device_attribute *attr, =20 /* success */ tport =3D targetport->private; + kref_init(&tport->ref); + tport->targetport =3D targetport; tport->remoteport =3D (nport->rport) ? nport->rport->remoteport : NULL; if (nport->rport) @@ -1526,21 +1538,30 @@ __unlink_target_port(struct fcloop_nport *nport) return tport; } =20 -static int -__targetport_unreg(struct fcloop_nport *nport, struct fcloop_tport *tport) +static void +fcloop_targetport_unreg(struct kref *ref) { - int ret; + struct fcloop_tport *tport =3D + container_of(ref, struct fcloop_tport, ref); + struct fcloop_nport *nport; =20 - if (!tport) { - ret =3D -EALREADY; - goto out; - } + nport =3D tport->nport; + nvmet_fc_unregister_targetport(tport->targetport); =20 - ret =3D nvmet_fc_unregister_targetport(tport->targetport); -out: /* nport ref put: targetport */ fcloop_nport_put(nport); - return ret; +} + +static int +fcloop_tport_get(struct fcloop_tport *tport) +{ + return kref_get_unless_zero(&tport->ref); +} + +static void +fcloop_tport_put(struct fcloop_tport *tport) +{ + kref_put(&tport->ref, fcloop_targetport_unreg); } =20 static ssize_t @@ -1576,8 +1597,7 @@ fcloop_delete_target_port(struct device *dev, struct = device_attribute *attr, if (!nport) return -ENOENT; =20 - ret =3D __targetport_unreg(nport, tport); - + fcloop_tport_put(tport); fcloop_nport_put(nport); =20 return ret ? ret : count; @@ -1696,9 +1716,7 @@ 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__); + fcloop_tport_put(tport); =20 ret =3D __remoteport_unreg(nport, rport); if (ret) --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 AC44621A92F for ; Wed, 26 Feb 2025 18:46:12 +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=1740595572; cv=none; b=VuCXUWZBJgc5HKW7Jxjmx4/IBT37rpqDXllsUBC5Osagpb5G2tbZu6aqmTpHQU8JdGf8GbWRfelIuE8ofTaJSdLP7yZdyKKw+8edcxXB69eO0b6fBJElbFWhEW/uRFESsc3BWeHdk0SpCgzn128PDWggU6tEKR1MeaTFEVugzOI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595572; c=relaxed/simple; bh=rCD9QYbyoazCDF/iLKJMcfOqtD6D4ELGTlkaa2TRQvg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=i1qcjoQjp1OUayplALz3/ruj6TLF/sFFapxRmMhtxIVaBjx/SVEZfA7DvUDHSP+Xpoo3uXDs0+8PqmvbmwrNIx+08c0p7nH4IInnMdJlDOlMoteukoUIAxj8X9lC7GZylOfh2mbEh3zY2ed68cCGykwYbBnwJ5xsMtVewzwey/U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qkh3rAot; 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="qkh3rAot" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF4CFC4CED6; Wed, 26 Feb 2025 18:46:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595572; bh=rCD9QYbyoazCDF/iLKJMcfOqtD6D4ELGTlkaa2TRQvg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qkh3rAotbyNAH5uU5EFkTF85cDZG6TuME+7BiZkC2kcaIoPENXXj0CUmjLPyD0OqD T687OYJdMOft8gAiODzK9QL/1pCW4G7y65u4SOAptJiJtRSvLYDXhLKV8P7P9C8aFY 279Gj+EZwt1dJrtN2yBSsyTs0m7Mrp6ZcbVj/yh4SuoJRTbHydcd9hgFCHkyCdXYmM qyy6X3D6K4Q877Ydkek52unB5mEYYQ9DpuMndTTHVp0UcuF4dvXoho4fGo0j+VGcEN I42twBQDwsFjVJchvghgcHTh2Agr4PD8WxsNOFZ0JBDrtW9hKLhK2/d7tHbHzkkU/F OvIO0mMj01Wfw== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:45:58 +0100 Subject: [PATCH 06/11] nvmet-fcloop: track rport with ref counting 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: <20250226-nvmet-fcloop-v1-6-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 rport object is created via nvme_fc_register_remote and freed via nvme_fc_unregister_remoteport. That means after the port is unregistered nothing should use it. Thus ensure with refcounting that there is no user left before the unregister step. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 53 ++++++++++++++++++++++++++--------------= ---- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 2269b4d20af2ef9bb423617b94a5f5326ea124bd..d64f5fba136e13c9e4e545acecd= 905c31542d442 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -223,8 +223,12 @@ struct fcloop_rport { spinlock_t lock; struct list_head ls_list; struct work_struct ls_work; + struct kref ref; }; =20 +static int fcloop_rport_get(struct fcloop_rport *rport); +static void fcloop_rport_put(struct fcloop_rport *rport); + struct fcloop_tport { struct nvmet_fc_target_port *targetport; struct nvme_fc_remote_port *remoteport; @@ -346,6 +350,7 @@ fcloop_rport_lsrqst_work(struct work_struct *work) spin_lock(&rport->lock); } spin_unlock(&rport->lock); + fcloop_rport_put(rport); } =20 static int @@ -365,7 +370,8 @@ fcloop_h2t_ls_req(struct nvme_fc_local_port *localport, 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 (queue_work(nvmet_wq, &rport->ls_work)) + fcloop_rport_get(rport); return ret; } =20 @@ -398,7 +404,8 @@ fcloop_h2t_xmt_ls_rsp(struct nvmet_fc_target_port *targ= etport, 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 (queue_work(nvmet_wq, &rport->ls_work)) + fcloop_rport_get(rport); } =20 return 0; @@ -1078,9 +1085,6 @@ fcloop_localport_delete(struct nvme_fc_local_port *lo= calport) static void fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) { - struct fcloop_rport *rport =3D remoteport->private; - - flush_work(&rport->ls_work); } =20 static void @@ -1386,6 +1390,8 @@ fcloop_create_remote_port(struct device *dev, struct = device_attribute *attr, =20 /* success */ rport =3D remoteport->private; + kref_init(&rport->ref); + rport->remoteport =3D remoteport; rport->targetport =3D (nport->tport) ? nport->tport->targetport : NULL; if (nport->tport) { @@ -1418,21 +1424,30 @@ __unlink_remote_port(struct fcloop_nport *nport) return rport; } =20 -static int -__remoteport_unreg(struct fcloop_nport *nport, struct fcloop_rport *rport) +static void +fcloop_remoteport_unreg(struct kref *ref) { - int ret; + struct fcloop_rport *rport =3D + container_of(ref, struct fcloop_rport, ref); + struct fcloop_nport *nport; =20 - if (!rport) { - ret =3D -EALREADY; - goto out; - } + nport =3D rport->nport; + nvme_fc_unregister_remoteport(rport->remoteport); =20 - ret =3D nvme_fc_unregister_remoteport(rport->remoteport); -out: /* nport ref put: remoteport */ fcloop_nport_put(nport); - return ret; +} + +static int +fcloop_rport_get(struct fcloop_rport *rport) +{ + return kref_get_unless_zero(&rport->ref); +} + +static void +fcloop_rport_put(struct fcloop_rport *rport) +{ + kref_put(&rport->ref, fcloop_remoteport_unreg); } =20 static ssize_t @@ -1468,8 +1483,7 @@ fcloop_delete_remote_port(struct device *dev, struct = device_attribute *attr, if (!nport) return -ENOENT; =20 - ret =3D __remoteport_unreg(nport, rport); - + fcloop_rport_put(rport); fcloop_nport_put(nport); =20 return ret ? ret : count; @@ -1717,10 +1731,7 @@ static void __exit fcloop_exit(void) spin_unlock_irqrestore(&fcloop_lock, flags); =20 fcloop_tport_put(tport); - - ret =3D __remoteport_unreg(nport, rport); - if (ret) - pr_warn("%s: Failed deleting remote port\n", __func__); + fcloop_rport_put(rport); =20 spin_lock_irqsave(&fcloop_lock, flags); } --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 D477C237704 for ; Wed, 26 Feb 2025 18:46:14 +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=1740595574; cv=none; b=dn9NfgFSNUtRilbgXVMyqe+QnlLkkaPjaBypCPTPii09yuygX4x7l7JImlMlZRpr1kvVTwpQoIwlEY7BYrkIgjJgY+N7NAp1Q9YPLobrAqOkow13IFFStYE7fgUPT00nh9CFTd29+NuvLCOrSJoUiHSabCga3ukIbohHZfwcTD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595574; c=relaxed/simple; bh=iDy1ce3F7we4lX8jz/NaLXQ09ocgZ3E0UyfAPaBRnbY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kPCufnh5RGHLcx5OLwKFGwuyA8TuxR2Jt+mwKPHDaRDg0RILJY3PGm8OEkB8FVguE35TaK/VUU4fNhoRrZkRLjMpVk5E76K0xYJNjlBbzBBXVWcKM1uEleLZ2YhhM6t+Pu+y/IN/JTZ1Hzra9sJug/yd+QtVQdN7NlpxEIePkCs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JuRWl+/B; 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="JuRWl+/B" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5E094C4CEEA; Wed, 26 Feb 2025 18:46:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595574; bh=iDy1ce3F7we4lX8jz/NaLXQ09ocgZ3E0UyfAPaBRnbY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JuRWl+/B4WCzstTtkvZLf/I4aJgPAooSP+pIq/dult31l3mOr3LI3736wiOjChTdq JUQk0dJetQe5iz+C8zio3dQ4qJrMnSxj5uhkF4W9RA9jO3jAxgOFzgMO+DXq3+Nqla GoB/iQFHxdqMmw+m7bqCNMGa9b6ZrMe7BVPzkYqekE8NlPVRWEhWAYyQLfaXeVvnB4 afL/E2fit8ogJ2Skj0p0JnPGRy7MAW3BfN5JmCN0BKhC/29Af/A0xAxcqnNaJsqdQw jz4rYFH1KuXern7S9vZxxAzgMVUuC6tETY01DTeBUtG7Og5TlstW2LFXaBsU5C5EFt qR5Yn49exu86g== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:45:59 +0100 Subject: [PATCH 07/11] nvmet-fc: update tgtport ref per assoc 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: <20250226-nvmet-fcloop-v1-7-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 We need to take for each unique association a reference. nvmet_fc_alloc_hostport for each newly created association. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 3ef4beacde3257147a59321e8f13451326302de0..b807b4c05cac7fe4764df3df76f= 8fa50f4bab6ba 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1157,6 +1157,7 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *= tgtport, void *hosthandle) goto out_ida; =20 assoc->tgtport =3D tgtport; + nvmet_fc_tgtport_get(tgtport); assoc->a_id =3D idx; INIT_LIST_HEAD(&assoc->a_list); kref_init(&assoc->ref); @@ -1258,6 +1259,8 @@ nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_asso= c *assoc) dev_info(tgtport->dev, "{%d:%d} Association deleted\n", tgtport->fc_target_port.port_num, assoc->a_id); + + nvmet_fc_tgtport_put(tgtport); } =20 static struct nvmet_fc_tgt_assoc * --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 57687238D2E for ; Wed, 26 Feb 2025 18:46:17 +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=1740595577; cv=none; b=W8/e/vSmqIOBT9VstLGfkNN9qO0aP4IjG6nh+tOq4NeLBU55Rs4vAmDJJkbRgkWRHDR6mPbgyjjEcopizbKutqvXoOO7/BvV73rU5dTcdtGNI5ujIfpQiZyuv6/FnTCHoQ+8eUl39iXXWvwBUPxagLpEIvrxWEJremuF66mx1pg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595577; c=relaxed/simple; bh=LWNcOUyHSpm76/r8wsTzzymlSz71tkb01XzMtOR6qcc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a9Avgrplw+RyhO10q92wJbbRXdiIV3DT4mPmGP1mt/9/lvJZumB1YWK7vB1RzwLxFVXhonwWCcrc2mUr7dolCYP8C1uzeaKhfVGVWZ4QJ6p6krYGht51F/oMuNBGqOqkdBwF3Fad3JN9S5gyQgCMnBHn20p70DT8XKUZrZ7v218= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WRxP5h0k; 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="WRxP5h0k" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D1AD9C4CEEC; Wed, 26 Feb 2025 18:46:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595577; bh=LWNcOUyHSpm76/r8wsTzzymlSz71tkb01XzMtOR6qcc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WRxP5h0kukCPaOyW+ojFaAMhTV7G6BMdg1nMeYkDaXUszhMdm9K2XPTZNtLRe5s0J j6Ty7zKCZ2XJ0FX931zzsUBuwBLgwZeHkgFPlvqpopcdsQFLdfmDQQR9856n7nCSsb xBzDcZbp6Jt5ZpoZIxCwR1ZcmMyhrUvVe2D6wHPdlAAXXplcsOXsGhI489VEEYxbhz jJNxBZAL7CroR8cIbwFlNg7xs9Ws/NrH3XoVTKfiZSGZLCPlAarc9Z/CCfw1cS8nS9 joAx4V5ZKmf4kNxKoQo1fkEuXUHDEBfpP0D+jHrdL7iw35yvrGLPV85IDzi4EO7Snv AUpqGCePvBtBQ== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:46:00 +0100 Subject: [PATCH 08/11] nvmet-fc: take tgtport reference only once 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: <20250226-nvmet-fcloop-v1-8-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 reference counting code can be simplified. Instead taking a tgtport refrerence at the beginning of nvmet_fc_alloc_hostport and put it back if not a new hostport object is allocated, only take it when a new hostport object is allocated. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fc.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index b807b4c05cac7fe4764df3df76f8fa50f4bab6ba..391917b4ce0115dbc0ad99d1fb3= 63b1af6ee0685 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1046,29 +1046,16 @@ nvmet_fc_alloc_hostport(struct nvmet_fc_tgtport *tg= tport, void *hosthandle) if (!hosthandle) return NULL; =20 - /* - * take reference for what will be the newly allocated hostport if - * we end up using a new allocation - */ - if (!nvmet_fc_tgtport_get(tgtport)) - return ERR_PTR(-EINVAL); - spin_lock_irqsave(&tgtport->lock, flags); match =3D nvmet_fc_match_hostport(tgtport, hosthandle); spin_unlock_irqrestore(&tgtport->lock, flags); =20 - if (match) { - /* no new allocation - release reference */ - nvmet_fc_tgtport_put(tgtport); + if (match) return match; - } =20 newhost =3D kzalloc(sizeof(*newhost), GFP_KERNEL); - if (!newhost) { - /* no new allocation - release reference */ - nvmet_fc_tgtport_put(tgtport); + if (!newhost) return ERR_PTR(-ENOMEM); - } =20 spin_lock_irqsave(&tgtport->lock, flags); match =3D nvmet_fc_match_hostport(tgtport, hosthandle); @@ -1077,6 +1064,7 @@ nvmet_fc_alloc_hostport(struct nvmet_fc_tgtport *tgtp= ort, void *hosthandle) kfree(newhost); newhost =3D match; } else { + nvmet_fc_tgtport_get(tgtport); newhost->tgtport =3D tgtport; newhost->hosthandle =3D hosthandle; INIT_LIST_HEAD(&newhost->host_list); --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 2A7EC23959A for ; Wed, 26 Feb 2025 18:46:19 +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=1740595581; cv=none; b=caJWZARpF24MWIwhbaHTlX/TLnPsH+amc44fntfSv5y1Hoqmu0cpyfJYH61NVPMTNs7SrxTxb3vg70JSi8P6XGWIv8uagTTPxq/F/DXVp+lgSaJztKkTjR9XCmsWwMGs7tC86ITUR/N2Ev1xOMArcT4X93CqzK1QiQpajmkRDS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595581; c=relaxed/simple; bh=KgJVfB3Qy7a1wCHTTv+5L+khTJcVq387laAYSWSU2L8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uf+AibaxmyAc5aJmuuZumRpPihhjUtv7EtmybYvUxvn6Bm4lmWdiZK5Mwv/2kBH55eHFjofxVgpOZzncEUnBGInN61vWj4lLScPVr6C8GNzF4KGhkTnivf3pbtmSQdDs2uT3y76cQG4UVBf6wQ+1JSMgJhh0VR2FV5reQklDeAI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TR2dhLX8; 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="TR2dhLX8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4D98CC4CEE8; Wed, 26 Feb 2025 18:46:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595579; bh=KgJVfB3Qy7a1wCHTTv+5L+khTJcVq387laAYSWSU2L8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=TR2dhLX8wKrboAjqPtRK1DUYiBpB8ZrwYVzlPSrNx26XOY0oj19EQrHrsYryWIVwY 2a0l+G1nnbFZyyB4VGEX1EXGunv2ishDz5J/X4YRHKDI7WeeDvXkdo1GrvtNx2Tfrh Ow5jjjkYY38i57h/IvbeCRBVBfMxjt7OEQPZLx1OlP07F2wLN7ONj/WjoMdkUT1WBV dMDuozEzNtYELhoVscT8TKNYKt8svxizS/OiaklcUsdCUw3lpEFIE5X6bmDTPxPW6r hXbva8FgySMXlrR/HGsW1v3yrSTlTyUy1t/IAGvCAxnWHfEtFfJcNrj8c9nidX1114 IzAZxv0hz2r9w== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:46:01 +0100 Subject: [PATCH 09/11] 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: <20250226-nvmet-fcloop-v1-9-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fc.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 391917b4ce0115dbc0ad99d1fb363b1af6ee0685..a5f7cb18ac9f49e41626e1c9a03= 1c3cc830af9ba 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1610,6 +1610,37 @@ 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; + + /* + * 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. + */ + for (;;) { + lsop =3D list_first_entry_or_null(&tgtport->ls_req_list, + struct nvmet_fc_ls_req_op, + lsreq_list); + if (!lsop) + break; + + 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); + } +} + /** * nvmet_fc_unregister_targetport - transport entry point called by an * LLDD to deregister/remove a previously @@ -1633,13 +1664,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.48.1 From nobody Sun Feb 8 16:05:22 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 B54D5235BF3 for ; Wed, 26 Feb 2025 18:46:22 +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=1740595582; cv=none; b=tI85Zr7QdEf4OQ2m7S9W/eAMXjwoEa39vqhLqXQZd3Pha7uwWIvN16HawL/+IeMTD6g02rd22zdKQlx68ZAwK5UtunYlPCTrvTlNsQT5WhCwOPBAi6KnRDVaPaqdp/5w+vNt8+FWZ6CrTl6C7+ZKaOF2jB530adxeAf6Ljpqm2M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595582; c=relaxed/simple; bh=rKfUqV+Xi/1+X0Vimi9wbQfzTnlJ+u0a0ho6TF13EkE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VYEZ0FYDgo+6TuQ50xyOzzRkG9bJQ6geRaGDYrIht4qK/bcfXA2TZnKO6UIW0f0jWah04i9W3oHTSXUzr2NkjHDUp8cqfCHZzgICSWpSHYtUnnnw7xkAdfnVZeWqEjLOMlnq1cG++uJX54zLrsqRHRTTTft2TnLB0UeoImQm1p8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dIpJWPYN; 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="dIpJWPYN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C11ECC4CEE8; Wed, 26 Feb 2025 18:46:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595582; bh=rKfUqV+Xi/1+X0Vimi9wbQfzTnlJ+u0a0ho6TF13EkE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=dIpJWPYN6CHZZptVdcsD2pZ41EWeSTLFgSyV5iXq5a+ohjP0UR2Rk1VT2JHkX5cvp WvZ2fqvEYZwauwSHi1reMtRwCfTJhVHHeaaESf0y2yn3q8NKibHNshJ1oh9/e/oNYR j+Gq1dpNmoNSQtNieLWOermSpCbqc5F0Qi4udAlkkzEIOSNenPI3SvamNTxJPbRXAY y2AGj/TK0VVtWW5laMlp5k21b6HeBBFEhktE/cUKN7womc5TqlpxbvTg4tiaX6jecM noH5rWDtKvmGq7ZKVo8yjAFQTpZ/13doaNSYTDbYHLbn0ocOmuMybsp64TxvTIk9Mp kohx1p/H6I5rw== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:46:02 +0100 Subject: [PATCH 10/11] nvmet-fc: inline nvmet_fc_delete_assoc 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: <20250226-nvmet-fcloop-v1-10-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 There is only one user for this helper function, just inline it. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fc.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index a5f7cb18ac9f49e41626e1c9a031c3cc830af9ba..fcf191aa1c6bf73e7fb84213bbb= 7eb76a486734f 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1077,13 +1077,6 @@ nvmet_fc_alloc_hostport(struct nvmet_fc_tgtport *tgt= port, void *hosthandle) return newhost; } =20 -static void -nvmet_fc_delete_assoc(struct nvmet_fc_tgt_assoc *assoc) -{ - nvmet_fc_delete_target_assoc(assoc); - nvmet_fc_tgt_a_put(assoc); -} - static void nvmet_fc_delete_assoc_work(struct work_struct *work) { @@ -1091,7 +1084,8 @@ nvmet_fc_delete_assoc_work(struct work_struct *work) container_of(work, struct nvmet_fc_tgt_assoc, del_work); struct nvmet_fc_tgtport *tgtport =3D assoc->tgtport; =20 - nvmet_fc_delete_assoc(assoc); + nvmet_fc_delete_target_assoc(assoc); + nvmet_fc_tgt_a_put(assoc); nvmet_fc_tgtport_put(tgtport); } =20 --=20 2.48.1 From nobody Sun Feb 8 16:05:22 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 ABCAD2397B4 for ; Wed, 26 Feb 2025 18:46:24 +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=1740595584; cv=none; b=uPKufKoWTuAUquR/YbKvHpWxQFjIIGB4E/U51vMyEMoGKFruTkkAC2mdGs6dDZTf+ZAfTI28of4oknuRdIqlWz/PXPLdLhOaulXeZcKu2aaEkPTPcfz/XoUyfiBESsbnk2KKAZs9UQaV3V2iOAgI0DjMhSN1JePxRQ5ZAeXB+eU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740595584; c=relaxed/simple; bh=J6AUMJGnaDgNqGbm3jWxZfLL/F5J/3cqMBGDn8TxEhU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HagxXijL4JYGdy2r1b47Lf3IanJ6jC0xgkQOMC1yGpkwEJueKlu094vBwbmI28og0OFWSjq+ztqnQadNMFl2KS+pRLtPtL67kPiZfpTIf4Xp987LtFiFBeTjvXCUWD01gP5les+Yd7x5AYTW4EvqgzIKdAFZj06kKiSmyjj2PW8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kSVuxNPs; 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="kSVuxNPs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 34F2AC4CEEA; Wed, 26 Feb 2025 18:46:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740595584; bh=J6AUMJGnaDgNqGbm3jWxZfLL/F5J/3cqMBGDn8TxEhU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kSVuxNPsr5z8gfv9sJnCSxMOn+PWP4P+YDtvlktP6ScmbMxgDBaNrzz9Q07Pn7ZQE pwUlgw/TVx7Kv5tYf6IGsEpAQaTx9+/BRsbhZA+OcLiiyW1I4TNjMd65o9mqLwcwaE I5eR3wVxFGSrT8BqHtK4KmNmYgFFQlodkWkW/LL6kta96lvFSrgVRKT0AoijUxJTey ofCBjfdtdvvPBS11BETaVNzn/ugQ4Hp8JTFgoYJIIHgCgTkt1pEqHoQZJR0ZArHz4J gkc26nTWMd3gvh7qI9poiRsrE1i6Ij7g1+a1IkmqnfXmvmAJ9MHQCl4HWlJ/0swl7F Soj5jWtWNqWnA== From: Daniel Wagner Date: Wed, 26 Feb 2025 19:46:03 +0100 Subject: [PATCH 11/11] nvmet-fc: inline nvmet_fc_free_hostport 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: <20250226-nvmet-fcloop-v1-11-c0bd83d43e6a@kernel.org> References: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@kernel.org> In-Reply-To: <20250226-nvmet-fcloop-v1-0-c0bd83d43e6a@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 No need for this tiny helper with only user, let's inline it. And since the hostport ref counter needs to stay in sync, it's not optional anymore to give back the reference. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fc.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index fcf191aa1c6bf73e7fb84213bbb7eb76a486734f..f42f7c674f69b87a43bf06639a8= da60d14a48509 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1009,16 +1009,6 @@ nvmet_fc_hostport_get(struct nvmet_fc_hostport *host= port) return kref_get_unless_zero(&hostport->ref); } =20 -static void -nvmet_fc_free_hostport(struct nvmet_fc_hostport *hostport) -{ - /* if LLDD not implemented, leave as NULL */ - if (!hostport || !hostport->hosthandle) - return; - - nvmet_fc_hostport_put(hostport); -} - static struct nvmet_fc_hostport * nvmet_fc_match_hostport(struct nvmet_fc_tgtport *tgtport, void *hosthandle) { @@ -1187,7 +1177,7 @@ nvmet_fc_target_assoc_free(struct kref *ref) /* Send Disconnect now that all i/o has completed */ nvmet_fc_xmt_disconnect_assoc(assoc); =20 - nvmet_fc_free_hostport(assoc->hostport); + nvmet_fc_hostport_put(assoc->hostport); spin_lock_irqsave(&tgtport->lock, flags); oldls =3D assoc->rcv_disconn; spin_unlock_irqrestore(&tgtport->lock, flags); --=20 2.48.1