From nobody Tue Apr 28 20:52:17 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4g4t0f10BYz6c57S for ; Tue, 28 Apr 2026 20:52:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g4t0d4hy8z3Mqt for ; Tue, 28 Apr 2026 20:52:17 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777409537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=zBz7ZEXa3Hap0Vz/6NSRSlOYnxC5ViJoqHkS7eyjvZc=; b=eiaDFjIxml1EV/OeLBm1vquGvh7B2odW19+59YX110TDFmVOTFVP0D0RhHOAA5AzZWvQGi WChd1oYwn4QBdOkEKdecu29iJMT9W4j4oa2K2oiRBvOAF9mdT4BzsiL6tgnavtxlndxUB6 81pOsg4vWz2e015Ar4ZnTrfhFaffLWzjnwrbikiphXU58wXNzB/Bl7WlUO9neFoVXYCYOd bQTjc8X/r8fO4iGBzjvtGJo6DwD3Lqag1NhnB3CXLzeplW3l++6+5/4NuRuTJ8fJ2E8ow5 5n4X5uSkGzrcS8spcQlMV1SDUoHQQ64kLifn9Ay+pUg2tpuNhmiKbim6MN+uXA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777409537; a=rsa-sha256; cv=none; b=tqT7j8/LDwPnb/jJwqH5PlMCLFKntbbq3DcEWSiE7UUXjSi/+Ca7+LVN/NrtUl21/hR+Er r02AwDLTCNQeFr+PEpb1/XBNhqXZ+aznUXRVYSSt/S3Bmq8/yPEjySYtSm+9d46PvWHG6S NESqa0IlpERu4Czy+jYRVzkGnkr5MGP3z4eJw8vwaPDxylnzmhpmiMIY/q1HDCQavmlnNA cuAeNXwB2ft3LtCOmaGK15QdjgSX0gB6WB2m5OybdOyE4yM4QFWNo/eIYEpRjFcNHQ3GpC LLnXrXvk6Mu0uoN1dnfqkaZ65qzJnhsm7Sj54bfKL5rSPHOpIosHE4JMqc0jvg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777409537; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=zBz7ZEXa3Hap0Vz/6NSRSlOYnxC5ViJoqHkS7eyjvZc=; b=FxLCbuUsqUeVH/5jspmNpwAbsxEIsAvS1OnW7ReL6PQwF+Z8gOupy4sA4Z45SWE84BcRkY YlTMvlfwzAcFxIE/lvVQYoNU9bmd5vK3GiEcphr+dMnVlrP/mfJDRW0hxHo7gjrnXnh5lb +MQKxWXHXdB6R1KcwCpSpEr8jS/eVc2CEY6n8onTUve0L8WR9lHvlkT4bK431znjaqNrKg d7mOihZlzMX6AxsQfCWdtiURLKnNzzX3Zmn8daCIcwcWU5WBZvqs8I7bM+coqfQ09uidCt Dl9oTa8YJxGpWGVSvVFg/aojwmP0n9EOHAspomt7rzKB2rpMNImIYf+xoMtynw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g4t0d4Jd7z18yW for ; Tue, 28 Apr 2026 20:52:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3c301 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 28 Apr 2026 20:52:17 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kyle Evans Subject: git: d9c0594191f5 - main - ctld: kernel-sourced portal groups are not dummies List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d9c0594191f5c45d7f3c737350321ee59bfce9bf Auto-Submitted: auto-generated Date: Tue, 28 Apr 2026 20:52:17 +0000 Message-Id: <69f11e01.3c301.30f0fa83@gitrepo.freebsd.org> The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=d9c0594191f5c45d7f3c737350321ee59bfce9bf commit d9c0594191f5c45d7f3c737350321ee59bfce9bf Author: Kyle Evans AuthorDate: 2026-04-28 20:51:50 +0000 Commit: Kyle Evans CommitDate: 2026-04-28 20:51:50 +0000 ctld: kernel-sourced portal groups are not dummies The current and historical versions of ctld would flag our initial set of kernel ports as dummies, because their portal groups were empty since portals come from the configuration on-disk. As a result, we would never try to remove a kernel port at startup that didn't exist in the configuration (possibly a feature if you wanted concurrent ctld(8)), and we would always try to port->kernel_add() on ports in the configuration (even if they actually did have an existing kernel port). Flag these portal groups as kernel groups so that we avoid trying to add ports that already exist. It may be the case that the kernel_remove() loop in conf::apply() needs to do something other than the current `oldport->is_dummy()` to avoid removing ports that it isn't supposed to be managing, but that wuld also seem to apply to LUNs that would be removed today. Reviewed by: jhb Differential Revision: https://reviews.freebsd.org/D51782 --- usr.sbin/ctld/ctld.cc | 15 +++++++++++++++ usr.sbin/ctld/ctld.hh | 2 ++ usr.sbin/ctld/kernel.cc | 4 ++++ 3 files changed, 21 insertions(+) diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index cf1dde93b86d..8aaec41e8487 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -578,9 +578,18 @@ conf::find_transport_group(std::string_view name) return (it->second.get()); } +/* + * Foreign portal groups (which only redirect to other targets), and portal + * groups without any active portals are considered dummies and ports belonging + * to such groups are ignored. However, portal groups that exist in the kernel + * prior to ctld starting will contain real ports but no portals, so these are + * never considered dummies. + */ bool portal_group::is_dummy() const { + if (pg_kernel) + return (false); if (pg_foreign) return (true); if (pg_portals.empty()) @@ -697,6 +706,12 @@ portal_group::set_foreign() pg_foreign = true; } +void +portal_group::set_kernel() +{ + pg_kernel = true; +} + bool portal_group::set_offload(const char *offload) { diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh index 61213119f911..45590ada4111 100644 --- a/usr.sbin/ctld/ctld.hh +++ b/usr.sbin/ctld/ctld.hh @@ -220,6 +220,7 @@ struct portal_group { bool set_dscp(u_int dscp); virtual bool set_filter(const char *str) = 0; void set_foreign(); + void set_kernel(); bool set_offload(const char *offload); bool set_pcp(u_int pcp); bool set_redirection(const char *addr); @@ -248,6 +249,7 @@ protected: enum discovery_filter pg_discovery_filter = discovery_filter::UNKNOWN; bool pg_foreign = false; + bool pg_kernel = false; bool pg_assigned = false; std::list pg_portals; std::unordered_map pg_ports; diff --git a/usr.sbin/ctld/kernel.cc b/usr.sbin/ctld/kernel.cc index 6b17ce60ac69..a6b0a79850ec 100644 --- a/usr.sbin/ctld/kernel.cc +++ b/usr.sbin/ctld/kernel.cc @@ -483,6 +483,8 @@ add_iscsi_port(struct kports &kports, struct conf *conf, log_warnx("Failed to add portal-group \"%s\"", pg_name); return; } + + pg->set_kernel(); } pg->set_tag(port.cfiscsi_portal_group_tag); if (!conf->add_port(targ, pg, port.port_id)) { @@ -520,6 +522,8 @@ add_nvmf_port(struct conf *conf, const struct cctl_port &port, tg_name); return; } + + pg->set_kernel(); } pg->set_tag(port.portid); if (!conf->add_port(targ, pg, port.port_id)) {