From nobody Mon Dec 15 21:50:44 2025 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 E09CA1DF755 for ; Wed, 7 May 2025 12:23:05 +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=1746620586; cv=none; b=d7uThpq72bdzp/JIT40yL0jkMs6g7Ba0srOUVXSw3wsyVzeBbsopdPhndDM9FgZgeY9N8EkMs7xLNonVFO/oL824UD/pYkbSUslDkIwvflrRriUsM6GhqK3G+S7/Kyz1zLCs/V0dCdryFBPHZIGn+WEAXdfun6XUIJ1XNTgIvZo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620586; c=relaxed/simple; bh=jEKbG5pfx1l0nP/U7lRUSa0XqnGWbsgWmnMw8er6V34=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vCpqz13sUKbNxppNLfEAttqZa+Cav+kbT7uI+3CmxMEk4F+yZUUD9NIksOdW2+iDjRPdOWjsflVSHNA1Sf0BRtEravB5qo+8kAAtXv7oKenzPwTlQer1PMOZWYcQhIFH6dH2Pjg5xq+5q6BkMKdCzeXQRtcNbf3EhXTESbsFvfw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JDVYH5OS; 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="JDVYH5OS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F027DC4CEEB; Wed, 7 May 2025 12:23:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620585; bh=jEKbG5pfx1l0nP/U7lRUSa0XqnGWbsgWmnMw8er6V34=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JDVYH5OSvHrHuHWyeu4oC6KasDrRjMjAHTjM5s2tW+q3xjpCWjaz5JBb5fARtu6To f+3enFNz4pbSye06rxYGULNcYFuC0JnNxWHMLD3F284fXnq7ZIW+0MYR/7DWhXTm0X 1d4TwlT9WY9zNGXKPZKksacH5JSFd1/ihXVbOYnvHrTQXJcBhNqPpC+MjAjI9pNn2f 1HwETJJjUaR+M4ngAaNJetvrhMi7mE5xAND4scBlZLb4LtWtjDCIfGoNIEE4fg4yMk oRDR9op8Oa2CKEE0AFeb3dtZKYJTiYIPPpsrRKW9OG12q4hicYBV+Hi+WmWgNlKiLI vuHdB+UvNlvBQ== From: Daniel Wagner Date: Wed, 07 May 2025 14:22:57 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-1-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Mon Dec 15 21:50:44 2025 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 C8B3226A1A4 for ; Wed, 7 May 2025 12:23:08 +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=1746620588; cv=none; b=smWcXd1UgVr5rw3HvfuenHPZ+yffvF7DXYtI7UlzdmsBg5snNaTVChx8Ns/c5PvuJq38emXeaEq+GIw70RHwAIR+eRbsbGxrswaWL2TSJeK1wHe4WqD9moqM5cax6VuTL54lCJTusV3BK2Z87YgeGvu2ppWfDxSnb4fb5pRTITI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620588; c=relaxed/simple; bh=Tey/jPpQIblgm+n0ERiQKMTVIjHrNonHGj1c23bE1TI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Scz0uFEf9sJiHURRRQhX0wCJxj49Xjt+5ymHcttHQFVxZK2xMF7oiIkdHA5MN+nko9KmcxIzg9gQcFb3xK79AjO7VLIj/s+wESBOfyEmohD1wK40orGJnPJkPID8ivhloguYR5IQ8PZlREWWHMVareoIhPNfxaP8FAujdwfF2jg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gZiN0O1l; 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="gZiN0O1l" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D3D5EC4CEEB; Wed, 7 May 2025 12:23:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620588; bh=Tey/jPpQIblgm+n0ERiQKMTVIjHrNonHGj1c23bE1TI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=gZiN0O1lCHy/mbuM0dwpSBUZV366vh7C3QMSeCid5/l28x5EpygWDgVdbG9WCTsY1 xi0S8B12L/xNE/bdCWA2cHua9KO+61ursME2NNOhOAfJw848NjFiHix0vhlrhnLBWS 388KCJ9hMFuB3VKeG5OkjA7IzYzYx7LuUWCKs3E8YWkhDnrr1NJxq3Yivcg0cYxBSE 86HLHDoIoRJ/LXDXaaE637c8h70SgFp+gzuMYGrA+poU4nKCY5u1gRT/QfQ3PkrzZc xV0UaQ29ie4KzUs+EDkKpojhrdF9I3WhKyP1zZ3GD3oSDoJ1RO/C1QrkhP0Mr9EMQS 0fUgPx93LYguw== From: Daniel Wagner Date: Wed, 07 May 2025 14:22:58 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-2-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Mon Dec 15 21:50:44 2025 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 A7D2926AAB8 for ; Wed, 7 May 2025 12:23:11 +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=1746620591; cv=none; b=MMF4myiFWIK9q8GPgBqUNRzmF2q2nosu/IBMb1EtGmgR+e2JIFD0g8AtlOPyCvA8aUyUv3Je1UdJopNhUoN1ViOFg+UQDfQAsU/BX/kp2zd2rciBTVDsgERdzhdKV70QTUNyGCY4F3/zf1QEal0toKokn3QJcFwcdVcM6o8x61M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620591; c=relaxed/simple; bh=WIyTwsTJp2Ocp62+fElWZqeO7HPFddxPBlIHu9Wp5HQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XaMng6DtqbbW+Hj/bs8PPkkvuHYvo2tQjf3gYkFqUjI0MqZVT6Zlt6ho2KNJsydhLEWluq/5Tm++wkH6UwlpvGT+V+2v7KjSpHguneHcYRbJJP8C6SK7eWneNObKvTomKZnJo2+5bg6Pdcfh9GlFSTThMPM9e8SsIp/CIaI6yOE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MfXOhlrJ; 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="MfXOhlrJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF540C4CEE7; Wed, 7 May 2025 12:23:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620591; bh=WIyTwsTJp2Ocp62+fElWZqeO7HPFddxPBlIHu9Wp5HQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MfXOhlrJ8/WI8Pe0tCtfCkOX3rzP4GKs5T88RZ8dBczSJFr/akF5FojaCTP/cgPDY CEjTxi7YJvXE01A21awPalFxjxMoJqD5QNkVWzXdBu+ASplCWZS7wmyLdG8i0hhQua 6rPwv/zeyCbrtNFUocVCttyDcRGDZNQpKh8aVLt+al+YBOckefvJJ3/JjP+gKXvTXj bVw/gVVPC+1NbzSqeE5vmLbLrMmpSORxoxZ0OrMquddVTJ0ojqYonE6xDCLrUAUEwk 6LaZiNb/C/sTwm3x1bRwVMYx+v/VnXh4FyVjnY+wC/2AWjSMoQqVesODZe5WltnVay x/P/pvx+nH12Q== From: Daniel Wagner Date: Wed, 07 May 2025 14:22:59 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-3-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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. Reviewed-by: Hannes Reinecke 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 Mon Dec 15 21:50:44 2025 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 7F3812698AC for ; Wed, 7 May 2025 12:23: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=1746620594; cv=none; b=VtNs69ZhOl2J87GlB6M5tQI0gD7UnjiBDvBkpB+fKtUYtUVWPaApVX9jl+4hvh11yZHRunN159YcMO3GiyCn3F+G5u7987zy8BLd+DWfshF/8uOuh12OIiR/Y9EAJQzY23vkGiIt/AKmkhsI78lywihE37F10DBgkgIKGAB+or0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620594; c=relaxed/simple; bh=h35lcOoeDI+WPo72mPb2StqZOw//yaagpxzR2QHffls=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BTrnPsFOb3xVKf7vIA3dWDE9OvgS5EYDdNyIaqtESHG0LMe2L0h/hHne8fjN5+WtqGFv8EPlxcvVJjzqmDb+wvDcaB63Z5RPEh+dYzz42+2gA4N8FOjdhYxi5L9LiJ7YoXk629x19iapWPGH72D6Tk55LxdGKyXkB1FnQNZ2wws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XWTmu8ZQ; 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="XWTmu8ZQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E3A0C4CEF3; Wed, 7 May 2025 12:23:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620594; bh=h35lcOoeDI+WPo72mPb2StqZOw//yaagpxzR2QHffls=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XWTmu8ZQ6OMGcQwTdqwRBFSveziCpKdbNI3BbU2xfY4O62Uob7TmG/ak7rbzK0DFd VeQj5G3mEJIzRe2juLQfdNf15Rfm4xcRvU/pnfftrQGcHtwRJ3KMc16j503ojaFsEV iu0FM1revTzJAhEEME3ImpLCGLtSYdY4o2n9I7oKq8uS8TBcJNzXaJPujQ3j0qvX5g SQJyyrD1ASZqQjHgseg/A1C+Gx0KyYMXItD2LMea0RDNyzXhD4L3DI97nPDdxqiy2y 6rxMxialmuRLCT1cwrlDVkfaMTXbu4jxr9QbHOkGIFiSBOlEJv4EZZIod+g9GW8xnj ttxspVBqqshfA== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:00 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-4-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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. Reviewed-by: Hannes Reinecke 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 Mon Dec 15 21:50:44 2025 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 57B9D25F7AC for ; Wed, 7 May 2025 12:23: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=1746620598; cv=none; b=KcgE3MmSxI7u4vXwM97L8rHxIRlZA0zoXSjb1hZo5ac7YdOiY3WJSvlfraOSxNSNaJYyNiEsrinzqhzGiAShQ90LAEfYOEEnsxiMw/LkMfUVUEmSOuJp4p2BUF5rgRU7PsV+pfpi+Uyv+h0pfWeqPr5MqbhoZdEgGxFUlSQVqNg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620598; 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=EOA9IM5JERH6Qq3KbsR/HUAarWU1hmjOJhGdjXRAae2YXMDU+1gb3cp31r+lpVTih/A9wjORY57zQiCPz4cZ+fIsytHx1WLdmA36Cg7lY+tU0q60TYeQ25Tp/lBd/+aK4BdJPh+3CnfTChRFVg6B3FDbcC9W1WhSNEsGlnjdNCA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=E4pf1TPG; 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="E4pf1TPG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6F838C4CEEE; Wed, 7 May 2025 12:23:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620596; bh=EWB/sYzoB8CsG9hgCZR+RFlRMAyDx5p/cXloDsy+UNE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=E4pf1TPGVmBdUIky47hVFkGl8bu7ltq4xtdCI8G/lqa9Ha1+WbUT4u28zHHZtm9Er 7f82C0jD5WlOu6VNr+NGvd3RWKTr+yjMRrwlsFgbfkyvRovPtsg7O/sc4hjFdX6r4D C7+W+TeLZ13/0OEN06QAWDPw/cN4Ml/J08Xs9bvJg9mk7/A77t51GuFPodV13Xq6id f2uUSjnJTMYlqo+fWm7DqZK+kLOnPq1R7jeNzD7GVmXKAl0JH9+RgPEbEUC81061RZ 1zBgl5xC8308xy/bWvvVQGLbuYeU+tn9UxVWeiY8zCdn68gGDhARGxrrk+ADRPVib3 Yu5iPvJHAJAxQ== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:01 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-5-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Mon Dec 15 21:50:44 2025 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 54B8026C3A4 for ; Wed, 7 May 2025 12:23: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=1746620600; cv=none; b=JmBTQrOXAEPZmOps+aEV7MaoqZht7yc4R1KTOm1h0mjnPLvxwn9mKuZJV+e2FRdW3MQ3TXXyhgcOKkH4AEr4akjI3ULmdbABPbbCZnBjpd4siUhXoW38ar2ghmKQIsKhxPmR2R/5WVNOkIo3az0Bk4N4G0ZQ61DAhG/rVwQ2J3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620600; c=relaxed/simple; bh=gsPh10Lo83G0mW4lltW0uPRenCo3upye1tmBE7bC6JA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Nnzxp4El6Ayb2w3eHE7KxV3i3JShGH2uZP3wb7CBe2RHMtDVNHdkyk33Msj8/EFDaCSn2A0HMzb2gb/OfWNR8DcKmbay/W3y/5FPo+fKuru0oAa+Wqb+sLwl2WWMfvZYEH0RKejkuo2hFUXffD93I+b6reBXbIVZLX6lBrBDXlY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cg6shGCh; 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="cg6shGCh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5EC96C4CEF4; Wed, 7 May 2025 12:23:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620599; bh=gsPh10Lo83G0mW4lltW0uPRenCo3upye1tmBE7bC6JA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cg6shGChOnEbATiWv1dIkMBs8t3m6LV4GH/AFLINNjv6GMxS/cAyhr3JiCmcAXSzk unYRSsSx3JMu/Q6l//+aO+gsCUayL0HhnQC7nReODX2pCN6r7uUPWGlzDNb60LlfTh tSObZX3i6GUOJLgqPeTjjsLrkWZfPrkdXq+fCfiqI0iGAliYebeCS7OJ8ukmPeVGF7 ZtmVGr72vHwIxPtUABflffter1X/wKmyBriAi/4GUJYZsUtKt4halFTE7AHuhBlghl UYkc2pJ1KlcC3Kl8nvHslusFlZ84biYC5eS9YGHHDL7c+itRkMhWkJcavpOf6MKaLT rOQdu420cFj+A== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:02 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-6-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Reviewed-by: Hannes Reinecke --- 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 Mon Dec 15 21:50:44 2025 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 E279A26E15B for ; Wed, 7 May 2025 12:23: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=1746620603; cv=none; b=SC8FQBgZGqOeSL0tzO/egUeJBofs/sllyQROVtR30QN0ZgfZLm61R3YH/77loypoqdG2IgKpi8DLD5tje1Bi+Vo8zJ4V+a9qpIReq0B96ogD7tEaashxFGchebqM8+JxV2afuYMbIkU/5ZJo1yJ6eRNw0/ZKDdcaYOsGLUfiMyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620603; c=relaxed/simple; bh=bWfF/z6J6VjDnFu295fwOKQGsLQiUbigzuCMF8Epxkw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C+TevYkwPB9urWJz/I84mUaK+Dqy6Qt8AHctvrofy05X8xjqVRXB80b2J/TeCNLFHwg17sa2YTzra39FKPd4L86UUBD18nlHjCBr0RWnUf0Ho4jtWYdYReUSIUc5h2lmZxcH8IokQEe0ggOsDyYuPudkzjjnLCq5/ASHxZq1dY0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aKocHqCl; 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="aKocHqCl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 545C0C4CEE7; Wed, 7 May 2025 12:23:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620602; bh=bWfF/z6J6VjDnFu295fwOKQGsLQiUbigzuCMF8Epxkw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aKocHqCloH3XUjV8KfPLiFtcfK4rgFUtH8psUn+MTLIHKbWMurnP9cM6wzMEkD8z/ 7JFPItaOTQukdfrtMSbHhpMPG9cCTqba+ofjxjETHUAfacHqdp32pDR62UJ8SOwonE tPim3gqH57e7PeGctL/O9hlpyvigibfpVUViStM+RrI9MX8UL9putJwa+k9zjeK1zy XZKdpi0OEL1vnb6A9U+Vd22mR+1vTvFUQmd4Sq7i6D39h4uMOklAnb8dMDp9QuOSYf 9aN9+nwuE8Eg9qyFlR2ejUYLVqThZxUfAP1Nv/3/9ZSk1SqwS3Zp6kabdwiQELqHLW UYAZK7z6+ANow== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:03 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-7-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Reviewed-by: Hannes Reinecke --- 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 Mon Dec 15 21:50:44 2025 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 F1DDB26FA53 for ; Wed, 7 May 2025 12:23:25 +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=1746620606; cv=none; b=RMyfegGLJQgRe4I+xqmoNmfASROYeomJGf2KMxVggilVjLZIkb0HUjeGLkHrvimpkURjlfV6ebsXLkYQSeLzPyRIn2ID/eKHV4IVJhjtFnafmEl5coG2k2o7W9QmO82aLsJLXfea/kIzYIoCUicI48X6E/62z0MaTxMh46JMa98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620606; c=relaxed/simple; bh=6b42JwnMURdt5WTJ46ewytcIr/A+kw+Ss9xMkw6/v2w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mWYak6WGcq1JPk/lVQb4rs9JYKU+QSlt1sw2xOyNI53qOQ8yB4pNbdYuWnR98RLkE/2T6rqKz1NinUzIj5ytUFBAi4mbEzGJE8wqkS1i7NrQUjNxe5f2u0a3h9iWSPw7GCZEZ1t0oniwZuT62S2KJ2hasCcGlX0dWi8otq6pAV8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iSB+1aM7; 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="iSB+1aM7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 16E64C4CEEB; Wed, 7 May 2025 12:23:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620605; bh=6b42JwnMURdt5WTJ46ewytcIr/A+kw+Ss9xMkw6/v2w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=iSB+1aM7jMplBaAZ5EVqgcIAvWm0z4oGtjQ3KMzqOxlY0KTK75ubKmtI02eEcO9AH 3096cqOZMGiU6pu1rtcKyKfqT8btRMpg4qoego/QvGEHuX7DRfIyNQp6WE/9XKcYv1 iRb2k/AoNCWnOmwBJkQdjsfDVSxSKeTGPYrLbFBN3EaEiGSTe5u8ZLqvOpwyrKeOso cybwyQqqTOhqcusqqzV18JUFLIYIx/vX11ddy9n4VICJoCuKVPgN4HETEwtVseWnTX J2ySLWdnYemrk3dICluN6nZ7um5AJroRjS94djSYNzN4TKcQtuaf2kyU5LEJ70FVss LtOVQvwHayg0A== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:04 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-8-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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, 17 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 9adaee3c7129f7e270842c5d09f78de2e108479a..c74baa7f6e43c8bddd9e6948f80= 6f27b032b1d4d 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,30 +1072,38 @@ static void fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) { struct fcloop_rport *rport =3D remoteport->private; + bool put_port =3D false; 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)) + put_port =3D true; rport->nport->rport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 - fcloop_nport_put(rport->nport); + if (put_port) + fcloop_nport_put(rport->nport); } =20 static void fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) { struct fcloop_tport *tport =3D targetport->private; + bool put_port =3D false; 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)) + put_port =3D true; tport->nport->tport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 - fcloop_nport_put(tport->nport); + if (put_port) + fcloop_nport_put(tport->nport); } =20 #define FCLOOP_HW_QUEUES 4 @@ -1433,6 +1446,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 +1544,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 Mon Dec 15 21:50:44 2025 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 D4B4D2701A1 for ; Wed, 7 May 2025 12:23: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=1746620608; cv=none; b=s9bKzH1tPvnYexoH8zcTN0DFDQ8AaJojfNkmC6wX58gTqzzpOoTOUiLPfvWnVA+xosTEvjKbLSJPfN1WpVqqJd39n5mSXcAz+6VcM1xyc3Y2CF8Zjn2rbpddtbVLpYtGYpfiI8DvaO1phaxhiEkFVxL+udOMziO6eEazfnGlB1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620608; c=relaxed/simple; bh=zJE7i5AqqWtsdNIH2Blhd4mWVmfdm4N3ZoNMw7jKQ7E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XHDHl7b63KUaHrmt7nvdr0RK1GmgZbE8prZf9T85ZN3Y4HYtb3gJQe48MZjkQgDwBClBumM++6xbc87XEnUQWp+ofgFJA/EQZJxqI8K6amm4F/snIIrNvxQpW5I6+d3PCcBYUR4RwfNFwdfwUepHvGgxHIw/mJDkJF7iI3DEyJ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HhNcqvhf; 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="HhNcqvhf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E6069C4CEE7; Wed, 7 May 2025 12:23:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620608; bh=zJE7i5AqqWtsdNIH2Blhd4mWVmfdm4N3ZoNMw7jKQ7E=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HhNcqvhfcSI4WhpkJidYNlCaZhxT41q5n9dO10YlxFtNCfKCn1iIu0eDV8YUtk6Vg 2lCjiBmGUBdVCbp663J5YO2tZa9QkBBuSEaDBatuI5lO3A/9T4/cGPRWAMhBg8B3qN KiDcEYmx0cgnSPGYPQrGmB6QuMBwKh6+7U1SuW2/P43G7SGbwoJMrztstoBI2L9ZWI B971E6rKGReF62Bm1Uh40+kANCJJAv1kJ9AHe+0snIPgivnmdU/pIQ+CC6jkxX1crT NcZxPCvxalPKLIIE/eRBBasNGCZdwN9mAnuOPLtkkSVzMgKzyD1o3iGNMIAOCtk/PA RfUgm3w8Gw5jw== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:05 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-9-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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. Reviewed-by: Hannes Reinecke 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 c74baa7f6e43c8bddd9e6948f806f27b032b1d4d..f999bd6513c19b19af64e0ea547= db26b627aab69 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 */ +static 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 @@ -1127,7 +1148,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 @@ -1150,7 +1170,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 @@ -1670,15 +1689,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( @@ -1696,6 +1720,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 @@ -1761,6 +1787,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 Mon Dec 15 21:50:44 2025 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 4FD6825F7BC for ; Wed, 7 May 2025 12:23: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=1746620611; cv=none; b=GzNeLTCxMLfxA+4rA0k6aNMBW3IUQkJp72jrPtQQpKTX+1YWJ2J8T8Tt9F2gRVmTD2E9FToSHQ96RFkovLbIZjdqMQVAy4yuW+XaUZciCKu1WvlVuHfWD9m7pZgLppXb79lQ9BgEPfuz/XKRPw1hi08JZ9gRUUhcCDdKH+bpi9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620611; c=relaxed/simple; bh=wstjbJH1UyMo+LF5FaHWTbfkuXNTo5rZRqDKY0yRXBc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mUhycwdzdQKkCj+U4uPOqVSIuRhplCPKzrdHIBxUBXk4LTBesa6jfTYIBZ7jTbMuArRlbtAsoHy24+EGFRU56YktFGMRmSCuSSBKaEEI5sdq+pUXQf3ERRK5D0paJ9WDzfkLQYG+zdX0j4tlbmPcrmQRI6+N4ybkM8EB6TgqA/s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fuqAz+Xl; 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="fuqAz+Xl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C386AC4CEEE; Wed, 7 May 2025 12:23:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620611; bh=wstjbJH1UyMo+LF5FaHWTbfkuXNTo5rZRqDKY0yRXBc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fuqAz+XlOwDRClCaVi0ae1tzr2c+cpR6MsX8wyU+WblgbDTwOp7DwrMvS6v9IrF2W B5BDTJNTwXLOgBa/6d1LEjUbiPD9zGFn58+MtOChaaUnGJIXzXcKmXFwvEOXiJLFc8 kAD0++8S//6JUSfXGBIxLoR3BAzNLowEbCt+LCAJkmZSZYexeKJdxyWPtqDeZfdqKb YAZPGHW/2RYoXkoFZJV4d6L9TCtDBVNWqNoD5e5AvxUpAV4cHK5jjWtWUDVRdCA6Xi MmwqsMaPvIWn8qr5A3kIuIKdc+rcc7rucgUR4iyJtvr9eRZnpVOnfTwunrCBTVLZNO fw8th/0B6o2yw== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:06 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-10-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Reviewed-by: Hannes Reinecke --- 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 f999bd6513c19b19af64e0ea547db26b627aab69..fc10d380c17e77ed35706ddd769= 0e6f6a8d268c6 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 @@ -1234,18 +1230,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 * @@ -1328,7 +1315,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; @@ -1772,7 +1759,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 Mon Dec 15 21:50:44 2025 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 9136C25F7BC for ; Wed, 7 May 2025 12:23:34 +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=1746620614; cv=none; b=cdMPQqXsLPPu352ggCnCnJHOAZnJjiBstUDsV72cGRtOwCqpVOrayeEGQ3pU0HC8l1nN4jPWi+TvVTpbD3ZXFNMeVW7jBMjmCKY2pOMrIgWFcCqhTBw0YWR0uRsQ+D6zp4ycxkB8+/0VIy+IduRI0UDOE9sw/DkSy6D7CaXGASU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620614; c=relaxed/simple; bh=Vgi/9IyqkECjCLy4OrYLOjteLpppbj1oxp8MVjo1eQs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h+pISA1UIeTYEodMERBFSjGIEQD04t9OxtFGTOiL2GKhtpS/Oa59kzcHx0OLuVwoBupQA+42kcD4agP1PYAiovL7IPBrhuyVx21xij/DYICPBaWrzzrfN7J2E+hqyaYZiDyJLmSblDNs+AW8JVFov+Srw/wF9a+UjCW0U8UlSIE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Oh9dX8aA; 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="Oh9dX8aA" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A8583C4CEEE; Wed, 7 May 2025 12:23:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620614; bh=Vgi/9IyqkECjCLy4OrYLOjteLpppbj1oxp8MVjo1eQs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Oh9dX8aAXSTWWt+hXSDRXwgZbV0Qdq/GSGS/kyLDRyZDLOovd6fVhq+XwJ9s1zoRC OK4bKc1otjchyDHSszsnBQIkco8NM92Rk4/F6SHyCIJV5m6EdvUqfB7B6Nw0UiF3lH Q8i6jtnRlAqzAligpQbmRtbuIAZFaDy7emUQGK1GQzJqK4EvQSf434MaruefAui2mw TRsulgiNHKi6XdbH2/fdi1jmbUVEJnr8AD0y9Fh92GPyAfCL5Ey6+8jDI/oZSeIT65 da91gIW1XyL6JqqeDigUnMruJlJMkXwhw8JjVQUbZLiekajZW/+USsZdekqibn+ddT W015GCXFUlKHw== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:07 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-11-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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. Reviewed-by: Hannes Reinecke 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 fc10d380c17e77ed35706ddd7690e6f6a8d268c6..83edfd48c30db36a755b9dc7af6= 605236dc67231 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 Mon Dec 15 21:50:44 2025 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 EE7E126FDBF for ; Wed, 7 May 2025 12:23: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=1746620617; cv=none; b=cjpyy4ILDdDLn21yR+Wwy7K4nXI36mSiTKI1IkQ8PrjvutU64bVHOt/se7ffsH8AACctz2JSCYkGWtfwnrIbdTwJ5TNVjYG9bTl/2+e+kgkiTWMj3G8jr1UD/P/3LIPLOoxZvg2DqYOqaQ/IoKm8siG9Tkfgaur1FRh8GxI19uk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620617; c=relaxed/simple; bh=NnHI6Paao3NgdBRHQkL+L4jcP1yEUV4TLY9mPyueH3w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mLWgJ0aJMM5qRRTUWBZJgUg8oElczavFMo0DAcXif645mi4R8ya13s4ReSlmGccCrX3afsCMhWWUh4XX36pcxPiRgA0ETmghCgQfaiQ4y0LW8fQiQTx6KSyNA3VxN3/4haHcxu053+yErs1TXUHx9K13LA6JWbvu0C7BmTObcYQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=n6DOZW2c; 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="n6DOZW2c" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 75013C4CEEB; Wed, 7 May 2025 12:23:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620616; bh=NnHI6Paao3NgdBRHQkL+L4jcP1yEUV4TLY9mPyueH3w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=n6DOZW2cHnbY+TUFxGLcw/pa/l/tODURCwyoVFPR+n2ppRlrdgHxMDgVnwC1R4/JJ 6OSnM2824oCm9k9ved5kYh918AevGGRVtBDq92zR2pfls45cnUjPSQx1e/s4bBo66V N6tiVQShxVit4PqDDK9pSPBG2JCZvjnwawjsr7l6nmLuK58rC80i0TFMorl98p6BJl fIcbv2SzMUanpX1yWFUQnhKHatibfr1mllGjUDAwfKzmZiPLB0ySn8+3ih+OImHuOJ xiSKIymvYyFTyGsaBecB0Fxn35JOSadGuP4Fg5TFoOr1XHl5Q7Vg5M3arDI9KGx8+g zejm27lZfXwjQ== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:08 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-12-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Mon Dec 15 21:50:44 2025 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 24142272E45 for ; Wed, 7 May 2025 12:23:39 +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=1746620620; cv=none; b=mX+3p1MgcG0Oa9uB/rctqtVgL3hZlSRBmIIzsxalCpXMq+j9EI4d/+aP61flyQQLEvKE5Ka/KZek8q9LkF2KMT9UtPNzXeLl8en/uRBmQasTSbXOyLDWfE4FH4UPb/oODajJRH1xORGTiMuOyJ4syT0ibmE9VEEupqcMpjxo4cc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620620; c=relaxed/simple; bh=fBx9lCEtPCxPfGwK8FPJiN/ERtJIwVRE9R9bu+NJtAM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EzDwtUXq21XbblmWU7wHIY6jxrWUJe/TJiokH9QpUXJFg/ahn/y/GqLZIQZE2jMrgPSmhC8yE3orq0NIczNgAwqCDRNp0X0iPbLsPCHil4FC5VN+pYnt/XqbOyDn2of5vifJkLV40JulAad5uBMBsCi8wDVR4uzJdsaV6kseaDE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cfvHfcNO; 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="cfvHfcNO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3A862C4CEEB; Wed, 7 May 2025 12:23:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620619; bh=fBx9lCEtPCxPfGwK8FPJiN/ERtJIwVRE9R9bu+NJtAM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cfvHfcNO1bpQMI3zNLtKHlU6yzYpbbbTItB94vFc4gKr3X5B+hLg72YOWpZm/xvCH vYOtrUvphR1e/p3RW56XBdpc8qm1+mG0jcbOWKiC1LhNTR42X4nQquVjB+hGEXR/sx 4F6A3nLYriEDIUpErr/syXjILVglt8QZLX49xyzaqR4xtsvkAQo0xaWu15xoDoc/j5 zzpEorbRT7Ce7dngeZBbKrI/F626Z8/vVr+rXxGGZ6ELccikT61Cjo3JJRUdcLfOGU CPy60Xthh+pwUxHshO3VTGkLVjNUm43WBwAr6oGUcflCJwiGTMmlowL7krdZV4cWLf aXcB01bttZ41A== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:09 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-13-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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 Mon Dec 15 21:50:44 2025 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 CF6B0272E57 for ; Wed, 7 May 2025 12:23:42 +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=1746620622; cv=none; b=OJBPp8Azo0IPYdDn6tKvQXPbSdUQlssAFQRAdIJo7Yah/IY1rVHYBT9+PrvszpHZNWSDdtlmgYQv/QiVisaHQjRB5PmD4XMXlE4IZoMu/RWqN3QlTxdqFL+jbCoi4TZ4mN/9UmdWXHNp1f9z+O1gECm2FvBKvFQ63TqOkmFILOg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746620622; c=relaxed/simple; bh=/cLfvZPaGaKqTv5rGWJ2lfAMdaEHdJl7YqBZZkkNksw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fSf+uNwWQZoAK8CedesgfFYhTKmgnLfiCYEmpq2nHE1FwZtnnSCgkdYC+WKBY6hNFLuXkN1ZiHnjqIQvXrjIpo7MqJpPAM7AE357qcuBtQ1IU8hJWINXnH8L5YTUJ+WOBvBU91Fchmqpi5aLr0SrPXNctigs2efiVa2+RRfaIG8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WGa0vt5O; 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="WGa0vt5O" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 43838C4CEEB; Wed, 7 May 2025 12:23:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746620622; bh=/cLfvZPaGaKqTv5rGWJ2lfAMdaEHdJl7YqBZZkkNksw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WGa0vt5OBWRnroe+ljbi0hm8kLENjCa2GQPPN7XKp6V0BBiTF19H8tqSTfh7CRZWx WYwWCcxEoZFuKpoSoHFB3DiCJv5RpwKtdJhYkcI+6Qegd1ByKOw+obuvZudtLGOAgI X53WtNr2YSdLCJOJEqZzwnphYNQKQOOlPJvhBjcc8eai8x2bZAraNjQg69wMo3QNuT Dk5HDEdUHsH1C9pxYmD8WectqcO5UycNxlEFm+mbo9tEkV7Fz2qt0azC8FwABN3vYb g3ORnXhOrzHXDdZ9TdsndFHh5Ab0vT0DRhb5UdOEkrOc93TlniHwGAsX0jTn0HTMqs d7nNqEdUw4MAA== From: Daniel Wagner Date: Wed, 07 May 2025 14:23:10 +0200 Subject: [PATCH v6 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: <20250507-nvmet-fcloop-v6-14-ca02e16fb018@kernel.org> References: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@kernel.org> In-Reply-To: <20250507-nvmet-fcloop-v6-0-ca02e16fb018@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