From nobody Wed Dec 17 10:21:30 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 504C520896A for ; Tue, 18 Mar 2025 10:40: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=1742294405; cv=none; b=M4qUeDgjvjAluhrYjRhDnF+Cr9jTT2Ru/lYRNgyEQIPsjWyvFyWVjBHJ1OgnYPiXnfJNqJslbdTvwyqoLe8LMcFNAL/TBlvqeRtQ8XPgd2b9ZAe60d24I0uEhYy7osRk6RG0t//KP3mv9BgryABXWSt58hxd8UFM7HvyVloSITU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294405; c=relaxed/simple; bh=MWm8eqM6Uuk9iRoCyRSd03Uok+xmCB8TLkbHS2USEkw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GfIaUQPwydHNugoO1YcfC743tsjwD2IpsSzzurlxxnoCP+gP0la+FhzZBLWCVbgo+V/bsSjw+r9XshnZNEHS4RNzWcRLW31IPLHKQ4rZaaOOLbpgSmZMmRUJbuVXHTEY+fqBbR8L/rykThc4r2w/CyVaTrECo7CPQVBssdCKT/0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=T+Wxssv1; 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="T+Wxssv1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id ACEC0C4CEDD; Tue, 18 Mar 2025 10:40:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294405; bh=MWm8eqM6Uuk9iRoCyRSd03Uok+xmCB8TLkbHS2USEkw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=T+Wxssv1ktILToEPxp0tOGXSSNJ5BxgwAzRuiNw98ibxuMAycNI6FdRmPLWoNVw5Y +zeVd9+Z/dzdWAkU2XfRDbs4KupVE+TGcgMMliWNyS67G9Sl40fhRXkskYNe8Zg+qJ RNju43IlP6EcgB16p8WdMcpBF2xGrhuRGW7U49SUrFINpY+sxQ9asuYcD3XHqtTcf8 NO5Pb66yAO2jzrZ2wxHpyKeJ6fXNd1LrRK3swJu/X3yHLt728bv2eA/cJEkkyvJEzd 86FgohH+DoSQb5s8Sjd6j2aFQuRVWJEOPsCfMbMXcIGi2TXCo0pXD73FrhTPLQMe7j /GG0hWuYVhRGg== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:39:55 +0100 Subject: [PATCH v3 01/18] 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: <20250318-nvmet-fcloop-v3-1-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 3390215b1c1f040001985a0d33741e57f1f80cb3..09546c3161fd9828234e58641de= 3e53519e27824 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1004,6 +1004,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); } @@ -1362,8 +1367,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 Wed Dec 17 10:21:30 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 DC5BC209F4A for ; Tue, 18 Mar 2025 10:40: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=1742294407; cv=none; b=nRDC/APDD1UUE5ORMQ2qqGAINZHZf94359tl3Wr0QVx/pNnSm93jDHDr0Fuz3oNcPbR9bnfJ/yBkV6PciHcBc4JbIQctWJleYvOh7QW9bYxj0a75Gy5M+Ef6Lnih1bCCbPHQeaj3sT/isyU4OwVng638iBKD+XQvW+oa+ObxoNQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294407; c=relaxed/simple; bh=uYbbJ9Lv9B3WY9bnHVcEuJUkAEU2zR7VmzonuvW3zrI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=okVeqfvScz9tUudiiHgemI8liVYzJJ4npPnOm5roSxCQ4bE9sUrB7RUG0OMQ3AP5ZWX5m5PogtPI0JG4v3cC5MUB6p51oonopIS25P9jJA9ylewEhYc8aR0iOhiqdrzFToqwqyAezbLZHCm1kVIsn1qw6J2jWxTCZ5jE2xQeolQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZtXEn89D; 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="ZtXEn89D" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 611C0C4CEE3; Tue, 18 Mar 2025 10:40:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294407; bh=uYbbJ9Lv9B3WY9bnHVcEuJUkAEU2zR7VmzonuvW3zrI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZtXEn89DkL7cjlYUGmmA9hqR/oWTB7wDcEXCOH7GG6L3tu9JMgKAHYYFogak98jvi Sq9b1ZUzUSFPvoOibUcrG3YQd8KpUDK8Ocx1ETIJPWbxRtmXn6ZLI/2bp3HcyezFhD Vbjj/MqkYamStI/qa3B6uehOEzpx6vz+kluMyD9CUgEvZwfUCZ25f3ZUZnAzKKXRlo gQJPg+Yi1kWyW8m9gphxBKABOLbmTUrEAAqGsrEXRIhTtBsNazPeB4v5cAGSbO55HC JZcOyOKP1GAGEu2gi3AA4XK5A1LfefxBKPwEOE+5R8jpmv8k8I+Ol4QnahpcuOor5k VpUMieQrBpTTQ== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:39:56 +0100 Subject: [PATCH v3 02/18] nvmet-fcloop: replace kref with refcount 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: <20250318-nvmet-fcloop-v3-2-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 kref wrapper is not really adding any value ontop of refcount. Thus replace the kref API with the refcount API. Signed-off-by: Daniel Wagner Reviewed-by tag after this review. Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 09546c3161fd9828234e58641de3e53519e27824..cfce70d1b11ff305b203d716f78= fad23f114e9c3 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -239,7 +239,7 @@ struct fcloop_nport { struct fcloop_tport *tport; struct fcloop_lport *lport; struct list_head nport_list; - struct kref ref; + refcount_t ref; u64 node_name; u64 port_name; u32 port_role; @@ -273,7 +273,7 @@ struct fcloop_fcpreq { u32 inistate; bool active; bool aborted; - struct kref ref; + refcount_t ref; struct work_struct fcp_rcv_work; struct work_struct abort_rcv_work; struct work_struct tio_done_work; @@ -533,24 +533,18 @@ fcloop_tgt_discovery_evt(struct nvmet_fc_target_port = *tgtport) } =20 static void -fcloop_tfcp_req_free(struct kref *ref) +fcloop_tfcp_req_put(struct fcloop_fcpreq *tfcp_req) { - struct fcloop_fcpreq *tfcp_req =3D - container_of(ref, struct fcloop_fcpreq, ref); + if (!refcount_dec_and_test(&tfcp_req->ref)) + return; =20 kfree(tfcp_req); } =20 -static void -fcloop_tfcp_req_put(struct fcloop_fcpreq *tfcp_req) -{ - kref_put(&tfcp_req->ref, fcloop_tfcp_req_free); -} - static int fcloop_tfcp_req_get(struct fcloop_fcpreq *tfcp_req) { - return kref_get_unless_zero(&tfcp_req->ref); + return refcount_inc_not_zero(&tfcp_req->ref); } =20 static void @@ -747,7 +741,7 @@ fcloop_fcp_req(struct nvme_fc_local_port *localport, INIT_WORK(&tfcp_req->fcp_rcv_work, fcloop_fcp_recv_work); INIT_WORK(&tfcp_req->abort_rcv_work, fcloop_fcp_abort_recv_work); INIT_WORK(&tfcp_req->tio_done_work, fcloop_tgt_fcprqst_done_work); - kref_init(&tfcp_req->ref); + refcount_set(&tfcp_req->ref, 1); =20 queue_work(nvmet_wq, &tfcp_req->fcp_rcv_work); =20 @@ -1000,12 +994,13 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localpor= t, } =20 static void -fcloop_nport_free(struct kref *ref) +fcloop_nport_put(struct fcloop_nport *nport) { - struct fcloop_nport *nport =3D - container_of(ref, struct fcloop_nport, ref); unsigned long flags; =20 + if (!refcount_dec_and_test(&nport->ref)) + return; + spin_lock_irqsave(&fcloop_lock, flags); list_del(&nport->nport_list); spin_unlock_irqrestore(&fcloop_lock, flags); @@ -1013,16 +1008,10 @@ fcloop_nport_free(struct kref *ref) kfree(nport); } =20 -static void -fcloop_nport_put(struct fcloop_nport *nport) -{ - kref_put(&nport->ref, fcloop_nport_free); -} - static int fcloop_nport_get(struct fcloop_nport *nport) { - return kref_get_unless_zero(&nport->ref); + return refcount_inc_not_zero(&nport->ref); } =20 static void @@ -1253,7 +1242,7 @@ fcloop_alloc_nport(const char *buf, size_t count, boo= l remoteport) newnport->port_role =3D opts->roles; if (opts->mask & NVMF_OPT_FCADDR) newnport->port_id =3D opts->fcaddr; - kref_init(&newnport->ref); + refcount_set(&newnport->ref, 1); =20 spin_lock_irqsave(&fcloop_lock, flags); =20 --=20 2.48.1 From nobody Wed Dec 17 10:21:30 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 4EB6520A5C4 for ; Tue, 18 Mar 2025 10:40:10 +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=1742294410; cv=none; b=ah8rlP9q004l4d3/McELFJ0qiGZPYM6RNmMlRGHKOBKE36O6rOXvXx/xwpTrubXOtCcc86e2BihyBip31zIug+fvJgSa9TuVD6eRE78eu4O+XkCtHKsPZoIzUhUvHGV7tdwdYVrKOWDveLOhr4ZRWX5NeWSWiX2CMr85AZISoU4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294410; c=relaxed/simple; bh=OQSv15/6TyBgYVPiFmCsM9pOg5Rh9yhAqL/bdMmg7e8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MroJ95IxTBSiG4vggCIdQMEXksIPEM3jCY9Cso0gb//LQcGavuV60bmA7YCcUyXpDe1cE0vet2iM3FxBb060/nKUAEkCcWzZutd3iG2E1RPitqr8VzUqXV2NH5tM6Em1dLXyn6lfU13Q8B4riGO6bcNN+YhSbRXgPQLVXOUbOFU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PPeOYr/P; 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="PPeOYr/P" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D2330C4CEE3; Tue, 18 Mar 2025 10:40:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294410; bh=OQSv15/6TyBgYVPiFmCsM9pOg5Rh9yhAqL/bdMmg7e8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=PPeOYr/PZrvh+L+uTQQ+nlAvj/DS3C6WxgD2OF+1DOERvpwX3Agzd9LJgdTXb1YYw TUxlsAAeg4IJTmR+EfsKeoOlmORLFa0HjDEdeEXNTN4RDBFMQtQx+iJjNt0nc2pjT0 nYlAZ7qE3utvy3SyiJdcY3Ykt676iDGuki43k+49u7xUhN02DxQMsT1eEXs3qqqI9o 9i4ntJdbI8j+AXzl4GxXyylImG47FMCwLQEKfUrDddbR5zPksklvpbvp3gu5KXYZg2 T+kXFhZ/kt+X3IeNvwhNxYu9VI29cROX5bZq0f5XogeoLhFmKhx3GSMfbTUJCCBF8o VNUcpdI4LYYNg== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:39:57 +0100 Subject: [PATCH v3 03/18] 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: <20250318-nvmet-fcloop-v3-3-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig --- drivers/nvme/target/fcloop.c | 44 +++++++++++++++++++++++++++++++---------= ---- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index cfce70d1b11ff305b203d716f78fad23f114e9c3..c6d5a31ce0b5ccb10988e339ae2= 2d528e06d5e2b 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; + refcount_t ref; }; =20 struct fcloop_lport_priv { @@ -993,6 +994,27 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, } } =20 +static void +fcloop_lport_put(struct fcloop_lport *lport) +{ + unsigned long flags; + + if (!refcount_dec_and_test(&lport->ref)) + return; + + spin_lock_irqsave(&fcloop_lock, flags); + list_del(&lport->lport_list); + spin_unlock_irqrestore(&fcloop_lock, flags); + + kfree(lport); +} + +static int +fcloop_lport_get(struct fcloop_lport *lport) +{ + return refcount_inc_not_zero(&lport->ref); +} + static void fcloop_nport_put(struct fcloop_nport *nport) { @@ -1022,6 +1044,8 @@ fcloop_localport_delete(struct nvme_fc_local_port *lo= calport) =20 /* release any threads waiting for the unreg to complete */ complete(&lport->unreg_done); + + fcloop_lport_put(lport); } =20 static void @@ -1133,6 +1157,7 @@ fcloop_create_local_port(struct device *dev, struct d= evice_attribute *attr, =20 lport->localport =3D localport; INIT_LIST_HEAD(&lport->lport_list); + refcount_set(&lport->ref, 1); =20 spin_lock_irqsave(&fcloop_lock, flags); list_add_tail(&lport->lport_list, &fcloop_lports); @@ -1149,13 +1174,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) { @@ -1168,8 +1186,6 @@ __wait_localport_unreg(struct fcloop_lport *lport) if (!ret) wait_for_completion(&lport->unreg_done); =20 - kfree(lport); - return ret; } =20 @@ -1192,8 +1208,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; } } @@ -1203,6 +1220,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; } @@ -1628,17 +1646,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 Wed Dec 17 10:21:30 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 2E612224CC for ; Tue, 18 Mar 2025 10:40: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=1742294413; cv=none; b=kyOIUTsAwP2Ozi4iaLz5QxEIzAXzLucwne0KWBA4cL2aumo0tzFV0dbcuIQelfwWKQ70O8dWsExifOZdaLZOTHD5TdwfB/RFiI6S3+fd8eA0qITrcBD9bnJ8kvRZogztlrCzosNCumZJrr8TmkyrwcLuipZZ3Kx5hQD2ZhcZA+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294413; c=relaxed/simple; bh=yMhSDrs3OiLFh+mK5j0FzUg7VsoUovJKryyHxS+INUU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UbPxH6gkfwn9oVD1om3IsbTquAFlDJkSKIs2pEadVbTcIdoRrdxQRvFVl4RPI9DuTgaZEnHRSzh/HilVnuDTIl6N6X7b5ohmIEEjMh6JPDYsJqGv34hblg6zNb+uV5UrChABkG9Jv1nE7wqMW8wLZvJph5fcbJZobE0zEprOWlQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fPsuboOV; 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="fPsuboOV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4C685C4CEE3; Tue, 18 Mar 2025 10:40:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294412; bh=yMhSDrs3OiLFh+mK5j0FzUg7VsoUovJKryyHxS+INUU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fPsuboOVKslLPgTAgxZ779BswT1cTdehAkdxevcfqLDLOrPxN0uoHU3nNrXFJYtwP CIwNKmvJWM00qrGz4p7r9okxoAebt2scrcNXXKJWurc9jCcRVkUMlGrOxBe9i1JHZp 2rTkuR/3T2fxyF9Snznsr8JQSTpiTtXJ/ORRVNdT8nIu53Fi9j9AD9IRRwOfGEGC9f x3xAj3+sCWhD/uZK8dKsG7dKuEWJrH7ntlcBH2Lwd0D4l0CnghOJ/r6RTbENyoXSt8 6n4YNxphwT+Hgglsiw3FOIZR3j2lYxphPXshz1KMJfw7dRHbfoJZAVzTJ+0gzBH9nT bicPEor6TQltQ== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:39:58 +0100 Subject: [PATCH v3 04/18] 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: <20250318-nvmet-fcloop-v3-4-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 use the spin lock only for the list insert and lookup. This allows us to untangle the setup steps into a more linear form which reduces the complexity of the functions. Reviewed-by: Christoph Hellwig Signed-off-by: Daniel Wagner --- 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 c6d5a31ce0b5ccb10988e339ae22d528e06d5e2b..245bfe08d91ec81f1979251e8c7= 57a0d46fd09e9 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1027,6 +1027,8 @@ 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 @@ -1189,33 +1191,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 @@ -1228,9 +1260,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; @@ -1244,79 +1276,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; - refcount_set(&newnport->ref, 1); + 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; + refcount_set(&nport->ref, 1); =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 Wed Dec 17 10:21:30 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 96AD5224CC for ; Tue, 18 Mar 2025 10:40:15 +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=1742294417; cv=none; b=AIye359/wJeaadUxQSLCnDRqlhtetYDY7H6eQlWREE5XF1jHDnQaY2ygkKyKz3L7MLvcMXmyErXBChjpQGgVjPPOTAWFu7O/yT+6D7SDLRs2qaMxjyJz5LE6sC4VjHgC86aBL6kHOEWLLUOOxNyCk9iM/KbG07qmPrxYANT4eoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294417; c=relaxed/simple; bh=nE75BNgsWEd3wOhWskr3tujrO/j2HRVbU7VVwxBCnRA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hE5Mn0VJ2EEAPe3RwmVhfb3nOO5a29I65MJbKCfTpmAxHrZI6fxAhxuHoqPMlPdMjudLi5LhazM5mVjMrknXqo9MlGSvMZsFNiORYnrxsfdGoQVP97go3ORMNoRjk4YTujHstee4hy3fiWhmYGBpvXbExMYNu27v7BlpOeqBZ4o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jM8uVMWf; 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="jM8uVMWf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B71F5C4CEDD; Tue, 18 Mar 2025 10:40:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294415; bh=nE75BNgsWEd3wOhWskr3tujrO/j2HRVbU7VVwxBCnRA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jM8uVMWfuJ/wmzcBHIb9WMzbiam2ts8QahN2AOWFbMjeNDN9oeI7iSK26enyzoa78 EBilcR6XCgKEcqf+r2YoITjHIZFvD9hB17IZMRpip41z/fk1eWs0K9zRSz8AZ5XHmJ kYH/6oSSgDXNtymA0dfHYYi/q2XVD9VvXH/1BK5JgLCMtDO83RcmI4a7Hbrg39B+H4 ni6oU3uWbvn03KwWgy4Zgr8wVCAubOEWhd515Bgi9AQgq2Ma8jTqPfrNSNXS06edo7 Z5b5nJBE6s93fjK+u1qvWtrhnddTxTaSuTaEkoPHSlKv9I4Enq7BR4bCjSkWcr7ddM FfGWAESUTq50g== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:39:59 +0100 Subject: [PATCH v3 05/18] 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: <20250318-nvmet-fcloop-v3-5-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 | 106 +++++++++++++++++++++++++--------------= ---- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 245bfe08d91ec81f1979251e8c757a0d46fd09e9..69121a5f0f280936d1b720e9e99= 4d6e5eb9186ff 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1054,8 +1054,15 @@ 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); + + /* nport ref put: rport */ fcloop_nport_put(rport->nport); } =20 @@ -1063,8 +1070,15 @@ 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); + + /* nport ref put: tport */ fcloop_nport_put(tport->nport); } =20 @@ -1341,6 +1355,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; @@ -1382,6 +1397,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; @@ -1392,9 +1409,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 @@ -1402,8 +1416,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; @@ -1412,24 +1426,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 @@ -1443,6 +1457,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; @@ -1480,6 +1495,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; @@ -1490,9 +1507,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 @@ -1500,8 +1514,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; @@ -1510,24 +1524,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 @@ -1624,8 +1638,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; @@ -1636,7 +1650,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); @@ -1644,13 +1658,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.48.1 From nobody Wed Dec 17 10:21:30 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 2E76D208981 for ; Tue, 18 Mar 2025 10:40: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=1742294418; cv=none; b=TRNAHnM9YcYUfEl+dhKPtdoc6ggH5gB/yr3SWS8pFn0bvU72doDuf4wmTOVCD7W41Ah4ZYcdAhNigIDvSsk0OdW/b+bMIPCLMnSDyU8MoopemcANrmvBhNpNqt3T75FGdKWaaNg3oxn40WVc9uUnGuVqU+79EbeqV6l+RjtQ43c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294418; c=relaxed/simple; bh=RpLuvQFkZ8DvcX0vAWLUD6hAcQKXufgx2o9rvMpsw7A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=B0oeB1HkwhbYe5VQoysio6oE7xTd2YfaaH74YFcKpY9BVAh6ysaAbhIy72j/3ehqRYERqgQGMAJwV95E6da7qBPodw6M1rlkG8v3BOhZ8JATW1ohniw52zfdUL3KqGUIWUJnax0BiFBTRYTU7gbrwcUcTJZag6LpocvHacvenhc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WdbMf4Jv; 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="WdbMf4Jv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3A158C4CEF4; Tue, 18 Mar 2025 10:40:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294417; bh=RpLuvQFkZ8DvcX0vAWLUD6hAcQKXufgx2o9rvMpsw7A=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=WdbMf4JvVkLm0K9jkxRzemTsQahyy22UPXJ4X+aFwp6tx/j3DmRAO7HVFcxqZMZ9J rYVH19fybw09AiRU4rwDXerVizpdws3bF1v2KfUBXZ7dF3NvF42cdixJRQP7vJTM5V BX7LOcgnvBugxib6VgSh+F0pqs58o8GepV6EVtzs9uP1nBG0535JahOcXaJAmbceiq rtrfAafzBIHFNfCHBw/mnNgUngzbvvOf0yXYEY6Fup6ARggbpyQeBD9CGHJCoCEgV7 WubHktI9+DiR3m6Pt5Vv4RB5fymiToMlt4R/JW7mQs1zUg3MxJ7Z6VuNmPrJZ2SbJI UTaOEblb3Aidw== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:00 +0100 Subject: [PATCH v3 06/18] nvmet-fcloop: sync targetport removal 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: <20250318-nvmet-fcloop-v3-6-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 nvmet-fc uses references on the targetport to ensure no UAFs happens. The consequence is that when the targetport is unregistered, not all resources are freed immediately. Ensure that all activities from the unregister call have been submitted (deassocication) before continuing with the shutdown sequence. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 69121a5f0f280936d1b720e9e994d6e5eb9186ff..cddaa424bb3ff62156cef14c787= fdcb33c15d76e 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -239,6 +239,7 @@ struct fcloop_nport { struct fcloop_rport *rport; struct fcloop_tport *tport; struct fcloop_lport *lport; + struct completion tport_unreg_done; struct list_head nport_list; refcount_t ref; u64 node_name; @@ -1078,6 +1079,8 @@ fcloop_targetport_delete(struct nvmet_fc_target_port = *targetport) tport->nport->tport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 + complete(&tport->nport->tport_unreg_done); + /* nport ref put: tport */ fcloop_nport_put(tport->nport); } @@ -1507,7 +1510,17 @@ __unlink_target_port(struct fcloop_nport *nport) static int __targetport_unreg(struct fcloop_nport *nport, struct fcloop_tport *tport) { - return nvmet_fc_unregister_targetport(tport->targetport); + int ret; + + init_completion(&nport->tport_unreg_done); + + ret =3D nvmet_fc_unregister_targetport(tport->targetport); + if (ret) + return ret; + + wait_for_completion(&nport->tport_unreg_done); + + return 0; } =20 static ssize_t --=20 2.48.1 From nobody Wed Dec 17 10:21:30 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 430E620AF69 for ; Tue, 18 Mar 2025 10:40:20 +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=1742294420; cv=none; b=LLxNTHZXUjoNxWHeWwL59ULzyXusfehWiMS9Gzylo/2lBayU+VnXGTDde/IwyPpvFAJs6linsqPxzmKF3dpT5NsRr7LLKeOGn0LKCDy16y/bEMCCfmSGKl/8i0iF6HoNjE2+scASwx6dpV7eU9RlQG8nHuEHbZQDeNI3jVehGrc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294420; c=relaxed/simple; bh=/K31wKt7+pzmqy2zsNE8F9f+nDwRIU59/QexgN001CE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pF0syCAN81S220sIxX+Fg3muaRbN+JWIeoUI1ev3uTwbOUJzG2tU1nMRQmEXvzU9aPfexmAiOshIArGttdoDOM1zZpufgi0QZXYJHrLotI237HZGVK44L3fGLZEz0UKFH5WF2z+HqRM5F8/d0Z/Mwj8zkWRUMum+QS3Xp59cVMM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z4SjNouK; 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="Z4SjNouK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C135EC4AF0B; Tue, 18 Mar 2025 10:40:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294420; bh=/K31wKt7+pzmqy2zsNE8F9f+nDwRIU59/QexgN001CE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Z4SjNouKzlzKLJIkXtOclDH4imOlVXyBVWWNpGMpJwA5Un4vtHvPsKZcWEBrshH0q k7ILdTYwnudBf+fecOAmA87d7W4DmIwJs+gQg5Clo2jsQzwObCJkDeWgJwGnpmaC9u Q2ozgKmR2eMrtA+a/LYYikN2yD+B5CjrEV8iY+orCc0Q4K6Jtz0nkQkCHlywG3eKwA Iawcf7QYXkDNcZg2bapOHgoys+4OnZa6xJ3OLlpeiBLeHJ98B1+k2/Fht1iTlqk46X GqCqWkohAjLNl8RQA9rsoGE3meOf4dF4W+4dBXweIRi9Y/BsxqxAUdjGW7NgNaAO5g qPF8t3VTevcYQ== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:01 +0100 Subject: [PATCH v3 07/18] 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: <20250318-nvmet-fcloop-v3-7-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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. Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- 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 cddaa424bb3ff62156cef14c787fdcb33c15d76e..cadf081e3653c641b0afcb0968f= c74299ab941d1 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.48.1 From nobody Wed Dec 17 10:21:30 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 2278220967B for ; Tue, 18 Mar 2025 10:40: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=1742294423; cv=none; b=dl1AieMkKFRp07E0xYs7CzX0B4XYeUrRlKoOdtFwr3rbJlVOAmYFKULhw/B4bplBmVCcuxVNFGnwnAkfgT3Gb/xiCfc1wQ2qOzZmgSxtqAj0dYvmzhil8kRfTw5RwPdbAxrSEtJhV01WjpQOUdSfR00RdiiGdgqQhUFwyzy1TBM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294423; c=relaxed/simple; bh=JTLpMEKu43lVUED42qFb7QDyfoLGefK5QDiEX4OAcCM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DQDQMLucWMdfXX4kkVipOI5SX4GxCDxscN03WmECj6RLgceK/LioFu9VpS8A2U+Avg9o9uJYBYlrWpFQI9fs8fStmXI/JaDn0UWpdXT3VIxoIwWtwjqv1BoKcBLbkMOig+XFLqoCSR6iup1h+BMZjgHJR2aRbcFUiLKH4XMEeRw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sXy78qeV; 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="sXy78qeV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3DE54C4CEDD; Tue, 18 Mar 2025 10:40:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294422; bh=JTLpMEKu43lVUED42qFb7QDyfoLGefK5QDiEX4OAcCM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=sXy78qeV0HjURROd9BFGrAxVsdc51t3zCXW3oUfrGCkHr1gOQtkHlR0FSrmb1NsVq FPYCZin06m9CFFnFxkPlsqS1058O5HK57MvXBOOsfucwMOA9nFXFKVf7qRLpSFv5Ow SIQbSUDk+Hi8NHZ1REyQ12Gg+anZLTs+aRbTJxOnzVeiPWjslC+Ij0VNKduEjhSREb ZIiIexYEM7GVrcge2yXMB4wRdYur64V8wY7KGlDoxI/y9s4y/fL5Y1NKUbszALQWsP dxjkeAjD5WrnRq9BojwO/iRX4RwU63vbHerm3T74+OIsGtTeRwuUeojlMyph2KBVA1 Bli7m3bKjzcsQ== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:02 +0100 Subject: [PATCH v3 08/18] 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: <20250318-nvmet-fcloop-v3-8-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Add the missing fcloop_call_host_done calls so that the caller frees resources when something goes wrong. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index cadf081e3653c641b0afcb0968fc74299ab941d1..de23f0bc5599b6f8dd5c3713dd3= 8c952e6fdda28 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -966,9 +966,11 @@ 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 */ + fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); return; + } =20 /* break initiator/target relationship for io */ spin_lock_irqsave(&tfcp_req->reqlock, flags); @@ -982,6 +984,7 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, break; default: spin_unlock_irqrestore(&tfcp_req->reqlock, flags); + fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); WARN_ON(1); return; } --=20 2.48.1 From nobody Wed Dec 17 10:21:30 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 B63CF20B1EA for ; Tue, 18 Mar 2025 10:40: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=1742294425; cv=none; b=KrUZj6tCWZ+3D/yWbaoZel0RANpQninSa88xsnM9dv7XpIyoMxFXQ0m40jqq9RAq1I5k0NuuAoG+dKF6iUc9dWYEJCC5PHmMMeWPy0GyNQ9WhIGId/ohbBWbXysQKcor0eFwVLKwn8qTemhbVThnHPqdfSMAlY1crolfeRZE5Zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294425; c=relaxed/simple; bh=Ao268T67hDxmPxHaefQt0CLnltxYa5k4a0l1IHd9hCo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rEsL7noTcFolIYRUP1uYbMDD9w6izUBcGmYRLqFAzQ1CsbDk3AL7lr2mLDa0hnhlECNc7nxwlXntYlbe+Aegi86ELcr8UQsuVJwfb0uzRHEQbopG5Cz84UQEsdGx6bqwIx0BzL+UdJiZvQhqVYDQz9dZBkfn+4CyoEzhAAA/72k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Iwv68cRy; 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="Iwv68cRy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C466BC4CEF1; Tue, 18 Mar 2025 10:40:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294425; bh=Ao268T67hDxmPxHaefQt0CLnltxYa5k4a0l1IHd9hCo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Iwv68cRy9tqCoYfLNsYQLavDYYTwic6Oc8x/ZZz4dmO9bwrzmj0bOGQCU2tJtS0US NDSgaQ8l5TEc5sCR8LgS9PLczdTy10ABgkyiUKFydwWHByBN9NsZTG1ngSz384w+n8 RrEffaCh1unPpy8Xj5wmBuVWycFe90FhGl24jdFBaY3wx2B5x4Ri3fAVdAOYKR+73G sDEz3+2tD0vKXPjlr1Yt1LMgUAJH/zto93EAMyGnixlf8AzjayVhm7a96NPnrRBz/O 2+xVVQwyJVXbxU4UxdLgW7rBl6bsxT4/0hJf1io+MtU3XYlcxg0GsJKWM96w3o4j+U 0wjN15SW0UuXA== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:03 +0100 Subject: [PATCH v3 09/18] 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: <20250318-nvmet-fcloop-v3-9-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index de23f0bc5599b6f8dd5c3713dd38c952e6fdda28..06f42da6a0335c53ae319133119= d057aab12e07e 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -215,6 +215,8 @@ struct fcloop_lport_priv { struct fcloop_lport *lport; }; =20 +#define PORT_DELETE 0 + struct fcloop_rport { struct nvme_fc_remote_port *remoteport; struct nvmet_fc_target_port *targetport; @@ -223,6 +225,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 +236,7 @@ struct fcloop_tport { spinlock_t lock; struct list_head ls_list; struct work_struct ls_work; + unsigned long flags; }; =20 struct fcloop_nport { @@ -1062,14 +1066,20 @@ static void fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) { struct fcloop_rport *rport =3D remoteport->private; + bool delete_port =3D true; unsigned long flags; =20 flush_work(&rport->ls_work); =20 spin_lock_irqsave(&fcloop_lock, flags); + if (test_and_set_bit(PORT_DELETE, &rport->flags)) + delete_port =3D false; rport->nport->rport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (!delete_port) + return; + /* nport ref put: rport */ fcloop_nport_put(rport->nport); } @@ -1078,14 +1088,20 @@ static void fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) { struct fcloop_tport *tport =3D targetport->private; + bool delete_port =3D true; unsigned long flags; =20 flush_work(&tport->ls_work); =20 spin_lock_irqsave(&fcloop_lock, flags); + if (test_and_set_bit(PORT_DELETE, &tport->flags)) + delete_port =3D false; tport->nport->tport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (!delete_port) + return; + complete(&tport->nport->tport_unreg_done); =20 /* nport ref put: tport */ @@ -1394,6 +1410,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); @@ -1492,6 +1509,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.48.1 From nobody Wed Dec 17 10:21:30 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 2F9C120B203 for ; Tue, 18 Mar 2025 10:40:27 +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=1742294428; cv=none; b=uFZiEKsKjXt/jq5UqwB/YiH7csQr3NwyhU9K7hkZJMXJU1uHVNlAihFX7GeoizbfVq+7oZlzaO9xNQaq895bOVoymSOIlU2Awru7XbgbgY4f+FpIjMPv18h7ymZ1sGjZKUhftTpOx9MtDTJ2UdaatSp3VGpnbK1vzFM45ScyURk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294428; c=relaxed/simple; bh=VkLrqF4T6wewDueSatUmlwjgltogJR25syVwXMTNSQs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=By2cJULZLutGoKAJKAceinxRwDPVcyId8L+3A1wufXnjzt6rwKGXb3Hp/tYBsloOVDIMCpM0sQl2ADtsA2AdAz1WyY6W/RYVNNoQimp9ZMvFHy0tgWBqod0JZTs6dOIxOnbXq8qxu9mZWQW3ip3Wl0BKhWM67tBDH00LkvkzSLM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bXMbk/T+; 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="bXMbk/T+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 479FDC4CEDD; Tue, 18 Mar 2025 10:40:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294427; bh=VkLrqF4T6wewDueSatUmlwjgltogJR25syVwXMTNSQs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=bXMbk/T+KPVPo5LwxoAyPNuISC6IZjBtKd6KQvNUOoq5SEPQQQwTJBTZxnlON1/Ct 9YuQh/GfRrVFaOpkDnBm4+/KojezsJDnPsrqWb/dZizX/SkUn4nKvqkbFLGJgOEmhw VVeOYaVyiVBTCumUD6BweKCNhEVOjIjapcdGQQoeTA5PmMKTQlQ17FdXgNTOtDOMWW XuRBNOT1iiTl4Ath1/I6TtSdM6H3WjYAvX7jsuUzpUo+uSlL0/HBJAWC7pmv6V2AJt ARwTfki1D8RxHsywsux6/p6I+oSagxFj04fT0NC9wA0GSfpNS6H0QoQzFFt2crXi2m jpVZfJdmdKVjw== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:04 +0100 Subject: [PATCH v3 10/18] 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: <20250318-nvmet-fcloop-v3-10-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 fcloop depends on the host or the target to allocate the fcloop_lsreq object. This means that the lifetime of the fcloop_lsreq is tied to either the host or the target. Consequently, the host or the target must cooperate during shutdown. Unfortunately, this approach does not work well when the target forces a shutdown, as there are dependencies that are difficult to resolve in a clean way. The simplest solution is to decouple the lifetime of the fcloop_lsreq object by managing them directly within fcloop. Since this is not a performance-critical path and only a small number of LS objects are used during setup and cleanup, it does not significantly impact performance to allocate them during normal operation. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 53 +++++++++++++++++++++++++++++-----------= ---- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 06f42da6a0335c53ae319133119d057aab12e07e..537fc6533a4cf5d39855cf850b8= 2af739eeb3056 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -342,6 +342,7 @@ fcloop_rport_lsrqst_work(struct work_struct *work) * callee may free memory containing tls_req. * do not reference lsreq after this. */ + kfree(tls_req); =20 spin_lock(&rport->lock); } @@ -353,10 +354,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 kmalloc(sizeof(*tls_req), GFP_KERNEL); + if (!tls_req) + return -ENOMEM; tls_req->lsreq =3D lsreq; INIT_LIST_HEAD(&tls_req->ls_list); =20 @@ -387,19 +391,23 @@ fcloop_h2t_xmt_ls_rsp(struct nvmet_fc_target_port *ta= rgetport, struct nvme_fc_remote_port *remoteport =3D tport->remoteport; struct fcloop_rport *rport; =20 + + if (!remoteport) { + kfree(tls_req); + return -ECONNREFUSED; + } + memcpy(lsreq->rspaddr, lsrsp->rspbuf, ((lsreq->rsplen < lsrsp->rsplen) ? lsreq->rsplen : lsrsp->rsplen)); =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); - } + 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); =20 return 0; } @@ -426,6 +434,7 @@ fcloop_tport_lsrqst_work(struct work_struct *work) * callee may free memory containing tls_req. * do not reference lsreq after this. */ + kfree(tls_req); =20 spin_lock(&tport->lock); } @@ -436,8 +445,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 /* @@ -445,6 +454,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 kmalloc(sizeof(*tls_req), GFP_KERNEL); + if (!tls_req) + return -ENOMEM; tls_req->lsreq =3D lsreq; INIT_LIST_HEAD(&tls_req->ls_list); =20 @@ -461,6 +474,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) + kfree(tls_req); + return ret; } =20 @@ -475,18 +491,21 @@ 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 + if (!targetport) { + kfree(tls_req); + return -ECONNREFUSED; + } + memcpy(lsreq->rspaddr, lsrsp->rspbuf, ((lsreq->rsplen < lsrsp->rsplen) ? lsreq->rsplen : lsrsp->rsplen)); lsrsp->done(lsrsp); =20 - if (targetport) { - tport =3D targetport->private; - 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); - } + tport =3D targetport->private; + 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); =20 return 0; } @@ -1129,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 @@ -1152,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 --=20 2.48.1 From nobody Wed Dec 17 10:21:30 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 A6DDD20969D for ; Tue, 18 Mar 2025 10:40:30 +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=1742294430; cv=none; b=c0bnLQJqr4HiZKD0TwsU57E2rKGuSe1XJ5WtxN6OZh6u/MFkaiAQsn9e8ndjhMhwPc6L5Bi6tvnfJYWlqmvmWbKEekU1hbGhDk/j8gWiZxgZBrTeA35FoKSskeXsgCV3FKL2KqPqROiRqmwNsq7NazsQ/y+/qTByaPHwNT4plsU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294430; c=relaxed/simple; bh=l5T+lHKE6WpThvpfNbpbK6W7jMYdmU6ezmfxslSOgOc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AeFKeTk5GVpkd/6+x/B70Ja1zjS+aIxu0wxqEn8SeBQg7yW2m2LW+pHdM0S+m6Zw2FkCbHMrT95M35yolu6nEYYDAJrJj7UBgiqkY7UnjzzM72YrV9blFnIMVnKOfUgrGdwt3zUr+0Xb/dnq7JrWUDx2o6qyxz0g5aDSiw2YHRw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nKvRs/2O; 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="nKvRs/2O" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C1A97C4CEF1; Tue, 18 Mar 2025 10:40:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294430; bh=l5T+lHKE6WpThvpfNbpbK6W7jMYdmU6ezmfxslSOgOc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nKvRs/2O/M2buEmMQtl+vqHVLCEpcjHpvGBN7mGenAWyFhODGcqFbwuCb6ax/pGxM KX3hJjYIhtYT3P7LDxjcvIlW8jD8SoECx8/+0yp5jRrgC8/80yfW7ERCkmjODD/19I zCEbvF5lXoPBuQ5j1AEcYOh3CsYuHXzuRWeXdsOf5TVVXKUfbXr2830pOrdm7wYAmc pTNnqwSuL8SSU8LbPfVV5v7UzAk/RFbi7EPrs1WtluKowEIgbD+PN0M2YZqrST8WxI fbgKaKc2fySQGSySZUPTyHuBWw+qjscRTKSBhUDdXl6qWR9q67SKpJNjZJTC51xX6i duF99/rxgxOCw== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:05 +0100 Subject: [PATCH v3 11/18] 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: <20250318-nvmet-fcloop-v3-11-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 one user, just inline it. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig --- 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 8edb2b7f7a70d0a0a366f59f7db7af371e3799a0..05290506602469fc98d8463d0f1= fcb6cf2422fde 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1087,13 +1087,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) { @@ -1101,7 +1094,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 Wed Dec 17 10:21:30 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 06A5020B7F8 for ; Tue, 18 Mar 2025 10:40:32 +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=1742294433; cv=none; b=QuKe6U51RfdV47dr9oqjVG1DY0FmnTyLVzTlWFrqXQbHkFtXMtZ6Z6rKUXrkEEOX3QjQHGBUTB14YzvEoDxbUxHP3MHAsk0Q7Wxlzt0anodycRaLbfrKNuqe1/Tur1IUdhS1o+tncWOmc6g6LrE+1rNd3FoLQtCd7SheiefhVuY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294433; c=relaxed/simple; bh=JC937a4WiT0yhSJrrMII/tHbHGidchlnnE5lLue4zIg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A92JoxQeliMsTUY95wZAS7xvS8vGlFV0ybp8NInRizmz6qB/6Rh06Je9vvrd0pDtFc0ixXGqw+5JGQdOwWebz5blclZus9AEI9F2c+BHfazHOMCVavKJG+yWOk0+ZLoABj8Q9KI0pLBl0reGc3eEWX0PuO/K45eAadWguvwe6hA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Xp3U6+ri; 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="Xp3U6+ri" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3427BC4CEDD; Tue, 18 Mar 2025 10:40:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294432; bh=JC937a4WiT0yhSJrrMII/tHbHGidchlnnE5lLue4zIg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Xp3U6+ri9/AyBtjKRjeCoDwn8OB2dqNIF6QZ6v46Y1dU0qna4dGYJ+GsAAI7CRBQq J6C4FW8kc/vbT6AOCXIJLwes7r2YKs5gd+Sr9Cl22k/6HWxZYMiYX98PGA0Ykt2ek6 rtA+UrjowDSFqo7MmsdskHEsCxfQpXXukFmYNZJGjyw9iWdJHLvwn8hy75Ynebys4s d6wjiUffsXL9h3aKsv0XIc8RFlEFDSLIdFy5bDeuEFajAhKEZC/sxUI9gqOEpP7TRc WVs0Phb4JoahLHxkThtmkqoIYqDOFsjHGtlBoYFOApnwPInx/RvqSofEkBcCTXfJeE PJ8LYKGfGwbaA== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:06 +0100 Subject: [PATCH v3 12/18] 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: <20250318-nvmet-fcloop-v3-12-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 one 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. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig --- drivers/nvme/target/fc.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 05290506602469fc98d8463d0f1fcb6cf2422fde..20ea3acd7a5ff6f7c27b55b8c00= f22b2a0768b7b 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1007,16 +1007,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) { @@ -1196,7 +1186,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); @@ -1459,11 +1449,6 @@ nvmet_fc_free_tgtport(struct kref *ref) struct nvmet_fc_tgtport *tgtport =3D container_of(ref, struct nvmet_fc_tgtport, ref); struct device *dev =3D tgtport->dev; - unsigned long flags; - - spin_lock_irqsave(&nvmet_fc_tgtlock, flags); - list_del(&tgtport->tgt_list); - spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); =20 nvmet_fc_free_ls_iodlist(tgtport); =20 @@ -1624,6 +1609,11 @@ int nvmet_fc_unregister_targetport(struct nvmet_fc_target_port *target_port) { struct nvmet_fc_tgtport *tgtport =3D targetport_to_tgtport(target_port); + unsigned long flags; + + spin_lock_irqsave(&nvmet_fc_tgtlock, flags); + list_del(&tgtport->tgt_list); + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); =20 nvmet_fc_portentry_unbind_tgt(tgtport); =20 --=20 2.48.1 From nobody Wed Dec 17 10:21:30 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 36F5020B817 for ; Tue, 18 Mar 2025 10:40:35 +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=1742294435; cv=none; b=XfmuPEQo994v5KgnHkiZnHOheHhpcOHmINF/BB1nlnI4ybARpzSv/YaksGb1fD98jyoFdsYXnKZrRkyk4Omz+Hxf4oWtgPhwMlt9mDQBouSQsnbtYrd6lu06SXb38JS0S9sylr7uI6gpeWF+F5/RvP30EHAbZCZI8fwmItWehDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294435; c=relaxed/simple; bh=/92ooGbeabbacagz1kQIT/ubrVZ4C6yUg1CR20B0YxQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SAZPc9UnSasdjWU/xdzem31i/AvzdoRmc98HrwdWTXwgfhv3EYbXCt5i9aOauNMiEr2t0PfV+Kb3xUIQ7QtG6Tq0PXyXW5Pu6UTbnCYi7J3a4wOKdxIj/qSW1WnDXe3GlcSi9a/E4FfxtNabdhTsP+CrV2y7tdtJb48uWcWnFXw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SL/03HPG; 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="SL/03HPG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5E68C4CEF3; Tue, 18 Mar 2025 10:40:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294435; bh=/92ooGbeabbacagz1kQIT/ubrVZ4C6yUg1CR20B0YxQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=SL/03HPGNwlREGydN6Z0gKEfEMj5caRwP1rBEclgoam34Ou/2MN+ovavtWppGa4oL NGuHQ7etSy8n/WCOBXceAezPSFtBzQTwhGBahEqXxCByiI/u28YRPnHmPu8BUX6Rrj I9mXlBqa6tOkD59bQVibquaAlNuCBEMPugXKY6fzMjeWi6tYDxq2ruaTQ5tn4GEvxV vz20RX/z9D6PgGwbOyNhYm/+DcBWosMf/jQvmUNbJVmsYNnhPGIUyVBnnWDUPNVON4 VMg8y/gNxSzITAQsj6m2cy0bpwEcvX5Tizm9RxRqTo2rmAnC27FlpLRyp2YL2GAHvX NZPVAA8BdKYVw== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:07 +0100 Subject: [PATCH v3 13/18] 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: <20250318-nvmet-fcloop-v3-13-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig --- 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 20ea3acd7a5ff6f7c27b55b8c00f22b2a0768b7b..8b14947906948c8b4914932837b= 4ec90921b419d 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1139,6 +1139,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); @@ -1238,6 +1239,8 @@ nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_asso= c *assoc) =20 pr_info("{%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 Wed Dec 17 10:21:30 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 3909620B817 for ; Tue, 18 Mar 2025 10:40:37 +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=1742294438; cv=none; b=KLZW7HnRzw10RSp3bczy/1K5PWanRp2p16MFVOanav8CPSVPS3DmJgnfv6z9CBVo4HZWl+sk+NWKyuKuux2WFCML65UztPLWi/S0X5ZjepW+H/4V8DUd3avM0OHolG9w4ciddWo9wCYSfuhyJEmrY1sNumFDzSUxesfA/9Lj2SE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294438; c=relaxed/simple; bh=4nbEl4sZ5VwAwk80/F9WKLpZmL99SeHa3v/TXRfobLQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aoHgNGKS22fK48f4n1aY0QTf6cacSsBQxNSyzoQHIogTzRWS0iOEUsq/Z6+YWsNkuW6hJxfNlGhlslPhbvgXBSUr4+XnabBxrCD7TUxDGRXJUm+na/H/g7mt1z50nhaZUSFRxNl/3GjyUiPCBYc63z1RZ3mHANFll0i+8lbp7f0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MK4R0uxt; 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="MK4R0uxt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 48F51C4CEE3; Tue, 18 Mar 2025 10:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294437; bh=4nbEl4sZ5VwAwk80/F9WKLpZmL99SeHa3v/TXRfobLQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MK4R0uxtKc2gU7pAryVQtYYERXpPBPW/8V+tFKdV62sYntJL9Z22VGO3z/VAxMxK8 Y1mDCG0/ezeMvpvp8vqg0jBeJWiH8voOHIq5QqcS7aeEqFCqTnBaKaF7eHpJ7/EOYC THlqOxAVOc3C4a/R7EEPAnE5KXppmiJChHAokx5UpEcrl58oXTIOVPwPKYGOpE4QIQ lxpUslBXR2m67DwklLaLA+tNAwBQe0D/EVi2PvTeNQ/+5hhX2LjFtNdsObsBkBoji6 FMcvStZT0br0bIDqhjAzpsZAWhYBF5LMxEhOsC+r7X6Xq/Fy3EQaqMGNX5qKHSrqmH AbyNpXpvU60WA== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:08 +0100 Subject: [PATCH v3 14/18] 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: <20250318-nvmet-fcloop-v3-14-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fc.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 8b14947906948c8b4914932837b4ec90921b419d..b2f5934209f9952679dc1235fb7= c927818930688 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1030,33 +1030,26 @@ nvmet_fc_alloc_hostport(struct nvmet_fc_tgtport *tg= tport, void *hosthandle) struct nvmet_fc_hostport *newhost, *match =3D NULL; unsigned long flags; =20 + /* + * A ref on tgtport is being held while executing this function, + * thus there is no need to take first one and give it back on + * exit. + */ + /* if LLDD not implemented, leave as NULL */ 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); @@ -1065,6 +1058,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 Wed Dec 17 10:21:30 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 3356C2080D6 for ; Tue, 18 Mar 2025 10:40:40 +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=1742294440; cv=none; b=hnWGJDJ/89//ZAWX9TIUJ1inulzbmbo95VxvivTZw2l7AHKkODh3klnO3kvt/MZoWP5aPzOWVE57ihyoPFQh5XLLvLGcob6RmBpw+1nlORgjVVJd4lqB3yg5Q9ET63RdLVhSr4An+vg3j53wq3sAooEv9LpVGPik1GSFcecb4Ws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294440; c=relaxed/simple; bh=ARme07aS1QExi5VZijNLmZGcs97PRzj21jmlFT3I4Gk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Zao3o03jJ1gGQqGlJ8cbUpP9gxAH0BLhI6XublvvwmynKH1NfZPJAsnZW55Ids40/6t1uaQGkOvXKakOzYeIBNBVrs5fe7dyVqjjfrctUElvmlz7k1v25M/jMO9ceJRDkNkmxA0yxCgTKGuCLXxD8do9wsp+fabZfPjC2pTF3UA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RZ3Dlp3y; 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="RZ3Dlp3y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B8CBDC4CEEE; Tue, 18 Mar 2025 10:40:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294440; bh=ARme07aS1QExi5VZijNLmZGcs97PRzj21jmlFT3I4Gk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RZ3Dlp3yBCgnt0ZQa1RFg5B32HlT4gIhYK521+ye+IQgJldWZ1Zj8V2XTRIaU6vnD nCbvkLXyrqlouBzTFTJKvIH+ebp8j8XO2zADjIz3tMTzb+tviAbBL/3btFW5CaYBLW rMTcYO8jqYh5xv+xnlV4YZOlRvjnUi1wFA6Ooh0q45b7DaffOPsRTg2p4VKTK2bVMW WnvtH9dT38t/3p6nn8moasbFzL38ZnU+cv/ohNjVwl08lXhD8u74VfN4ci0vHvapOx ypSc7pABt0/zCYei/vJiL8ZCNDlWtdsVJaoeZQ35gG8km7AKSA/ry+fj+ciWk4wWNb ifLwEQLaUbQxg== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:09 +0100 Subject: [PATCH v3 15/18] 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: <20250318-nvmet-fcloop-v3-15-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 nvmet-fc: merge with f200af94ac9d ("nvmet-fc: free pending reqs on tgtport = unregister") --- drivers/nvme/target/fc.c | 46 +++++++++++++++++++++++++++++++++++++++-----= -- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index b2f5934209f9952679dc1235fb7c927818930688..d10ddcb57c1b09d871152f0d9a4= 8f93ec6dc8685 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1591,6 +1591,44 @@ 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. + */ + 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); + kfree(lsop); + } +} + /** * nvmet_fc_unregister_targetport - transport entry point called by an * LLDD to deregister/remove a previously @@ -1619,13 +1657,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 Wed Dec 17 10:21:30 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 155832080E3 for ; Tue, 18 Mar 2025 10:40: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=1742294444; cv=none; b=tO+tJIb4SpXQ5QEghmR6GKG60d6SMIR1l9MH5TU1VUJOEMj8K1lhsjvSrp38vnEhWx5A3iCzi9V2Eb3P+1AXjMNKk4zqO6ITEO/EAEGGzQNXLEoIkJa5jgqsOhqUBb18rWxe9HuDZCvtKt5N4b9r+LwK3yQRi3ZxMII2UrV7jJo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294444; c=relaxed/simple; bh=LsxWRr6DZwClzttPCXevbMAdxFVVZCkmwtITF4CNm6E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KYpHHfAchWR9OvwK9nDceB3ZDw1Fjqdals5YtgS/6UlpX2txV8GTS474a+6+lS5a+VYZAAFKtkCG74WNW3AM7CdcKWEJ1XKcGoXh/tzQG2CVbRVE7qnbwxg1f9P3jzSnvGGD6rC3Ztb4DiFX7KLEVOuTIjVjMCqIzQdiR8CjrDs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=soz2KTn7; 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="soz2KTn7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 30BF3C4CEF3; Tue, 18 Mar 2025 10:40:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294442; bh=LsxWRr6DZwClzttPCXevbMAdxFVVZCkmwtITF4CNm6E=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=soz2KTn7sSTwHvisSf3FNLsnFKA3B5v7bXlcXTsytIt+LuILWxJi1CAkbp0INx/Mi 9lBzZs4QjhlN55kCwTGjN4K8Y1hg9Uf8M4HWOhpXEt/zW673csJnwG8xN+2IJrI3Pf XxdMJraGkm/3Wp1CZARbe2egbaRUq2kG2ilr+FrlxjpzrTQMPwGfT03cxiJkenEtne BWYx7xgtbUrPa4w29Lui2ipMqwTHhebJDpxWZy1OTP5z68F1TEDB4NyWF3QxEd1amW hj/MLWsF3pah3rXipL6qNq5BHM2gbY/VUuyzFE7+gYa1bofaySoUidyY4YKuAl+TqL lmqX+oyvQ9kyA== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:10 +0100 Subject: [PATCH v3 16/18] 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: <20250318-nvmet-fcloop-v3-16-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fc.c | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index d10ddcb57c1b09d871152f0d9a48f93ec6dc8685..649afce908bbade0a843efc4b8b= 76105c164b035 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1265,6 +1265,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 @@ -1284,8 +1285,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); } @@ -1303,8 +1306,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); } @@ -1327,6 +1332,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; @@ -1664,7 +1672,6 @@ nvmet_fc_unregister_targetport(struct nvmet_fc_target= _port *target_port) } EXPORT_SYMBOL_GPL(nvmet_fc_unregister_targetport); =20 - /* ********************** FC-NVME LS RCV Handling ************************= * */ =20 =20 @@ -2901,12 +2908,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; } } @@ -2922,11 +2934,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); } @@ -2935,10 +2957,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.48.1 From nobody Wed Dec 17 10:21:30 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 9094C20C034 for ; Tue, 18 Mar 2025 10:40:45 +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=1742294445; cv=none; b=im00HAVksgpzXjOlCsdYqk1J2aqsL1jIgHBiDuJ9UHcLMo5TluFVwMJ+V2aHj6CF/YlcRXvgh0I60Ugxd1qArEEb6y+RAtT4PHupgqwcvgLiCjoXuPqOxlMU4+9/XACmdzYYp6fEOJ3RzmOQkqhLlTt9Pp8h4Ww1ttsFOFo1bpE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294445; c=relaxed/simple; bh=xhWX+5IOa0crE05apLEVrNBm4agJvraayK65++Qyx48=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cduc5vFa3DfBkPig/O8x1fx3n/0w85tvqnoAUKIbmHXSErB92YBEsarPIKpfZfwROGgXCHXQXxLZDeuCx3gsWRdgUfJ4dgdiUDqLSpMWlTLQOpN0VqPpGoSViXmno5YnBFFmSlpzf3WKiVik5Lw3EDy6HHz2k4DTGwjj9kQM3i0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O4xeDqZZ; 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="O4xeDqZZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B16C6C4CEDD; Tue, 18 Mar 2025 10:40:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294445; bh=xhWX+5IOa0crE05apLEVrNBm4agJvraayK65++Qyx48=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=O4xeDqZZUSZGXxLJZa4WtR1HktQKziBrn+md4R62yJDqqFxcCzmUcafpI2spW60tK lEYNm+Bd+Oi20KA4FHnbZ2aDyP5jW5j8qL99IqECooG0q/sBJPsMzog/DOTj7A1uA7 xW2/ece/dVgY8F4eLaqiphdAie1H9nPBs71fqa6yMMxTylVgGl4wRnH/TvD0RpBrdc cqjGQACLxK+wXI624tnT+rSXp1LBz0b1HN53L4T0cylGPnxf81l3cq7mKVg5oXVHeg Dg5VAQHkPqeFzCr7N9skzvgfPHIrAWFvvLDDNLHPNw2QYkGiWee9wRPEJ4zumSTGjE J1rL2VNJgdD0A== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:11 +0100 Subject: [PATCH v3 17/18] nvmet-fc: put ref when assoc->del_work is already scheduled 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: <20250318-nvmet-fcloop-v3-17-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 Do not leak the tgtport reference when the work is already scheduled. Signed-off-by: Daniel Wagner Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 649afce908bbade0a843efc4b8b76105c164b035..e027986e35098acbe5f97dcbcc8= 45b9d46b88923 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1087,7 +1087,8 @@ static void nvmet_fc_schedule_delete_assoc(struct nvmet_fc_tgt_assoc *assoc) { nvmet_fc_tgtport_get(assoc->tgtport); - queue_work(nvmet_wq, &assoc->del_work); + if (!queue_work(nvmet_wq, &assoc->del_work)) + nvmet_fc_tgtport_put(assoc->tgtport); } =20 static bool --=20 2.48.1 From nobody Wed Dec 17 10:21:30 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 106B420CCE5 for ; Tue, 18 Mar 2025 10:40:47 +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=1742294448; cv=none; b=ZXdnX0fg6+UVKZGDfoYfVHHHJhSA94hiqswr8DCUvMs1F5qySP8kUxHa+uBHoXSEPETXEPH19IKE6xKkcwtObet+3n5bpmJADtoI72I043S3yM+10Gn/Te3tMUF4G4Z1MiFG3KUw9uyy8m+s3yrXKrmgrXNP9vZTjtQKgEJq6fo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742294448; c=relaxed/simple; bh=qZceJnRtvOAv9rMro0CCwHgopDRbxFnO5xByz8l5QYM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VdmybVtqhwFuVOpjf6IJtG9zfLoesQtyO8RwjgoAfWRgBVDIkYCenhrzV3tHBdwYLXsa3eRyRqPQ3srjc2j7H7Sa2Zh84qgRWiFqcWt/UyeCVHN302FROPktyyU1ioOtAjIift1Txo+Ur6ItLCFEDwsJaoUOMT+ZR/6U0xMY5bM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oDAXeKKy; 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="oDAXeKKy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37B7FC4AF09; Tue, 18 Mar 2025 10:40:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742294447; bh=qZceJnRtvOAv9rMro0CCwHgopDRbxFnO5xByz8l5QYM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oDAXeKKyx/GcWKE1PYi2a00cQWzBDgZAaLfOy93Pa69FN1H54ugiwAl5+Ja52XHn2 k54kM1r/OD7hediKoPE+s1tQKg8xItGlSbLEDrsTqo01eXsJ2Sq+QrGXa24qesl0mF DV6cY2Zyo9Yu2XkQhrfLq39tvHbsgKhPpmPKKE7OKBgKLTzButZ+UJ1IFm3pkJgJ98 fXJRwni8G42CHvKUjd6Bcu1aWqvGlgz+FExYZf/zMk+4+4jR0K2vIDYYbf5SlTptVm KBRC9xJE+qSNJbWI2g7Ak0aU4zR1dfosXVq0FOlK2lQ6zMgBNsrFHMpcnKigRUl8RN emCIe2STozCsg== From: Daniel Wagner Date: Tue, 18 Mar 2025 11:40:12 +0100 Subject: [PATCH v3 18/18] 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: <20250318-nvmet-fcloop-v3-18-05fec0fc02f6@kernel.org> References: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@kernel.org> In-Reply-To: <20250318-nvmet-fcloop-v3-0-05fec0fc02f6@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 b9929a5a7f4e3f3a03953379aceb90f0c1a0b561..2c32ba9ee688d7a683bbbf8fc57= a5f9b32b2ab8d 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.48.1