From nobody Fri Dec 19 07:55:04 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