From nobody Wed Dec 17 12:04:38 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