From nobody Tue Jun 23 16:28:41 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 4gl9Vd4FX4z6hhRP for ; Tue, 23 Jun 2026 16:28:41 +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 "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gl9Vd1hLnz3NWW for ; Tue, 23 Jun 2026 16:28:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782232121; 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=nz3HcNvW/pqstXKjKwaaGyX3YA2F9fvdJ1URgTCkYsQ=; b=Z3NVlJStf0YDL4y3Leu3uHYGMYIHuHdgGWgetqK7GubAadFMVzrYjyEhFPK2i/xIdY8ETl b1AFmP1sSXapSfysfffNPkbdzBiJX6ZmlWF2pREPyZ2qAKR1GEY8k4XI0uIzMKXujSDRNK 2Bk6P3EGFBJZSTmYpHeTmOvWiZPAYhr1FEq8BO3KGrWbw7SRPRTT+yYkRgmLoYScdxfutb ggTROnwevnoGz54CNqg5ZIXaI9193z5Wm+lcHNPYaO+5N7gpjiJjzfjmX5GIJPJtYUw8cg rD6JFJ0nGpCLxE1jYV5WXivNqbJC01AFP4i+z3c/SrOE6Ft7TK91oWAxRNklYQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782232121; a=rsa-sha256; cv=none; b=Og5+TfmrhMjKqFq0SIbfoqmpBh/P4jLi2rNPLEIu4Iyn3/7zTmdLERaggl5fPqdHo0zS9N v34vJ0JvTXqfUOQnVB7UYQIpTLOeNSzXwSL+wlCNEoxbfgN6QuifUMZyBRPWyQXrXQa0WM OgN4t7TCw3bo1pSUC6xBggPF4g5rn+Ap98BSejLXhXXHR0ACZ0lLf/v2lJ2hlKJDgbq8PB z965MCiAd16dHZ9hBmeF3BGOzZ5uTSwjKQVquQRp74MzcksZJVqbtTnyUgWjnhlEo86eUu 2qasqhBqgepN4XhGhiNblPCYTBO+ZFfHRxWjoY0BizMNJeXSK0ULSf8Wx4992w== 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=1782232121; 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=nz3HcNvW/pqstXKjKwaaGyX3YA2F9fvdJ1URgTCkYsQ=; b=Qy/10WTveDPPy4JC591gCpHu9wdhrK8NaLZ6i5qUwpPGMTrWRtwaIY43NQ8CbyeBKIyunw me4EjR9Kc+wLF3JqKNa0uhLBo/oaBB1F6pSdZ6aT2Qb0XvCakHQDVSBfy0+63fg3B8V5xZ Y+xHrv7Nv7oWFo7b3/8uXs+R4SCW39iugclefBD/iYKUxrEwwJfZMqVo388nGebdVsqRBS I9EMxddhSlNeAmxm7H99npUMwDBYQl7q+2UCMt9w/kpz/apirIaTN2iPeS8/6bubLzLKUm W0vjbHqv4wkFVVEtL1L2g4Ead6DkNfbHAbmna4P1HXTJUa6UtMqB2KdK8M1WOQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gl9Vd0gqKzhmG for ; Tue, 23 Jun 2026 16:28:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 26e28 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 23 Jun 2026 16:28:41 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 9de84611ea16 - stable/15 - ctld: Refactor ioctl port handling 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 List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 9de84611ea16bd0873564a9f0f5cca9b92def53d Auto-Submitted: auto-generated Date: Tue, 23 Jun 2026 16:28:41 +0000 Message-Id: <6a3ab439.26e28.bbbead5@gitrepo.freebsd.org> The branch stable/15 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=9de84611ea16bd0873564a9f0f5cca9b92def53d commit 9de84611ea16bd0873564a9f0f5cca9b92def53d Author: John Baldwin AuthorDate: 2026-05-27 20:57:23 +0000 Commit: John Baldwin CommitDate: 2026-06-23 16:17:31 +0000 ctld: Refactor ioctl port handling - Normalize ioctl port names when the port name is first added to the configuration. This can catch potential duplicate port names sooner and helps with other parts of this change. - When recognizing existing ioctl ports, always expand the name to include the physical and virtual port numbers. This permits binding ioctl/0/0 or ioctl/1/0 to a target, for example. - When adding physical ports to a target, first check for an existing kernel port to reuse. This handles both ioctl and non-ioctl ports and removes the need for the conf::add_port method for ioctl ports to check in kports. - If an existing kport isn't found when adding physical ports, check to see if the port name is an ioctl port. If so, call conf::add_port to add an ioctl port. This add_port method overload is now simpler as it always creates a new port. NB: The kernel_port class handles CTL ports that already existed before ctld started including existing ioctl ports, whereas the ioctl_port class handles ioctl ports that are created and completely managed by ctld. This was true before this change but is perhaps more obvious after this change. Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D57092 (cherry picked from commit caef3c50ac067ca751ba4950f310821a521ebf57) --- usr.sbin/ctld/ctld.cc | 80 ++++++++++++++++++++++++++++++------------------- usr.sbin/ctld/ctld.hh | 2 +- usr.sbin/ctld/kernel.cc | 5 +++- 3 files changed, 54 insertions(+), 33 deletions(-) diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index 9bdf15976911..8b99bde14911 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -1180,16 +1180,8 @@ conf::add_port(struct target *target, struct pport *pp) } bool -conf::add_port(struct kports &kports, struct target *target, int pp, int vp) +conf::add_port(struct target *target, const std::string &pname, int pp, int vp) { - struct pport *pport; - - std::string pname = freebsd::stringf("ioctl/%d/%d", pp, vp); - - pport = kports.find_port(pname); - if (pport != NULL) - return (add_port(target, pport)); - std::string name = pname + "-" + target->name(); const auto &pair = conf_ports.try_emplace(name, std::make_unique(target, pp, vp)); @@ -1387,6 +1379,19 @@ target::set_auth_type(const char *type) bool target::add_physical_port(std::string_view pport) { + /* Normalize ioctl port names. */ + std::string pname; + if (pport.compare(0, strlen("ioctl/"), "ioctl/") == 0) { + int ret, pp, vp; + + pname = std::string(pport); + ret = sscanf(pname.c_str(), "ioctl/%d/%d", &pp, &vp); + if (ret == 2) { + pname = freebsd::stringf("ioctl/%d/%d", pp, vp); + pport = pname; + } + } + for (const auto &s : t_pports) { if (s == pport) { log_warnx("duplicate physical port \"%s\" for target " @@ -2643,35 +2648,48 @@ conf::add_pports(struct kports &kports) struct target *targ = kv.second.get(); for (const auto &pport : targ->pports()) { - ret = sscanf(pport.c_str(), "ioctl/%d/%d", &i_pp, - &i_vp); - if (ret > 0) { - if (!add_port(kports, targ, i_pp, i_vp)) { - log_warnx("can't create new ioctl port " - "for %s", targ->label()); + /* + * If this port is already present in the + * kernel, reuse the existing port. + */ + pp = kports.find_port(pport); + if (pp != nullptr) { + if (pp->linked()) { + log_warnx("can't link port \"%s\" to " + "%s, port already linked to some " + "target", pport.c_str(), + targ->label()); return (false); } + if (!add_port(targ, pp)) { + log_warnx( + "can't link port \"%s\" to %s", + pport.c_str(), targ->label()); + return (false); + } continue; } - pp = kports.find_port(pport); - if (pp == NULL) { - log_warnx("unknown port \"%s\" for %s", - pport.c_str(), targ->label()); - return (false); - } - if (pp->linked()) { - log_warnx("can't link port \"%s\" to %s, " - "port already linked to some target", - pport.c_str(), targ->label()); - return (false); - } - if (!add_port(targ, pp)) { - log_warnx("can't link port \"%s\" to %s", - pport.c_str(), targ->label()); - return (false); + /* + * If this port is an ioctl port, create a new + * port. + */ + ret = sscanf(pport.c_str(), "ioctl/%d/%d", &i_pp, + &i_vp); + if (ret == 2) { + if (!add_port(targ, pport, i_pp, i_vp)) { + log_warnx("can't create new port %s " + "for %s", pport.c_str(), + targ->label()); + return (false); + } + continue; } + + log_warnx("unknown port \"%s\" for %s", + pport.c_str(), targ->label()); + return (false); } } return (true); diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh index 7ae033804157..8d63de06dd80 100644 --- a/usr.sbin/ctld/ctld.hh +++ b/usr.sbin/ctld/ctld.hh @@ -487,7 +487,7 @@ struct conf { bool add_port(struct target *target, struct portal_group *pg, uint32_t ctl_port); bool add_port(struct target *target, struct pport *pp); - bool add_port(struct kports &kports, struct target *target, int pp, + bool add_port(struct target *target, const std::string &pname, int pp, int vp); bool add_pports(struct kports &kports); diff --git a/usr.sbin/ctld/kernel.cc b/usr.sbin/ctld/kernel.cc index 111c98e5026a..ef7ef87af090 100644 --- a/usr.sbin/ctld/kernel.cc +++ b/usr.sbin/ctld/kernel.cc @@ -549,7 +549,10 @@ conf_new_from_kernel(struct kports &kports) continue; std::string name = port.port_name; - if (port.pp != 0 || port.vp != 0) { + if (port.port_frontend == "ioctl") + name += "/" + std::to_string(port.pp) + "/" + + std::to_string(port.vp); + else if (port.pp != 0 || port.vp != 0) { name += "/" + std::to_string(port.pp); if (port.vp != 0) name += "/" + std::to_string(port.vp);