From nobody Fri Dec 19 06:18:10 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 DF89416C850 for ; Wed, 23 Apr 2025 13:21:54 +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=1745414515; cv=none; b=gjTVkwr60fab+86aR3OwiTjwnNMQJ5w4fG616NkiULUO+bR/99EwvhoZjvouCG+r37eHGkTCIcpG82WxhM6UrGx85UOVW/KYgvTW7tZKVaGIOfM08anjbIIIVYOV+8bw46SVpgXOBrynUlcHG8WCML5h2eXUOMsERozwew3GcfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414515; c=relaxed/simple; bh=jEKbG5pfx1l0nP/U7lRUSa0XqnGWbsgWmnMw8er6V34=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qDBD+Zmil5t5L4L7/maGjyTcxepd0+SuxGO8vFu91xAaRR22/wDrZGg4JsfRPDTG3ITvtwQOcxL6s8WY8mqECBR6uIO+CiIc2/jtPhZfPlEXvHM4oY/0MsxEz+uZywPJuVBcx0tuQChuEm3TqlpBb0kcj83Cd3WPJpuWfryt8F4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jzWha6uN; 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="jzWha6uN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 31595C4CEEB; Wed, 23 Apr 2025 13:21:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414514; bh=jEKbG5pfx1l0nP/U7lRUSa0XqnGWbsgWmnMw8er6V34=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jzWha6uN0bFoLp+pynvr6Qq7QaBXn4MpvOqJuWg79gf5JQ6n05ziPj2Ry6ACqs04m 8fkJmtTMPQImBUdyBrgQNVGmctFiRrXN7SFIFce7Eg62ufQjgueG98QsNzKRpSTAOu eGJeqS4/o/nP1s0vS6lC0ucHWpM8JME2/luGSmVIO38Lw6R/pnufrTV0EDHVl0EEQj /QyqXuAq5mo2cooJNFGhP+bL2QxFiEpW54HTr5F7wAb1UfG1RPUZ5E2Ab+tgvNVCnG xNCW1sF5D7M/WjF9smYsX213KA5Q2Qs+X5ecoAwmuEsQiKIvdNq4yKmSLpa38c8ci8 qHVKr+AApzXvw== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:44 +0200 Subject: [PATCH v5 01/14] nvmet-fcloop: track ref counts for nports Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-1-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 A nport object is always used in association with targerport, remoteport, tport and rport objects. Add explicit references for any of the associated object. This ensures that nport is not removed too early on shutdown sequences. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 133 +++++++++++++++++++++++++++++----------= ---- 1 file changed, 90 insertions(+), 43 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 641201e62c1bafa13986642c6c4067b35f784edd..2b23e43ef4403fa4d70c66263f7= 750165d2ddc72 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1047,8 +1047,14 @@ static void fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) { struct fcloop_rport *rport =3D remoteport->private; + unsigned long flags; =20 flush_work(&rport->ls_work); + + spin_lock_irqsave(&fcloop_lock, flags); + rport->nport->rport =3D NULL; + spin_unlock_irqrestore(&fcloop_lock, flags); + fcloop_nport_put(rport->nport); } =20 @@ -1056,8 +1062,14 @@ static void fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) { struct fcloop_tport *tport =3D targetport->private; + unsigned long flags; =20 flush_work(&tport->ls_work); + + spin_lock_irqsave(&fcloop_lock, flags); + tport->nport->tport =3D NULL; + spin_unlock_irqrestore(&fcloop_lock, flags); + fcloop_nport_put(tport->nport); } =20 @@ -1184,6 +1196,37 @@ __wait_localport_unreg(struct fcloop_lport *lport) return ret; } =20 +static struct fcloop_nport * +__fcloop_nport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_nport *nport; + + list_for_each_entry(nport, &fcloop_nports, nport_list) { + if (nport->node_name !=3D node_name || + nport->port_name !=3D port_name) + continue; + + if (fcloop_nport_get(nport)) + return nport; + + break; + } + + return NULL; +} + +static struct fcloop_nport * +fcloop_nport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_nport *nport; + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + nport =3D __fcloop_nport_lookup(node_name, port_name); + spin_unlock_irqrestore(&fcloop_lock, flags); + + return nport; +} =20 static ssize_t fcloop_delete_local_port(struct device *dev, struct device_attribute *attr, @@ -1365,6 +1408,8 @@ __unlink_remote_port(struct fcloop_nport *nport) { struct fcloop_rport *rport =3D nport->rport; =20 + lockdep_assert_held(&fcloop_lock); + if (rport && nport->tport) nport->tport->remoteport =3D NULL; nport->rport =3D NULL; @@ -1377,9 +1422,6 @@ __unlink_remote_port(struct fcloop_nport *nport) static int __remoteport_unreg(struct fcloop_nport *nport, struct fcloop_rport *rport) { - if (!rport) - return -EALREADY; - return nvme_fc_unregister_remoteport(rport->remoteport); } =20 @@ -1387,8 +1429,8 @@ static ssize_t fcloop_delete_remote_port(struct device *dev, struct device_attribute *att= r, const char *buf, size_t count) { - struct fcloop_nport *nport =3D NULL, *tmpport; - static struct fcloop_rport *rport; + struct fcloop_nport *nport; + struct fcloop_rport *rport; u64 nodename, portname; unsigned long flags; int ret; @@ -1397,24 +1439,24 @@ fcloop_delete_remote_port(struct device *dev, struc= t device_attribute *attr, if (ret) return ret; =20 - spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tmpport, &fcloop_nports, nport_list) { - if (tmpport->node_name =3D=3D nodename && - tmpport->port_name =3D=3D portname && tmpport->rport) { - nport =3D tmpport; - rport =3D __unlink_remote_port(nport); - break; - } - } + nport =3D fcloop_nport_lookup(nodename, portname); + if (!nport) + return -ENOENT; =20 + spin_lock_irqsave(&fcloop_lock, flags); + rport =3D __unlink_remote_port(nport); spin_unlock_irqrestore(&fcloop_lock, flags); =20 - if (!nport) - return -ENOENT; + if (!rport) { + ret =3D -ENOENT; + goto out_nport_put; + } =20 ret =3D __remoteport_unreg(nport, rport); =20 +out_nport_put: + fcloop_nport_put(nport); + return ret ? ret : count; } =20 @@ -1465,6 +1507,8 @@ __unlink_target_port(struct fcloop_nport *nport) { struct fcloop_tport *tport =3D nport->tport; =20 + lockdep_assert_held(&fcloop_lock); + if (tport && nport->rport) nport->rport->targetport =3D NULL; nport->tport =3D NULL; @@ -1475,9 +1519,6 @@ __unlink_target_port(struct fcloop_nport *nport) static int __targetport_unreg(struct fcloop_nport *nport, struct fcloop_tport *tport) { - if (!tport) - return -EALREADY; - return nvmet_fc_unregister_targetport(tport->targetport); } =20 @@ -1485,8 +1526,8 @@ static ssize_t fcloop_delete_target_port(struct device *dev, struct device_attribute *att= r, const char *buf, size_t count) { - struct fcloop_nport *nport =3D NULL, *tmpport; - struct fcloop_tport *tport =3D NULL; + struct fcloop_nport *nport; + struct fcloop_tport *tport; u64 nodename, portname; unsigned long flags; int ret; @@ -1495,24 +1536,24 @@ fcloop_delete_target_port(struct device *dev, struc= t device_attribute *attr, if (ret) return ret; =20 - spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tmpport, &fcloop_nports, nport_list) { - if (tmpport->node_name =3D=3D nodename && - tmpport->port_name =3D=3D portname && tmpport->tport) { - nport =3D tmpport; - tport =3D __unlink_target_port(nport); - break; - } - } + nport =3D fcloop_nport_lookup(nodename, portname); + if (!nport) + return -ENOENT; =20 + spin_lock_irqsave(&fcloop_lock, flags); + tport =3D __unlink_target_port(nport); spin_unlock_irqrestore(&fcloop_lock, flags); =20 - if (!nport) - return -ENOENT; + if (!tport) { + ret =3D -ENOENT; + goto out_nport_put; + } =20 ret =3D __targetport_unreg(nport, tport); =20 +out_nport_put: + fcloop_nport_put(nport); + return ret ? ret : count; } =20 @@ -1609,8 +1650,8 @@ static int __init fcloop_init(void) =20 static void __exit fcloop_exit(void) { - struct fcloop_lport *lport =3D NULL; - struct fcloop_nport *nport =3D NULL; + struct fcloop_lport *lport; + struct fcloop_nport *nport; struct fcloop_tport *tport; struct fcloop_rport *rport; unsigned long flags; @@ -1621,7 +1662,7 @@ static void __exit fcloop_exit(void) for (;;) { nport =3D list_first_entry_or_null(&fcloop_nports, typeof(*nport), nport_list); - if (!nport) + if (!nport || !fcloop_nport_get(nport)) break; =20 tport =3D __unlink_target_port(nport); @@ -1629,13 +1670,19 @@ static void __exit fcloop_exit(void) =20 spin_unlock_irqrestore(&fcloop_lock, flags); =20 - ret =3D __targetport_unreg(nport, tport); - if (ret) - pr_warn("%s: Failed deleting target port\n", __func__); + if (tport) { + ret =3D __targetport_unreg(nport, tport); + if (ret) + pr_warn("%s: Failed deleting target port\n", __func__); + } =20 - ret =3D __remoteport_unreg(nport, rport); - if (ret) - pr_warn("%s: Failed deleting remote port\n", __func__); + if (rport) { + ret =3D __remoteport_unreg(nport, rport); + if (ret) + pr_warn("%s: Failed deleting remote port\n", __func__); + } + + fcloop_nport_put(nport); =20 spin_lock_irqsave(&fcloop_lock, flags); } --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 13B12148827 for ; Wed, 23 Apr 2025 13:21:57 +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=1745414519; cv=none; b=paap9pC2yG4J4rcgJV4zdolHABHXXesPpg8R2Nu2UluSTt/f123oJt+tip/hr3T/bAS8PU/SPfPRrfWJlGdhQ+wX75LZeCSFavaLIsxlI/DlDzA4D+/DXYMpJGEC0fyMqRAIFtnLMmTHUSvucygKrIpnAMhFe2P9sTopPhEt6RM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414519; c=relaxed/simple; bh=Tey/jPpQIblgm+n0ERiQKMTVIjHrNonHGj1c23bE1TI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KK8c7GR/hOmCLFyAVEIuDFr21MCVVLSZb8T1+VXsefMn2GqNgDDF1JGtitKeFvMU66T5OR+hqR8iO2vEtq2sXJCXbCISd0qcbKnbDbxPPD5JdzY0Dkq1qOPVayCLAIHLusMTo2Hsr/M2v7Sga4CQ1xCFnYkvIF4gvkKJi9pjeNY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uLpuNQbN; 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="uLpuNQbN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D07AC4CEE2; Wed, 23 Apr 2025 13:21:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414517; bh=Tey/jPpQIblgm+n0ERiQKMTVIjHrNonHGj1c23bE1TI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=uLpuNQbNhpNFPrDqVYIJf7ZITW/2plxwZ71K2XSin348fPNDJYAYNZoZ572kRrlrG u4O9JqHO0Wie633RCDKS5eYB7B+EejdcowQpOTIb51KDqa8EbuhZxrrlGp1HdLJe1z MtbrOGIMiZXiMRiIi23pSCkC1oQIcCVE1PLHXf8MIealK40LAkdiCzESl37e95tWg4 Fy/T/l8ePCsKy0Mn3ToKiaCH4040wOrZwtmO7r7S7cfpIelK4H68aCZzgAnmkQ32SX EzLwzJtIB4Z27FN1gL7+RE+KCazacq2ACUca+Iv3Bbl2hhfI1nHZSfVjopq5cjmwEZ TSw1xUE1mVKwA== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:45 +0200 Subject: [PATCH v5 02/14] nvmet-fcloop: remove nport from list on last user Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-2-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The nport object has an association with the rport and lport object, that means we can only remove an nport object from the global nport_list after the last user of an rport or lport is gone. Reviewed-by: Hannes Reinecke Reviewed-by: Christoph Hellwig Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 2b23e43ef4403fa4d70c66263f7750165d2ddc72..2cce7649af276528360395b6d58= f03183c11da20 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1019,9 +1019,15 @@ fcloop_lport_get(struct fcloop_lport *lport) static void fcloop_nport_put(struct fcloop_nport *nport) { + unsigned long flags; + if (!refcount_dec_and_test(&nport->ref)) return; =20 + spin_lock_irqsave(&fcloop_lock, flags); + list_del(&nport->nport_list); + spin_unlock_irqrestore(&fcloop_lock, flags); + kfree(nport); } =20 @@ -1414,8 +1420,6 @@ __unlink_remote_port(struct fcloop_nport *nport) nport->tport->remoteport =3D NULL; nport->rport =3D NULL; =20 - list_del(&nport->nport_list); - return rport; } =20 --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 DCCC818BBAE for ; Wed, 23 Apr 2025 13:22:00 +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=1745414520; cv=none; b=AkzUiPGb4GagP4jQjoXUYVyKg6XsNeQhksBzWWZV5MeSVkIR1YjKJ7Y5oL/N717NWQLnF5/OjFbCNhfzyFwjGv+ES8G+J/9o4Juo5Nx8nkeX4OrUo1E6K41lLE668J0XindRm0fNMJoq2+ZYIYyxAFgps0gDmbxRLlt6um+pKXo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414520; c=relaxed/simple; bh=Xe+d02CG83R08Gc8sX/2gu0ycajhZ1Rrr/zsZ5RfWWA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kduOiWqH8nFYpZZvNn4vbJEMWPu8nkebYvmsbkQe+E7jDr+eght6JbcN6xcIkSSgOyh2rDhOgpBQ2mVqEI/WDcusV/l4v9+GzK8BFV+K9m/2eG4LW6bZyKr/ogE3rDQiWojvZMffq+EdctCaGOncfKSZqpady19Zxv6/2DAWh8k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=htvEq2vw; 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="htvEq2vw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EDD90C4CEE2; Wed, 23 Apr 2025 13:21:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414520; bh=Xe+d02CG83R08Gc8sX/2gu0ycajhZ1Rrr/zsZ5RfWWA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=htvEq2vw84SAZmprboeiiJ59486ed2gJHBoSmTUyoyVvsOqSNwS+l1qe6ytpln894 J1nNlUTxQUctwBo/qkCwvkyoSRtjuYa5nB7tlUMIHVbUFDlzo1iqKXIshm4j4JFGEr FcXiD2x35Bv5+jI9J1rSZmNu5V50Y3pJA85WB4JgKGUETotEIU3ewuhh0JW7DqNNsS M5a7quu3tDW/OEtnXm3a92LLxxIeoqqNZgIc8tBmtLHCplcrZKX/0kC8SqljsLWrtb cJ5Jhc12OcQxo4lf+hlcoUbNh8TiIyC1fVUJNk/fT+f7qhWY7y/FEVM2x3xvpvABSv RueTJUVJv/dOg== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:46 +0200 Subject: [PATCH v5 03/14] nvmet-fcloop: refactor fcloop_nport_alloc and track lport Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-3-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The checks for a valid input values are mixed with the logic to insert a newly allocated nport. Refactor the function so that first the checks are done. This allows to untangle the setup steps into a more linear form which reduces the complexity of the functions. Also start tracking lport when a lport is assigned to a nport. This ensures, that the lport is not going away as long it is still referenced by a nport. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 107 ++++++++++++++++++++++++++-------------= ---- 1 file changed, 64 insertions(+), 43 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 2cce7649af276528360395b6d58f03183c11da20..a8134127ad8087190d674251a88= 545da3f8800d7 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1028,6 +1028,9 @@ fcloop_nport_put(struct fcloop_nport *nport) list_del(&nport->nport_list); spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (nport->lport) + fcloop_lport_put(nport->lport); + kfree(nport); } =20 @@ -1234,6 +1237,25 @@ fcloop_nport_lookup(u64 node_name, u64 port_name) return nport; } =20 +static struct fcloop_lport * +__fcloop_lport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_lport *lport; + + list_for_each_entry(lport, &fcloop_lports, lport_list) { + if (lport->localport->node_name !=3D node_name || + lport->localport->port_name !=3D port_name) + continue; + + if (fcloop_lport_get(lport)) + return lport; + + break; + } + + return NULL; +} + static ssize_t fcloop_delete_local_port(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -1272,8 +1294,8 @@ fcloop_delete_local_port(struct device *dev, struct d= evice_attribute *attr, static struct fcloop_nport * fcloop_alloc_nport(const char *buf, size_t count, bool remoteport) { - struct fcloop_nport *newnport, *nport =3D NULL; - struct fcloop_lport *tmplport, *lport =3D NULL; + struct fcloop_nport *newnport, *nport; + struct fcloop_lport *lport; struct fcloop_ctrl_options *opts; unsigned long flags; u32 opts_mask =3D (remoteport) ? RPORT_OPTS : TGTPORT_OPTS; @@ -1288,10 +1310,8 @@ fcloop_alloc_nport(const char *buf, size_t count, bo= ol remoteport) goto out_free_opts; =20 /* everything there ? */ - if ((opts->mask & opts_mask) !=3D opts_mask) { - ret =3D -EINVAL; + if ((opts->mask & opts_mask) !=3D opts_mask) goto out_free_opts; - } =20 newnport =3D kzalloc(sizeof(*newnport), GFP_KERNEL); if (!newnport) @@ -1307,60 +1327,61 @@ fcloop_alloc_nport(const char *buf, size_t count, b= ool remoteport) refcount_set(&newnport->ref, 1); =20 spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tmplport, &fcloop_lports, lport_list) { - if (tmplport->localport->node_name =3D=3D opts->wwnn && - tmplport->localport->port_name =3D=3D opts->wwpn) - goto out_invalid_opts; - - if (tmplport->localport->node_name =3D=3D opts->lpwwnn && - tmplport->localport->port_name =3D=3D opts->lpwwpn) - lport =3D tmplport; + lport =3D __fcloop_lport_lookup(opts->wwnn, opts->wwpn); + if (lport) { + /* invalid configuration */ + fcloop_lport_put(lport); + goto out_free_newnport; } =20 if (remoteport) { - if (!lport) - goto out_invalid_opts; - newnport->lport =3D lport; - } - - list_for_each_entry(nport, &fcloop_nports, nport_list) { - if (nport->node_name =3D=3D opts->wwnn && - nport->port_name =3D=3D opts->wwpn) { - if ((remoteport && nport->rport) || - (!remoteport && nport->tport)) { - nport =3D NULL; - goto out_invalid_opts; - } - - fcloop_nport_get(nport); - - spin_unlock_irqrestore(&fcloop_lock, flags); - - if (remoteport) - nport->lport =3D lport; - if (opts->mask & NVMF_OPT_ROLES) - nport->port_role =3D opts->roles; - if (opts->mask & NVMF_OPT_FCADDR) - nport->port_id =3D opts->fcaddr; + lport =3D __fcloop_lport_lookup(opts->lpwwnn, opts->lpwwpn); + if (!lport) { + /* invalid configuration */ goto out_free_newnport; } } =20 - list_add_tail(&newnport->nport_list, &fcloop_nports); + nport =3D __fcloop_nport_lookup(opts->wwnn, opts->wwpn); + if (nport) { + if ((remoteport && nport->rport) || + (!remoteport && nport->tport)) { + /* invalid configuration */ + goto out_put_nport; + } =20 + /* found existing nport, discard the new nport */ + kfree(newnport); + } else { + list_add_tail(&newnport->nport_list, &fcloop_nports); + nport =3D newnport; + } + + if (opts->mask & NVMF_OPT_ROLES) + nport->port_role =3D opts->roles; + if (opts->mask & NVMF_OPT_FCADDR) + nport->port_id =3D opts->fcaddr; + if (lport) { + if (!nport->lport) + nport->lport =3D lport; + else + fcloop_lport_put(lport); + } spin_unlock_irqrestore(&fcloop_lock, flags); =20 kfree(opts); - return newnport; + return nport; =20 -out_invalid_opts: - spin_unlock_irqrestore(&fcloop_lock, flags); +out_put_nport: + if (lport) + fcloop_lport_put(lport); + fcloop_nport_put(nport); out_free_newnport: + spin_unlock_irqrestore(&fcloop_lock, flags); kfree(newnport); out_free_opts: kfree(opts); - return nport; + return NULL; } =20 static ssize_t --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 A48C71917F9 for ; Wed, 23 Apr 2025 13:22:03 +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=1745414523; cv=none; b=iTRigDBcYfQe2DhnBhJ17jPYiNFC4Pb/09dItVU1JoxBXyhF8E47i6r7Sw3rHYGysSsg2P1HtNLJyPq0gv5yCgQLudC7MO1ansbwObHU3BP0cz64gcgmJt2BsoNXPSlxWJoqairRRSgvbYdTfar+XdvwjhFfcXocLEHtZX+xrbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414523; c=relaxed/simple; bh=F6amLIDQUFRoq7o9H5ZznvD/2tad4/3TkumHpgROHvE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=E4m4GRbiw4Q/mwDL3wX76Yb66XgNWpaqBjXy5Q5T5AiTkvbZR379X0fJFVxLDfWMvtZvbwFYF81yeVPhAZjbqPcp1igUXbjULdix8z7/EAEP4d8mBJRXAjV2Bh8zr5OLH3DStoVhYUNCVZYEEhyO1luaON37rXBXrZnG49Pc6OM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Jxl+XHLD; 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="Jxl+XHLD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B2569C4CEE2; Wed, 23 Apr 2025 13:22:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414523; bh=F6amLIDQUFRoq7o9H5ZznvD/2tad4/3TkumHpgROHvE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Jxl+XHLDQ66pbJ+g+UMnV96m/+Rvo5fhksSjCXD8FJApxPtlp6WbYxsQbPRU1wrXN AiddRLVMRgDHFuanAV4zqlfcdK0h5A/PeWnD/Jtptbp4UZsopdCrKYaBVn+8GSvt0o X8lY3SwWJY91Mpx3B2TfzBXuL9peGfK+qR78h4KgCrr7k43SrpS6EtA+DIo59aB4F2 3vpJP8jry19E91MDHc/NB1/xK90W94tdy4oi3emUIxlP5PiQp8CYMpJId6yswryuYn zJKqKtrwv0chkFSjUELbg2ihfIV64uA2jM5Sk5rBEIohgk/zjcni6yNtIYB2SdoIWH L/mr85eTGYgXw== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:47 +0200 Subject: [PATCH v5 04/14] nvmet-fcloop: refactor fcloop_delete_local_port Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-4-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Use the newly introduced fcloop_lport_lookup instead of the open coded version. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index a8134127ad8087190d674251a88545da3f8800d7..1a8ae33c1699be3b7a2a7170dff= 77e324c127ebb 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -1256,32 +1256,32 @@ __fcloop_lport_lookup(u64 node_name, u64 port_name) return NULL; } =20 +static struct fcloop_lport * +fcloop_lport_lookup(u64 node_name, u64 port_name) +{ + struct fcloop_lport *lport; + unsigned long flags; + + spin_lock_irqsave(&fcloop_lock, flags); + lport =3D __fcloop_lport_lookup(node_name, port_name); + spin_unlock_irqrestore(&fcloop_lock, flags); + + return lport; +} + static ssize_t fcloop_delete_local_port(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct fcloop_lport *tlport, *lport =3D NULL; + struct fcloop_lport *lport; u64 nodename, portname; - unsigned long flags; int ret; =20 ret =3D fcloop_parse_nm_options(dev, &nodename, &portname, buf); if (ret) return ret; =20 - spin_lock_irqsave(&fcloop_lock, flags); - - list_for_each_entry(tlport, &fcloop_lports, lport_list) { - if (tlport->localport->node_name =3D=3D nodename && - tlport->localport->port_name =3D=3D portname) { - if (!fcloop_lport_get(tlport)) - break; - lport =3D tlport; - break; - } - } - spin_unlock_irqrestore(&fcloop_lock, flags); - + lport =3D fcloop_lport_lookup(nodename, portname); if (!lport) return -ENOENT; =20 --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 567B217A2EF for ; Wed, 23 Apr 2025 13:22: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=1745414527; cv=none; b=cXVNAM1CjsggEWC6uxH6l7WndBtmtsgDq3CpI2UyZI6TUgFsrwzc90Fa4FnxgPWbLRvd2dJDnpLkwt11j+fmgPaA+mBmVtjMT1lTZKIja8Rvru75//Y5FaLLC8FgyEgfjdHCGjNYK308mNcO+X7KqUzkK7sohOFDrmkTH3RcLMk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414527; c=relaxed/simple; bh=EWB/sYzoB8CsG9hgCZR+RFlRMAyDx5p/cXloDsy+UNE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JEHTFueO6O7G4PcRY/I22w19TlysHfUrVeJ5fb23TJ7FzRkLidvMHsnNRZWlojDW5DZWo0VseFDKPxWR7ddrSyT4N0odDyUy92ZhIEbtyk+zZ8jsS1YF0LODlMoqqr2UqmHHc+IsBbuNOjEP8Mg/Hn7txeVUP2LmZkpMjq3RqSE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CNmoq/3K; 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="CNmoq/3K" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 751D5C4CEEB; Wed, 23 Apr 2025 13:22:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414525; bh=EWB/sYzoB8CsG9hgCZR+RFlRMAyDx5p/cXloDsy+UNE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=CNmoq/3KVehOvmZ18VWVuTRv1tXJahNs8dsSUKRF/BOdxPT9wWUVmZWhpkld1QLde 0B/qwpZEbYbxjoFGcHm61oWS4XU4AwsChS6nfDMDiKiuhwZlwZdbYnRrFiJOkzgiiy D3wKVV9+jR/IAJQMZhw9r8GtoabmqWgjtaFh9lM/86C+u5GrEMsLLT246t8CzXAovu G3rcNghzfALArZDKFESy+PU80wAlZ9pMoaNNG8lUob2PPjHfPeAhC3RzSDf1TelfiL 2J+bgtjdFjhx4NAaJrGIZ6xrRIN50Xl2436mQicHvnJ+NN+4kdRqzHVi8z7uymd0ZP yqMI1Znr9ozBQ== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:48 +0200 Subject: [PATCH v5 05/14] nvmet-fcloop: update refs on tfcp_req Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-5-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Track the lifetime of the in-flight tfcp_req to ensure the object is not freed too early. Reviewed-by: Christoph Hellwig Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 1a8ae33c1699be3b7a2a7170dff77e324c127ebb..b54467b285181d6909c6592eb16= 6cf4fe6fbe54c 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -566,7 +566,8 @@ fcloop_call_host_done(struct nvmefc_fcp_req *fcpreq, } =20 /* release original io reference on tgt struct */ - fcloop_tfcp_req_put(tfcp_req); + if (tfcp_req) + fcloop_tfcp_req_put(tfcp_req); } =20 static bool drop_fabric_opcode; @@ -671,6 +672,7 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) break; default: spin_unlock_irqrestore(&tfcp_req->reqlock, flags); + fcloop_tfcp_req_put(tfcp_req); WARN_ON(1); return; } @@ -958,8 +960,10 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, =20 spin_lock(&inireq->inilock); tfcp_req =3D inireq->tfcp_req; - if (tfcp_req) - fcloop_tfcp_req_get(tfcp_req); + if (tfcp_req) { + if (!fcloop_tfcp_req_get(tfcp_req)) + tfcp_req =3D NULL; + } spin_unlock(&inireq->inilock); =20 if (!tfcp_req) --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 CC774199FD0 for ; Wed, 23 Apr 2025 13:22:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414528; cv=none; b=RKCiyVvJG0zAxhotXIqhN9QAv+uecScQy5HWFMIEY4D9nKEy131vKkomd4LnSyfUJ1pvuu+b3rDQiToQGtGFqqv2Nl7HbTrMzI+HqveYtrNCqsFqtigYna0n+i//+f+0EIzGF0MQNBQCOOBBmKyvOKdQGvnyjgUjkSfrdb/XE14= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414528; c=relaxed/simple; bh=gsPh10Lo83G0mW4lltW0uPRenCo3upye1tmBE7bC6JA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q73RmQdBE6d6i/qf94eJOyu1kYzSfJsT7cYhxxMII/12HCxnwVsZqAu12KstRYdnTJ2nzH88LKkXnTm3pkoC2SVSmhRDP7j8Zpuc57lFGLtGKbZ5FNQslvHUiBqHPhXtNd97Kv3QJ7BwxUA1HuFNI/NSCdaWfzPRnm1fY6l5iUs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KBkq7K2r; 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="KBkq7K2r" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4FB1CC4CEEB; Wed, 23 Apr 2025 13:22:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414528; bh=gsPh10Lo83G0mW4lltW0uPRenCo3upye1tmBE7bC6JA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=KBkq7K2rJyvuL1jt09PIBYGy/54y7ZYnlI8v0sWY6YoNX4PvG5i+FLS60XdMel982 4i8bTYX8ZwvsiUtwNHJhNiJOHnDzjgNKPBnljDkaEGZaZ15aaP1+rn2/KULnAZ6GJJ o9lu5+ORRvistqyq6TIjk+9xKfFW6ZaDe190lCP6DMIu9zDtc9FI0oZ8ulix5AYUKH aQClkQtSOaLrWOB41a9bGttDT6EAjm2uqWwCJcL9iDMOzk65oEgTc//cENk8Ucqcxg VXDE8qbnkjJlS6rY1JF7731mhiH79sWJHqcnMozRFFuWtijkKaOEpVXhglNjKQqGMV Rsl9C3fR171nA== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:49 +0200 Subject: [PATCH v5 06/14] nvmet-fcloop: add missing fcloop_callback_host_done Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-6-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Add the missing fcloop_call_host_done calls so that the caller frees resources when something goes wrong. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index b54467b285181d6909c6592eb166cf4fe6fbe54c..0c0117e03adc81c643e90a7e783= 2ff087a4c2fd7 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -966,9 +966,10 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, } spin_unlock(&inireq->inilock); =20 - if (!tfcp_req) + if (!tfcp_req) { /* abort has already been called */ - return; + goto out_host_done; + } =20 /* break initiator/target relationship for io */ spin_lock_irqsave(&tfcp_req->reqlock, flags); @@ -983,7 +984,7 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, default: spin_unlock_irqrestore(&tfcp_req->reqlock, flags); WARN_ON(1); - return; + goto out_host_done; } spin_unlock_irqrestore(&tfcp_req->reqlock, flags); =20 @@ -997,6 +998,11 @@ fcloop_fcp_abort(struct nvme_fc_local_port *localport, */ fcloop_tfcp_req_put(tfcp_req); } + + return; + +out_host_done: + fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); } =20 static void --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 9D8C019DF5B for ; Wed, 23 Apr 2025 13:22:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414531; cv=none; b=FgDn3Kc4eMttEGqfEA5Au5vj/bD1vRMT5poRN7H2DJl/3iUD0A1mvehD96kNYQpxzGvUdxbqHeKcQSeF6Xo9EzC7SEjy1LCsPDrB1ioidhyd3H3BBiCWRHXgWqJEpC0oLgfyZAiQ4jueQbO7V5sjSiFp9GrEYviHvMb3A/uwy1M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414531; c=relaxed/simple; bh=bWfF/z6J6VjDnFu295fwOKQGsLQiUbigzuCMF8Epxkw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jk0XbQHDgucqJsSyNcfFpQnSBIrvzZZjk+OhJeTlg15gGB2A+TsO6T2YbLSSnUaPsEGCsSBh+zyP5xNAQHerJM/H7avGx5hNsmPinVH7FIZdBiU4nXz9VMBBr22KN+AEFWsAVCSLlkOGopqLsy/c6VEZABafco6SC1zvTS/c+kU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nyxwa59L; 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="nyxwa59L" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1DD6DC4CEE2; Wed, 23 Apr 2025 13:22:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414531; bh=bWfF/z6J6VjDnFu295fwOKQGsLQiUbigzuCMF8Epxkw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nyxwa59LXzBPfaVSstpIrmp1hKMy463+8lX+O6JIWAxRG1Lb7euTgGdi4J1WXy24X s88MRmQrzBfEXg6LQn7f7s3m7dleqr1qdaGomnGQRH6DMgAOWWh7gaMeCQN6pIS7O9 j7E21N3o0jCEbgIPGz3sW8gwiUxtRpBDTy20L6FdlutGHo8LPh3eFbi6qr52lnZxEg fkwtfWS/g4lvOvf0sZQx//CbSFdqnTaIMNBxPoD4XY6hL0PvOuNd9ZqGk2TWINEnMb AGe/g3MXbgHwyjNAznNIejYc3uprQhlBSw+JC1vh/3SG5SSRif73tvoRh3habrkaQ7 PL6BmMnAvmAUQ== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:50 +0200 Subject: [PATCH v5 07/14] nvmet-fcloop: access fcpreq only when holding reqlock Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-7-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The abort handling logic expects that the state and the fcpreq are only accessed when holding the reqlock lock. While at it, only handle the aborts in the abort handler. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 0c0117e03adc81c643e90a7e7832ff087a4c2fd7..9adaee3c7129f7e270842c5d09f= 78de2e108479a 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -619,12 +619,13 @@ fcloop_fcp_recv_work(struct work_struct *work) { struct fcloop_fcpreq *tfcp_req =3D container_of(work, struct fcloop_fcpreq, fcp_rcv_work); - struct nvmefc_fcp_req *fcpreq =3D tfcp_req->fcpreq; + struct nvmefc_fcp_req *fcpreq; unsigned long flags; int ret =3D 0; bool aborted =3D false; =20 spin_lock_irqsave(&tfcp_req->reqlock, flags); + fcpreq =3D tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_START: tfcp_req->inistate =3D INI_IO_ACTIVE; @@ -639,16 +640,19 @@ fcloop_fcp_recv_work(struct work_struct *work) } spin_unlock_irqrestore(&tfcp_req->reqlock, flags); =20 - if (unlikely(aborted)) - ret =3D -ECANCELED; - else { - if (likely(!check_for_drop(tfcp_req))) - ret =3D nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, - &tfcp_req->tgt_fcp_req, - fcpreq->cmdaddr, fcpreq->cmdlen); - else - pr_info("%s: dropped command ********\n", __func__); + if (unlikely(aborted)) { + /* the abort handler will call fcloop_call_host_done */ + return; + } + + if (unlikely(check_for_drop(tfcp_req))) { + pr_info("%s: dropped command ********\n", __func__); + return; } + + ret =3D nvmet_fc_rcv_fcp_req(tfcp_req->tport->targetport, + &tfcp_req->tgt_fcp_req, + fcpreq->cmdaddr, fcpreq->cmdlen); if (ret) fcloop_call_host_done(fcpreq, tfcp_req, ret); } @@ -663,9 +667,10 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) unsigned long flags; =20 spin_lock_irqsave(&tfcp_req->reqlock, flags); - fcpreq =3D tfcp_req->fcpreq; switch (tfcp_req->inistate) { case INI_IO_ABORTED: + fcpreq =3D tfcp_req->fcpreq; + tfcp_req->fcpreq =3D NULL; break; case INI_IO_COMPLETED: completed =3D true; @@ -688,10 +693,6 @@ fcloop_fcp_abort_recv_work(struct work_struct *work) nvmet_fc_rcv_fcp_abort(tfcp_req->tport->targetport, &tfcp_req->tgt_fcp_req); =20 - spin_lock_irqsave(&tfcp_req->reqlock, flags); - tfcp_req->fcpreq =3D NULL; - spin_unlock_irqrestore(&tfcp_req->reqlock, flags); - fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); /* call_host_done releases reference for abort downcall */ } --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 77CB41A2387 for ; Wed, 23 Apr 2025 13:22:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414534; cv=none; b=cBNLMJwNVy1VU3oejKp5yEDfee1j2+/DjkTah8VKGGUi2ec4GtVNcAWmobIqU8oODjjKDC5fMfChkhOuDklPUYTnjAprt1Qbljj10Q4ACaSCM/Kyo5Rj0t3H0bjvTBnkGtzKvnQbAac7QOzm4nXcNBezDyFL/05Y2PGBDZ0T5jI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414534; c=relaxed/simple; bh=YmvfucME6p9mQbq10tqk6j4ONnoLmEFU9LLeZ/eqRUU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HaznCsFh68MCbc6pr5l5SU0Yj8TVfGfuTbmxMttiTd3/+TPyY8Rm9qqBo5f8WI2ETOiLQrCUMHXP1uz1Wnc2r2S7JJJUtUvHJmRGomv8FLifdP1fl5sjE8NB49z21CA058bTKBc8mwNX5X29poTG/+GCjdzMuYprk5yqF1JnrL8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=axpj7R5q; 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="axpj7R5q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E6A02C4CEEC; Wed, 23 Apr 2025 13:22:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414534; bh=YmvfucME6p9mQbq10tqk6j4ONnoLmEFU9LLeZ/eqRUU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=axpj7R5q57Mj82o3h/MOqTF2aEcTMNDebumr54f6EJh6MmVFEog2tkq75/SiowMhA trvi45zHR4C5D9cm8bilF8462kmu82ln4qvPMiEWwuOEDQ8zb+J4fWprBqzN7Cf9nS cFyAmNS0no5ht/gR0h6BqTeq+l7sYSF22lknP6rT2Imd/lcjH8NW2PwlG7lWf3G0jk yiIJpsN9VRyJxZ75ZR9KeLP+e+q3caqttjdEx2eZYGWKS54Az7IJ8Vs/V/FbWZ4Kta 01UvBGKkMaFTe6tWcloR4cqDVxDcGrtS1jqa7KDYx9gzQkj7X9we70RxzoPP3HlWc7 BiNfsCJ0ihZMg== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:51 +0200 Subject: [PATCH v5 08/14] nvmet-fcloop: prevent double port deletion Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-8-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The delete callback can be called either via the unregister function or from the transport directly. Thus it is necessary ensure resources are not freed multiple times. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 9adaee3c7129f7e270842c5d09f78de2e108479a..014cc66f92cb1db0a81a79d2109= eae3fff5fd38a 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -215,6 +215,9 @@ struct fcloop_lport_priv { struct fcloop_lport *lport; }; =20 +/* The port is already being removed, avoid double free */ +#define PORT_DELETED 0 + struct fcloop_rport { struct nvme_fc_remote_port *remoteport; struct nvmet_fc_target_port *targetport; @@ -223,6 +226,7 @@ struct fcloop_rport { spinlock_t lock; struct list_head ls_list; struct work_struct ls_work; + unsigned long flags; }; =20 struct fcloop_tport { @@ -233,6 +237,7 @@ struct fcloop_tport { spinlock_t lock; struct list_head ls_list; struct work_struct ls_work; + unsigned long flags; }; =20 struct fcloop_nport { @@ -1067,14 +1072,20 @@ static void fcloop_remoteport_delete(struct nvme_fc_remote_port *remoteport) { struct fcloop_rport *rport =3D remoteport->private; + bool delete_port =3D true; unsigned long flags; =20 flush_work(&rport->ls_work); =20 spin_lock_irqsave(&fcloop_lock, flags); + if (test_and_set_bit(PORT_DELETED, &rport->flags)) + delete_port =3D false; rport->nport->rport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (!delete_port) + return; + fcloop_nport_put(rport->nport); } =20 @@ -1082,14 +1093,20 @@ static void fcloop_targetport_delete(struct nvmet_fc_target_port *targetport) { struct fcloop_tport *tport =3D targetport->private; + bool delete_port =3D true; unsigned long flags; =20 flush_work(&tport->ls_work); =20 spin_lock_irqsave(&fcloop_lock, flags); + if (test_and_set_bit(PORT_DELETED, &tport->flags)) + delete_port =3D false; tport->nport->tport =3D NULL; spin_unlock_irqrestore(&fcloop_lock, flags); =20 + if (!delete_port) + return; + fcloop_nport_put(tport->nport); } =20 @@ -1433,6 +1450,7 @@ fcloop_create_remote_port(struct device *dev, struct = device_attribute *attr, rport->nport =3D nport; rport->lport =3D nport->lport; nport->rport =3D rport; + rport->flags =3D 0; spin_lock_init(&rport->lock); INIT_WORK(&rport->ls_work, fcloop_rport_lsrqst_work); INIT_LIST_HEAD(&rport->ls_list); @@ -1530,6 +1548,7 @@ fcloop_create_target_port(struct device *dev, struct = device_attribute *attr, tport->nport =3D nport; tport->lport =3D nport->lport; nport->tport =3D tport; + tport->flags =3D 0; spin_lock_init(&tport->lock); INIT_WORK(&tport->ls_work, fcloop_tport_lsrqst_work); INIT_LIST_HEAD(&tport->ls_list); --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 EAC70189F39 for ; Wed, 23 Apr 2025 13:22: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=1745414540; cv=none; b=EnrpU9IumL+yGOwC/QMsuVSijXzJw0m/lnXGt+tI5O6Q3kayyXOA3gY1FVeJaqGZ186090lMQJKnAqMCEvk16R2faNkdy5bOOClWCG9Ez5ztu7+EUgq9/hXgxRve3XHWiuJuxRshsSEqYlV4PKvuv1iWrkfKc77Gm5xGSUGwlxw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414540; c=relaxed/simple; bh=mXSrbFVuNJV6VkeoxAR0XoweTJRrbm3vnqZ/Tfb8XTU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uzVbhCHgPgZOXCd8W3HnJfzKbYYqXa+1DDQQz5UOOieNodblmIPRXjzBi45S+z5tWob7OTENTITXS02HEX4kpDKwcqLGIn9qxwbNrLnhDn44NgrQ+t5Sx3iUE0OWreBaaJ+eDE2ioLVBzPSVwfSFJw8J7fSo/ztQuH93dVcg1hs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gqgaASzF; 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="gqgaASzF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C31D1C4CEE2; Wed, 23 Apr 2025 13:22:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414537; bh=mXSrbFVuNJV6VkeoxAR0XoweTJRrbm3vnqZ/Tfb8XTU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=gqgaASzFrGaQ7hgzyOZ253A9OOodhuZ984ZBcefakydnwEx3Rx+fwcFQjekk1KczO DAAeyEvvX4mXTMcFLmImJtT/THXXotUC2D1XMxSNLejSYBMsqT+QgMScFKyvmI8Ih5 lyXbx1qPAV5AJsVMbfjq7ikwdCbgwFeidJlSUeoay8vNMkUh8PjEYWnaGEzNQuExUw jtpHa5CAJHv9WmYqS3MNcV91AsiUOWoG0VAj++rcx2poXlCTcP2JtjfFgGvgLmQ/ih kKd9k22NU1g4FuLwMjf28kYHf4gxjMJaoRNqu3AXRzLNGHHQ+F1viEx8s8rsO2ZstF LQOIy/Jsz4org== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:52 +0200 Subject: [PATCH v5 09/14] nvmet-fcloop: allocate/free fcloop_lsreq directly Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-9-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@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 Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 63 +++++++++++++++++++++++++++++++---------= ---- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 014cc66f92cb1db0a81a79d2109eae3fff5fd38a..47ce51183a66b4b37fc850cced2= ddf70be2cdb42 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -293,6 +293,9 @@ struct fcloop_ini_fcpreq { spinlock_t inilock; }; =20 +/* SLAB cache for fcloop_lsreq structures */ +struct kmem_cache *lsreq_cache; + static inline struct fcloop_lsreq * ls_rsp_to_lsreq(struct nvmefc_ls_rsp *lsrsp) { @@ -343,6 +346,7 @@ fcloop_rport_lsrqst_work(struct work_struct *work) * callee may free memory containing tls_req. * do not reference lsreq after this. */ + kmem_cache_free(lsreq_cache, tls_req); =20 spin_lock(&rport->lock); } @@ -354,10 +358,13 @@ fcloop_h2t_ls_req(struct nvme_fc_local_port *localpor= t, struct nvme_fc_remote_port *remoteport, struct nvmefc_ls_req *lsreq) { - struct fcloop_lsreq *tls_req =3D lsreq->private; struct fcloop_rport *rport =3D remoteport->private; + struct fcloop_lsreq *tls_req; int ret =3D 0; =20 + tls_req =3D kmem_cache_alloc(lsreq_cache, GFP_KERNEL); + if (!tls_req) + return -ENOMEM; tls_req->lsreq =3D lsreq; INIT_LIST_HEAD(&tls_req->ls_list); =20 @@ -394,14 +401,17 @@ fcloop_h2t_xmt_ls_rsp(struct nvmet_fc_target_port *ta= rgetport, =20 lsrsp->done(lsrsp); =20 - if (remoteport) { - rport =3D remoteport->private; - spin_lock(&rport->lock); - list_add_tail(&tls_req->ls_list, &rport->ls_list); - spin_unlock(&rport->lock); - queue_work(nvmet_wq, &rport->ls_work); + if (!remoteport) { + kmem_cache_free(lsreq_cache, tls_req); + return 0; } =20 + rport =3D remoteport->private; + spin_lock(&rport->lock); + list_add_tail(&tls_req->ls_list, &rport->ls_list); + spin_unlock(&rport->lock); + queue_work(nvmet_wq, &rport->ls_work); + return 0; } =20 @@ -427,6 +437,7 @@ fcloop_tport_lsrqst_work(struct work_struct *work) * callee may free memory containing tls_req. * do not reference lsreq after this. */ + kmem_cache_free(lsreq_cache, tls_req); =20 spin_lock(&tport->lock); } @@ -437,8 +448,8 @@ static int fcloop_t2h_ls_req(struct nvmet_fc_target_port *targetport, void *hosthandl= e, struct nvmefc_ls_req *lsreq) { - struct fcloop_lsreq *tls_req =3D lsreq->private; struct fcloop_tport *tport =3D targetport->private; + struct fcloop_lsreq *tls_req; int ret =3D 0; =20 /* @@ -446,6 +457,10 @@ fcloop_t2h_ls_req(struct nvmet_fc_target_port *targetp= ort, void *hosthandle, * hosthandle ignored as fcloop currently is * 1:1 tgtport vs remoteport */ + + tls_req =3D kmem_cache_alloc(lsreq_cache, GFP_KERNEL); + if (!tls_req) + return -ENOMEM; tls_req->lsreq =3D lsreq; INIT_LIST_HEAD(&tls_req->ls_list); =20 @@ -462,6 +477,9 @@ fcloop_t2h_ls_req(struct nvmet_fc_target_port *targetpo= rt, void *hosthandle, ret =3D nvme_fc_rcv_ls_req(tport->remoteport, &tls_req->ls_rsp, lsreq->rqstaddr, lsreq->rqstlen); =20 + if (ret) + kmem_cache_free(lsreq_cache, tls_req); + return ret; } =20 @@ -481,14 +499,17 @@ fcloop_t2h_xmt_ls_rsp(struct nvme_fc_local_port *loca= lport, lsreq->rsplen : lsrsp->rsplen)); lsrsp->done(lsrsp); =20 - if (targetport) { - tport =3D targetport->private; - spin_lock(&tport->lock); - list_add_tail(&tls_req->ls_list, &tport->ls_list); - spin_unlock(&tport->lock); - queue_work(nvmet_wq, &tport->ls_work); + if (!targetport) { + kmem_cache_free(lsreq_cache, tls_req); + return 0; } =20 + tport =3D targetport->private; + spin_lock(&tport->lock); + list_add_tail(&tls_req->ls_list, &tport->ls_list); + spin_unlock(&tport->lock); + queue_work(nvmet_wq, &tport->ls_work); + return 0; } =20 @@ -1131,7 +1152,6 @@ static struct nvme_fc_port_template fctemplate =3D { /* sizes of additional private data for data structures */ .local_priv_sz =3D sizeof(struct fcloop_lport_priv), .remote_priv_sz =3D sizeof(struct fcloop_rport), - .lsrqst_priv_sz =3D sizeof(struct fcloop_lsreq), .fcprqst_priv_sz =3D sizeof(struct fcloop_ini_fcpreq), }; =20 @@ -1154,7 +1174,6 @@ static struct nvmet_fc_target_template tgttemplate = =3D { .target_features =3D 0, /* sizes of additional private data for data structures */ .target_priv_sz =3D sizeof(struct fcloop_tport), - .lsrqst_priv_sz =3D sizeof(struct fcloop_lsreq), }; =20 static ssize_t @@ -1674,15 +1693,20 @@ static const struct class fcloop_class =3D { }; static struct device *fcloop_device; =20 - static int __init fcloop_init(void) { int ret; =20 + lsreq_cache =3D kmem_cache_create("lsreq_cache", + sizeof(struct fcloop_lsreq), 0, + 0, NULL); + if (!lsreq_cache) + return -ENOMEM; + ret =3D class_register(&fcloop_class); if (ret) { pr_err("couldn't register class fcloop\n"); - return ret; + goto out_destroy_cache; } =20 fcloop_device =3D device_create_with_groups( @@ -1700,6 +1724,8 @@ static int __init fcloop_init(void) =20 out_destroy_class: class_unregister(&fcloop_class); +out_destroy_cache: + kmem_cache_destroy(lsreq_cache); return ret; } =20 @@ -1765,6 +1791,7 @@ static void __exit fcloop_exit(void) =20 device_destroy(&fcloop_class, MKDEV(0, 0)); class_unregister(&fcloop_class); + kmem_cache_destroy(lsreq_cache); } =20 module_init(fcloop_init); --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 B0E3F17E473 for ; Wed, 23 Apr 2025 13:22: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=1745414541; cv=none; b=PUN6EIWUuczJagJELpADxqxOabwrSMiGm0gWUfkOPd8AGCQS064iC2KsiTgQqANk62nDF8sqd2NK8YYfyFig5npex27CXxRfRXPRRt5AUS2gsXfxxK5iXNfI859SPDixIyD+Ezth9D0shybrht/WEMK88XWilyZ2TDcfBkbxkps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414541; c=relaxed/simple; bh=TzcGZfdwmdfAFPVttrRv4/p72KsoezPGz0D2QH9DrFQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=otIMDp8IyiFuTYbnjSsWFm3t/YYF9uTOkLM11YXApRfduGZ2OYdlsHWKrM9seojoPtY24FBzMHz7/LAhTLkopFFtLPE650Xf3XgqSmwHoENcONn5wTWS8/w3GszDr7rn+RfO6PKWuNzQ3of9NEpPx7eNzNY/x0iaTtz9/ifo+SU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NkzzeHvS; 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="NkzzeHvS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C6528C4CEEB; Wed, 23 Apr 2025 13:22:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414540; bh=TzcGZfdwmdfAFPVttrRv4/p72KsoezPGz0D2QH9DrFQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NkzzeHvSffX8EV4RRVX60fGVqrkaMNDBoeokXbDeo3hht+Q7VS9796luhryr6x0qL o1PZj6iEghGK0uvRx8xPcE92K5o4rwyTQSFgC+nw3kWoUKpcrm+/73AxpjxTiVl/3e U/DcecGxhiYCtZNlmZHGqk8ZeOqGN2ngmbmNBYQqbtwjenoBBAZchKRK/A3KQOHyZp NpzWwBoMhnXMytqKkyxb7eAMCooNE3QN7Qdxrn64zzhyz4lucl0ebRISKamIMGslhd X4d9HKvBFE848Up8STUI8+eUrCR/AYsbfhik5A0lthiv5I+f3cusyOyc70V8lDjQfS Ke46iCbRa1LRA== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:53 +0200 Subject: [PATCH v5 10/14] nvmet-fcloop: don't wait for lport cleanup Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-10-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The lifetime of the fcloop_lsreq is not tight to the lifetime of the host or target port, thus there is no need anymore to synchronize the cleanup path anymore. Signed-off-by: Daniel Wagner --- drivers/nvme/target/fcloop.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index 47ce51183a66b4b37fc850cced2ddf70be2cdb42..ca11230bffedb0f2313a99e24e5= 4e892daf0d644 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -207,7 +207,6 @@ static LIST_HEAD(fcloop_nports); struct fcloop_lport { struct nvme_fc_local_port *localport; struct list_head lport_list; - struct completion unreg_done; refcount_t ref; }; =20 @@ -1083,9 +1082,6 @@ fcloop_localport_delete(struct nvme_fc_local_port *lo= calport) struct fcloop_lport_priv *lport_priv =3D localport->private; struct fcloop_lport *lport =3D lport_priv->lport; =20 - /* release any threads waiting for the unreg to complete */ - complete(&lport->unreg_done); - fcloop_lport_put(lport); } =20 @@ -1238,18 +1234,9 @@ fcloop_create_local_port(struct device *dev, struct = device_attribute *attr, } =20 static int -__wait_localport_unreg(struct fcloop_lport *lport) +__localport_unreg(struct fcloop_lport *lport) { - int ret; - - init_completion(&lport->unreg_done); - - ret =3D nvme_fc_unregister_localport(lport->localport); - - if (!ret) - wait_for_completion(&lport->unreg_done); - - return ret; + return nvme_fc_unregister_localport(lport->localport); } =20 static struct fcloop_nport * @@ -1332,7 +1319,7 @@ fcloop_delete_local_port(struct device *dev, struct d= evice_attribute *attr, if (!lport) return -ENOENT; =20 - ret =3D __wait_localport_unreg(lport); + ret =3D __localport_unreg(lport); fcloop_lport_put(lport); =20 return ret ? ret : count; @@ -1776,7 +1763,7 @@ static void __exit fcloop_exit(void) =20 spin_unlock_irqrestore(&fcloop_lock, flags); =20 - ret =3D __wait_localport_unreg(lport); + ret =3D __localport_unreg(lport); if (ret) pr_warn("%s: Failed deleting local port\n", __func__); =20 --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 38F161A4F12 for ; Wed, 23 Apr 2025 13:22:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414543; cv=none; b=Y7kOLkG76t7kXlO+uEv/tjBwJNXfCPjoCCml7FcHvJSIoQz9aTk+jzihdt/jsWjALxJVtP9swo/77BMo35ehsz9RKjxT/VRIyUMb9uGPDDsRUsmCn40GGTgz29aP6ozd9waxRWeT6uYVnaA1QFIoTmEecPZs3UJW5bxjzII41IU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414543; c=relaxed/simple; bh=6MtNYpYf3+gfKph3AscTQcqFhTmhfVMJlOnasxAT7Vg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kadQ8G1ElnuHjGj+ukmLIeIrQ8CRlG4NmTT+URvceLqlexBIYrrWN4qKFznNPZxY5WRYI1kzIs4rMc1oqJbaZEL9sTE1MSc3jLhOL009X6OzgJsKOdjZGiEpc5fcRW4QKTVgnuRy0n0HY/UyJYhHEJe/vI1nQkjK8t+AUdlK56U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uGzG7HQj; 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="uGzG7HQj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B100EC4CEE2; Wed, 23 Apr 2025 13:22:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414543; bh=6MtNYpYf3+gfKph3AscTQcqFhTmhfVMJlOnasxAT7Vg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=uGzG7HQjaUOR35QHir31DR1z2HfBPedM5tEamXQzYkPoo9/XCIa30mQw1CH3QsLoA GGxj8hSQTKO1gbJN4lKj6C7uIupIitm9kZo8+JXnIwwIgXLazQ0BlzgPC2NITECcYT so4fBYHWVtKRqSsw3dybjbkXQzS9i8SFvcaGHKlflCHHi2tr9fNEFoBpHrwkqbmEBW BPYLXUSLYQi8Y/ch4FWe1oTIjCu7SVnetaG1WHoI0MPo/0YJZppnjZe1PcUruRyWQO yZ3gjWF3vpjbcKNhlgiwLXWlTXHo34kW9Oy710YjyMbJwMyAYRXuGxriUaQkldg/OS BHpSAkDjYjT0g== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:54 +0200 Subject: [PATCH v5 11/14] nvmet-fcloop: drop response if targetport is gone Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-11-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 When the target port is gone, the lsrsp pointer is invalid. Thus don't call the done function anymore instead just drop the response. This happens when the target sends a disconnect association. After this the target starts tearing down all resources and doesn't expect any response. Signed-off-by: Daniel Wagner Reviewed-by: Hannes Reinecke --- drivers/nvme/target/fcloop.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c index ca11230bffedb0f2313a99e24e54e892daf0d644..bb45721ec0f028399d810cbd789= 1bc6975801752 100644 --- a/drivers/nvme/target/fcloop.c +++ b/drivers/nvme/target/fcloop.c @@ -493,16 +493,25 @@ fcloop_t2h_xmt_ls_rsp(struct nvme_fc_local_port *loca= lport, struct nvmet_fc_target_port *targetport =3D rport->targetport; struct fcloop_tport *tport; =20 - memcpy(lsreq->rspaddr, lsrsp->rspbuf, - ((lsreq->rsplen < lsrsp->rsplen) ? - lsreq->rsplen : lsrsp->rsplen)); - lsrsp->done(lsrsp); - if (!targetport) { + /* + * The target port is gone. The target doesn't expect any + * response anymore and the ->done call is not valid + * because the resources have been freed by + * nvmet_fc_free_pending_reqs. + * + * We end up here from delete association exchange: + * nvmet_fc_xmt_disconnect_assoc sends an async request. + */ kmem_cache_free(lsreq_cache, tls_req); return 0; } =20 + memcpy(lsreq->rspaddr, lsrsp->rspbuf, + ((lsreq->rsplen < lsrsp->rsplen) ? + lsreq->rsplen : lsrsp->rsplen)); + lsrsp->done(lsrsp); + tport =3D targetport->private; spin_lock(&tport->lock); list_add_tail(&tls_req->ls_list, &tport->ls_list); --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 09CEF1A9B28 for ; Wed, 23 Apr 2025 13:22:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414546; cv=none; b=B3Gs6eJPiGlkKsOjlVPyRTdcxSmvO4B839gqZNam9Hobcz85TP1YYmgzqwJX9D3tDTU4XK5/kZX9UYPHC6w40nY/nxkSIKhRRUO5HagOFNUcH0KMqbrGbSozJhpbR4G970/qUItwOf4agAsa+ASErr6z9hS8HRMB6W4rvapNlS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414546; c=relaxed/simple; bh=NnHI6Paao3NgdBRHQkL+L4jcP1yEUV4TLY9mPyueH3w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GMhpKychDCsxLGhVsosolo9DbtG+RGIiUH5+GjkNX8c/jhmD/i3YLpq2JSeXGvNKRcQQOvu4pqlq6PSQkQuTkjKWq7YIIp7apcD1JkSUHncly5dKaTjYdp+Ex05vu8/PCRklJu/Qnx5ILdlTAeAlLEosL98BAwvxhva0XdEw8aU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=klMyHZSm; 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="klMyHZSm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 845B3C4CEE2; Wed, 23 Apr 2025 13:22:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414545; bh=NnHI6Paao3NgdBRHQkL+L4jcP1yEUV4TLY9mPyueH3w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=klMyHZSmxKc/xXNzVRz+rJJICulW7EiqNI41446qVIicVCSEvSEEVij6NHH/AzivB tYRIZvGs73gIkQNs4sjwkNTWGgibURhleKa3nxtJXKe/5JAE8v1k/8l2zir4htDBgC FtPXHZaXzDO5jNOQqqbVFFF1JZjvNpB2NPSBzjYlYn6JeZ4Y3706naY+11XpQ2r4Ad EQdz8t70XS7+ctfHeaDDp2RTpx3jvUYQXyNT9jrZcfaLasCrgVqi7oWsW75FxjWGBc iqWo+HUwD4Fd6ZYVUADppz4q+BaZ4UWiAwPwz0u+F3wqv8NTYXzbTdUTDEHXFbUP6a J1+S0/I8MgdAg== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:55 +0200 Subject: [PATCH v5 12/14] nvmet-fc: free pending reqs on tgtport unregister Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-12-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 When nvmet_fc_unregister_targetport is called by the LLDD, it's not possible to communicate with the host, thus all pending request will not be process. Thus explicitly free them. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner --- drivers/nvme/target/fc.c | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 7b50130f10f6578e6e49fe8ea661de34dfbb3683..75ddb7425605dd6623db38a133b= 63e201592354c 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1580,6 +1580,39 @@ nvmet_fc_delete_ctrl(struct nvmet_ctrl *ctrl) spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); } =20 +static void +nvmet_fc_free_pending_reqs(struct nvmet_fc_tgtport *tgtport) +{ + struct nvmet_fc_ls_req_op *lsop; + struct nvmefc_ls_req *lsreq; + struct nvmet_fc_ls_iod *iod; + int i; + + iod =3D tgtport->iod; + for (i =3D 0; i < NVMET_LS_CTX_COUNT; iod++, i++) + cancel_work(&iod->work); + + /* + * After this point the connection is lost and thus any pending + * request can't be processed by the normal completion path. This + * is likely a request from nvmet_fc_send_ls_req_async. + */ + while ((lsop =3D list_first_entry_or_null(&tgtport->ls_req_list, + struct nvmet_fc_ls_req_op, lsreq_list))) { + list_del(&lsop->lsreq_list); + + if (!lsop->req_queued) + continue; + + lsreq =3D &lsop->ls_req; + fc_dma_unmap_single(tgtport->dev, lsreq->rqstdma, + (lsreq->rqstlen + lsreq->rsplen), + DMA_BIDIRECTIONAL); + nvmet_fc_tgtport_put(tgtport); + kfree(lsop); + } +} + /** * nvmet_fc_unregister_targetport - transport entry point called by an * LLDD to deregister/remove a previously @@ -1608,13 +1641,7 @@ nvmet_fc_unregister_targetport(struct nvmet_fc_targe= t_port *target_port) =20 flush_workqueue(nvmet_wq); =20 - /* - * should terminate LS's as well. However, LS's will be generated - * at the tail end of association termination, so they likely don't - * exist yet. And even if they did, it's worthwhile to just let - * them finish and targetport ref counting will clean things up. - */ - + nvmet_fc_free_pending_reqs(tgtport); nvmet_fc_tgtport_put(tgtport); =20 return 0; --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 4229618C031 for ; Wed, 23 Apr 2025 13:22:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414549; cv=none; b=km7SiJ7BO0N92InN5HvtL1cVuqVYq8kLNSJRzdiEtpkjqyODMVYUF4TfOkqJIyHlzG0Hz8sbsiWcGBWqEGyfRDKDQEYSAJ1CjfKsYprPaInoWF9WN7YHMhRbLLjN71T+LdyYIuvmGWV+kykJPYEDBldhnx/BFLnicINPutYeszU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414549; c=relaxed/simple; bh=fBx9lCEtPCxPfGwK8FPJiN/ERtJIwVRE9R9bu+NJtAM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BjDN3zTEhSYq83YCgmcdGKxsBMHTczbR5+SU79+QrE2OwrWZzoezcjZiAlWH+Odh0HxuJjC/kWRceb4QObL6OMDtcr/b5SM2E6fbjBDtGjJo4oSQID0F//jKVhpHAEK8kYLZvfr54jy2kqGvurL49kc15wVCylSMcIP6vHOnG18= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nBAhs1Qa; 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="nBAhs1Qa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 502BFC4CEE2; Wed, 23 Apr 2025 13:22:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414548; bh=fBx9lCEtPCxPfGwK8FPJiN/ERtJIwVRE9R9bu+NJtAM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nBAhs1QauQlO5/VyrKfXeDnPaNIJQu5EmlYHYU12HhYnam5ZaSr0DW2eITK9TkEin FQg5FLSINfaW75mZIjlRfgrKtMOeIUXsW62zwzaB9ouzjSy8rygTBQ2c1P8+cnAMgq ISCvZVuR9r0L20G1iB7obW2K38mV8590YroSixgV+cvR3rD5+P21B0Ivk1JtNQ1Ays /pAo0xjlyiiBei8+VX0h+CO/KJjSs5Sf213S2WhCL5AB+V+VwbMuC1V3AlyZUBMJFV /8LeQyatOTuSExjwFzcArFihYTEUGyWU+BkasUsNhOM9QudbfGgbajui5yRjIT5uW3 15/aq9F75CmWw== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:56 +0200 Subject: [PATCH v5 13/14] nvmet-fc: take tgtport refs for portentry Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-13-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 Ensure that the tgtport is not going away as long portentry has a pointer on it. Reviewed-by: Hannes Reinecke Signed-off-by: Daniel Wagner --- drivers/nvme/target/fc.c | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 75ddb7425605dd6623db38a133b63e201592354c..2835772677f9486324ef77d9021= b49f8d153e916 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c @@ -1254,6 +1254,7 @@ nvmet_fc_portentry_bind(struct nvmet_fc_tgtport *tgtp= ort, { lockdep_assert_held(&nvmet_fc_tgtlock); =20 + nvmet_fc_tgtport_get(tgtport); pe->tgtport =3D tgtport; tgtport->pe =3D pe; =20 @@ -1273,8 +1274,10 @@ nvmet_fc_portentry_unbind(struct nvmet_fc_port_entry= *pe) unsigned long flags; =20 spin_lock_irqsave(&nvmet_fc_tgtlock, flags); - if (pe->tgtport) + if (pe->tgtport) { + nvmet_fc_tgtport_put(pe->tgtport); pe->tgtport->pe =3D NULL; + } list_del(&pe->pe_list); spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); } @@ -1292,8 +1295,10 @@ nvmet_fc_portentry_unbind_tgt(struct nvmet_fc_tgtpor= t *tgtport) =20 spin_lock_irqsave(&nvmet_fc_tgtlock, flags); pe =3D tgtport->pe; - if (pe) + if (pe) { + nvmet_fc_tgtport_put(pe->tgtport); pe->tgtport =3D NULL; + } tgtport->pe =3D NULL; spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); } @@ -1316,6 +1321,9 @@ nvmet_fc_portentry_rebind_tgt(struct nvmet_fc_tgtport= *tgtport) list_for_each_entry(pe, &nvmet_fc_portentry_list, pe_list) { if (tgtport->fc_target_port.node_name =3D=3D pe->node_name && tgtport->fc_target_port.port_name =3D=3D pe->port_name) { + if (!nvmet_fc_tgtport_get(tgtport)) + continue; + WARN_ON(pe->tgtport); tgtport->pe =3D pe; pe->tgtport =3D tgtport; @@ -2887,12 +2895,17 @@ nvmet_fc_add_port(struct nvmet_port *port) list_for_each_entry(tgtport, &nvmet_fc_target_list, tgt_list) { if ((tgtport->fc_target_port.node_name =3D=3D traddr.nn) && (tgtport->fc_target_port.port_name =3D=3D traddr.pn)) { + if (!nvmet_fc_tgtport_get(tgtport)) + continue; + /* a FC port can only be 1 nvmet port id */ if (!tgtport->pe) { nvmet_fc_portentry_bind(tgtport, pe, port); ret =3D 0; } else ret =3D -EALREADY; + + nvmet_fc_tgtport_put(tgtport); break; } } @@ -2908,11 +2921,21 @@ static void nvmet_fc_remove_port(struct nvmet_port *port) { struct nvmet_fc_port_entry *pe =3D port->priv; + struct nvmet_fc_tgtport *tgtport =3D NULL; + unsigned long flags; + + spin_lock_irqsave(&nvmet_fc_tgtlock, flags); + if (pe->tgtport && nvmet_fc_tgtport_get(pe->tgtport)) + tgtport =3D pe->tgtport; + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); =20 nvmet_fc_portentry_unbind(pe); =20 - /* terminate any outstanding associations */ - __nvmet_fc_free_assocs(pe->tgtport); + if (tgtport) { + /* terminate any outstanding associations */ + __nvmet_fc_free_assocs(tgtport); + nvmet_fc_tgtport_put(tgtport); + } =20 kfree(pe); } @@ -2921,10 +2944,21 @@ static void nvmet_fc_discovery_chg(struct nvmet_port *port) { struct nvmet_fc_port_entry *pe =3D port->priv; - struct nvmet_fc_tgtport *tgtport =3D pe->tgtport; + struct nvmet_fc_tgtport *tgtport =3D NULL; + unsigned long flags; + + spin_lock_irqsave(&nvmet_fc_tgtlock, flags); + if (pe->tgtport && nvmet_fc_tgtport_get(pe->tgtport)) + tgtport =3D pe->tgtport; + spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags); + + if (!tgtport) + return; =20 if (tgtport && tgtport->ops->discovery_event) tgtport->ops->discovery_event(&tgtport->fc_target_port); + + nvmet_fc_tgtport_put(tgtport); } =20 static ssize_t --=20 2.49.0 From nobody Fri Dec 19 06:18:10 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 7F75718C031 for ; Wed, 23 Apr 2025 13:22:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414552; cv=none; b=oQovCElBfh+8iplKVmr6VlUDLBNoNjWIkMQUgGlCgxafgTepr5nZAAga0JRIJmhWI0F0CqQ6XIJqZGFFgqI41wOcRDZ/R1Wrv+WQMPsWPiBYmwAp94RZF503Bnt2BE+j1A1dL4WA6RaUhPX3Pr1noPkoc3hfUCaQOar1cQpWDsY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745414552; c=relaxed/simple; bh=/cLfvZPaGaKqTv5rGWJ2lfAMdaEHdJl7YqBZZkkNksw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=stfQKsuQLVVUHAuRhP7zW3bICVz2VeDk4YUXCcG/cETMtviLHPS/eCjrNrfwgST4z+V9G7Blq8R5uhyogjFiIt4OaaE+kv/D4VJ//qTl4qaZ6JCAV8HKwW29wMpjxIUp+PdQ95iiyD13s5a3S1Wx5xhJqhE1hwSHIRfH+jBjNYA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TLImKzZ/; 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="TLImKzZ/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1C349C4CEE2; Wed, 23 Apr 2025 13:22:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745414551; bh=/cLfvZPaGaKqTv5rGWJ2lfAMdaEHdJl7YqBZZkkNksw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=TLImKzZ/tQWXbn4ODEiwVugd6vBNT48iqotSK9rMkKp8Debxfj5BAEh5JBOCl4PP3 JRqRyITxPTX4JUmrEqhZUZ61fl0wrDdLGvEifWBUCzZZFiWb0aVrNNYKq5wjr6yImo UjZyn9xXa/m8FhGH87jXr3Pu8ZQ9Hzrr5DR8Zo9WmHivVkuOITZ5Z63aSGW4fu87kT 3xKwkpuZAsn8OGsn3DJbZrGseIHXH0dZAUH4IitrxODWQb5mkqZq9UJRT4k3nufm0C kCT8EgypF24kVtPnYLLEMaAByPw4/fnXdKTF+9vf0XqKQDT8ExixZJe5k1IeCxBprt jzy79wc0wEyyQ== From: Daniel Wagner Date: Wed, 23 Apr 2025 15:21:57 +0200 Subject: [PATCH v5 14/14] nvme-fc: do not reference lsrsp after failure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250423-nvmet-fcloop-v5-14-3d7f968728a5@kernel.org> References: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> In-Reply-To: <20250423-nvmet-fcloop-v5-0-3d7f968728a5@kernel.org> To: James Smart , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni Cc: Hannes Reinecke , Keith Busch , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Daniel Wagner X-Mailer: b4 0.14.2 The lsrsp object is maintained by the LLDD. The lifetime of the lsrsp object is implicit. Because there is no explicit cleanup/free call into the LLDD, it is not safe to assume after xml_rsp_fails, that the lsrsp is still valid. The LLDD could have freed the object already. With the recent changes how fcloop tracks the resources, this is the case. Thus don't access lsrsp after xml_rsp_fails. Signed-off-by: Daniel Wagner --- drivers/nvme/host/fc.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index 2257c3c96dd2da11097d2d0d4a5bb8ece1bebc6a..fdafa3e9e66fa9b8954209efa14= d3b207cb8653c 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c @@ -1410,9 +1410,8 @@ nvme_fc_xmt_disconnect_assoc(struct nvme_fc_ctrl *ctr= l) } =20 static void -nvme_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp) +nvme_fc_xmt_ls_rsp_free(struct nvmefc_ls_rcv_op *lsop) { - struct nvmefc_ls_rcv_op *lsop =3D lsrsp->nvme_fc_private; struct nvme_fc_rport *rport =3D lsop->rport; struct nvme_fc_lport *lport =3D rport->lport; unsigned long flags; @@ -1433,6 +1432,14 @@ nvme_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp) nvme_fc_rport_put(rport); } =20 +static void +nvme_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp) +{ + struct nvmefc_ls_rcv_op *lsop =3D lsrsp->nvme_fc_private; + + nvme_fc_xmt_ls_rsp_free(lsop); +} + static void nvme_fc_xmt_ls_rsp(struct nvmefc_ls_rcv_op *lsop) { @@ -1450,7 +1457,7 @@ nvme_fc_xmt_ls_rsp(struct nvmefc_ls_rcv_op *lsop) dev_warn(lport->dev, "LLDD rejected LS RSP xmt: LS %d status %d\n", w0->ls_cmd, ret); - nvme_fc_xmt_ls_rsp_done(lsop->lsrsp); + nvme_fc_xmt_ls_rsp_free(lsop); return; } } --=20 2.49.0