From nobody Mon Apr 20 17:20:25 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 4fzsgs54JFz6ZCXg for ; Mon, 20 Apr 2026 17:20:25 +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 4fzsgs2bSNz3VP2 for ; Mon, 20 Apr 2026 17:20:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776705625; 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=a+UzqaZN7mUQf2g6ERyZaW0Gcs2x+JSuwqc0p0BBXkc=; b=nNxyojbrvqprjMBDotlOYAqotQiX3naxQLe/n2ZmTgFL0kOiGU1K/iIntTET26gqtX7SyL yAz/e91JVnj/Zf+WuMYLEH4cSEp3t3ab2mh16+oeZasdoXyql5SNJT5GwX5B+qBTdjWgqp 7mxIWNVZGxVzfoErrHS3AaNjHeIYO4tZ15PGzjOBKuiYTBEojIr75O6baUF7EU+tggzQlH bDN20NP6d9lMOJfWMyXHLt2XFMMcKMIU1+rw52//r0Ye5Hm622wRhkA52O+EIJlAM3T8EG Sr+9M6sm5ZYSm9gtY3iA5yOxxBTHuUKcUFao8Xo30WdgyGCGKGBGicz5il7m+g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776705625; a=rsa-sha256; cv=none; b=hCl2B51hNDqpbrlpP3giez3XsTQApkLp/ZUZr53KIqrzQSdr+Jd6Yb3vg/lzWKGSHMAhOa Uh6quqUW7foD1iA8YsXLh/BLQ0nISK8BYa08itnraaeFjDmw7A9ZK9e2x35tNGKxSxETG4 eSy3bxNbVXwDkE2ZiOQdkaj6nKKQxA4j6Ix8fq1LqGhcmE3Ci5brDARLHwl/u+ck8vQfwl LHqLZ2BH0G7MWX4mK6eqEhqlGN5iTndvj/9ZArqMQnuIxzQZW1Qsx7cbBLHuBwJqyV1AUi 3OykZlrc/c/oAyo+IwcofqvUNrFf8TPAYv0yOj1rjI9/AStIztjlMqis0c4eDw== 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=1776705625; 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=a+UzqaZN7mUQf2g6ERyZaW0Gcs2x+JSuwqc0p0BBXkc=; b=QyTk5cLRhiNQSFtt9kkHch6KWoZ4OWN/EjJDa6Qxh+vVEznP9SLgLfGDLg0UrXGDoCq9zt 9YfrbunXwAAkz8YruC2xS42NuQL66gXeDaxBP3+bg+i2AMQzsnLUtBlAP48eBXxqkNrfmw xBCWJAz8Xgbg+Xm9VRMTBd/DQFcB9H3yQe+ULWTyMp7VWmqnu5v0qUPxsHjpT3nU4XC6GP mIeGsjgWN9yYudzPyBTFTgZr5ZIkynphRI20a1hIPPwvUfctl1zxmathjlqvDWuPGwN8GT n5yA0M+FsELIC3kbWZFfoouRjFlZvPGk4jmsJLFHJQb0ErcNZiAfD1hN/N3d+g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fzsgs26wtz15jR for ; Mon, 20 Apr 2026 17:20:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3f591 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 20 Apr 2026 17:20:25 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 7bb2b3801554 - main - ctld: Support multiple physical ports in a target 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: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7bb2b3801554a58039ed9d1fd05b65ce24c6c661 Auto-Submitted: auto-generated Date: Mon, 20 Apr 2026 17:20:25 +0000 Message-Id: <69e66059.3f591.5a7c02a@gitrepo.freebsd.org> The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=7bb2b3801554a58039ed9d1fd05b65ce24c6c661 commit 7bb2b3801554a58039ed9d1fd05b65ce24c6c661 Author: John Baldwin AuthorDate: 2026-04-20 17:19:25 +0000 Commit: John Baldwin CommitDate: 2026-04-20 17:19:25 +0000 ctld: Support multiple physical ports in a target PR: 293076 Reported by: Ken J. Thomson Reviewed by: asomers Fixes: 969876fcee57 ("ctld: parse config file independently of getting kernel info") Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D55767 --- usr.sbin/ctld/conf.cc | 4 +-- usr.sbin/ctld/conf.h | 2 +- usr.sbin/ctld/ctld.cc | 72 ++++++++++++++++++++++++----------------------- usr.sbin/ctld/ctld.hh | 11 ++++---- usr.sbin/ctld/parse.y | 2 +- usr.sbin/ctld/uclparse.cc | 2 +- 6 files changed, 47 insertions(+), 46 deletions(-) diff --git a/usr.sbin/ctld/conf.cc b/usr.sbin/ctld/conf.cc index 56a149a58a25..a2c00525826b 100644 --- a/usr.sbin/ctld/conf.cc +++ b/usr.sbin/ctld/conf.cc @@ -404,9 +404,9 @@ target_set_auth_type(const char *type) } bool -target_set_physical_port(const char *pport) +target_add_physical_port(const char *pport) { - return (target->set_physical_port(pport)); + return (target->add_physical_port(pport)); } bool diff --git a/usr.sbin/ctld/conf.h b/usr.sbin/ctld/conf.h index 642c8f234d30..7eaee4f9871c 100644 --- a/usr.sbin/ctld/conf.h +++ b/usr.sbin/ctld/conf.h @@ -83,11 +83,11 @@ bool target_add_chap_mutual(const char *user, const char *secret, bool target_add_initiator_name(const char *name); bool target_add_initiator_portal(const char *addr); bool target_add_lun(u_int id, const char *name); +bool target_add_physical_port(const char *pport); bool target_add_portal_group(const char *pg_name, const char *ag_name); bool target_set_alias(const char *alias); bool target_set_auth_group(const char *name); bool target_set_auth_type(const char *type); -bool target_set_physical_port(const char *pport); bool target_set_redirection(const char *addr); bool target_start_lun(u_int id); diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index a6c80a3604c3..4ff8d30bb49f 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -1082,9 +1082,9 @@ kports::has_port(std::string_view name) } struct pport * -kports::find_port(std::string_view name) +kports::find_port(const std::string &name) { - auto it = pports.find(std::string(name)); + auto it = pports.find(name); if (it == pports.end()) return (nullptr); return (&it->second); @@ -1383,14 +1383,16 @@ target::set_auth_type(const char *type) } bool -target::set_physical_port(std::string_view pport) +target::add_physical_port(std::string_view pport) { - if (!t_pport.empty()) { - log_warnx("cannot set multiple physical ports for target " - "\"%s\"", name()); - return (false); + for (const auto &s : t_pports) { + if (s == pport) { + log_warnx("duplicate physical port \"%s\" for target " + "\"%s\"", s.c_str(), name()); + return (false); + } } - t_pport = pport; + t_pports.emplace_back(pport); return (true); } @@ -2619,36 +2621,36 @@ conf::add_pports(struct kports &kports) for (auto &kv : conf_targets) { struct target *targ = kv.second.get(); - if (!targ->has_pport()) - continue; + 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()); + return (false); + } - ret = sscanf(targ->pport(), "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()); - return (false); + continue; } - continue; - } - - pp = kports.find_port(targ->pport()); - if (pp == NULL) { - log_warnx("unknown port \"%s\" for %s", - targ->pport(), targ->label()); - return (false); - } - if (pp->linked()) { - log_warnx("can't link port \"%s\" to %s, " - "port already linked to some target", - targ->pport(), targ->label()); - return (false); - } - if (!add_port(targ, pp)) { - log_warnx("can't link port \"%s\" to %s", - targ->pport(), targ->label()); - return (false); + 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); + } } } return (true); diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh index 3bf18f6a32c0..11bda5f25f8c 100644 --- a/usr.sbin/ctld/ctld.hh +++ b/usr.sbin/ctld/ctld.hh @@ -381,17 +381,16 @@ struct target { virtual ~target() = default; bool has_alias() const { return !t_alias.empty(); } - bool has_pport() const { return !t_pport.empty(); } bool has_redirection() const { return !t_redirection.empty(); } const char *alias() const { return t_alias.c_str(); } const char *name() const { return t_name.c_str(); } const char *label() const { return t_label.c_str(); } - const char *pport() const { return t_pport.c_str(); } bool private_auth() const { return t_private_auth; } const char *redirection() const { return t_redirection.c_str(); } struct auth_group *auth_group() const { return t_auth_group.get(); } const std::list &ports() const { return t_ports; } + const std::list &pports() const { return t_pports; } const struct lun *lun(int idx) const { return t_luns[idx]; } bool add_chap(const char *user, const char *secret); @@ -403,12 +402,12 @@ struct target { virtual bool add_initiator_portal(const char *) { return false; } virtual bool add_lun(u_int, const char *) { return false; } virtual bool add_namespace(u_int, const char *) { return false; } + bool add_physical_port(std::string_view pport); virtual bool add_portal_group(const char *pg_name, const char *ag_name) = 0; bool set_alias(std::string_view alias); bool set_auth_group(const char *ag_name); bool set_auth_type(const char *type); - bool set_physical_port(std::string_view pport); bool set_redirection(const char *addr); virtual struct lun *start_lun(u_int) { return nullptr; } virtual struct lun *start_namespace(u_int) { return nullptr; } @@ -433,8 +432,8 @@ protected: std::string t_label; std::string t_alias; std::string t_redirection; - /* Name of this target's physical port, if any, i.e. "isp0" */ - std::string t_pport; + /* Names of this target's physical ports, e.g. "isp0" */ + std::list t_pports; bool t_private_auth = false; }; @@ -582,7 +581,7 @@ private: struct kports { bool add_port(std::string &name, uint32_t ctl_port); bool has_port(std::string_view name); - struct pport *find_port(std::string_view name); + struct pport *find_port(const std::string &name); private: std::unordered_map pports; diff --git a/usr.sbin/ctld/parse.y b/usr.sbin/ctld/parse.y index 5725c16b459a..05171d3aa159 100644 --- a/usr.sbin/ctld/parse.y +++ b/usr.sbin/ctld/parse.y @@ -774,7 +774,7 @@ target_port: PORT STR { bool ok; - ok = target_set_physical_port($2); + ok = target_add_physical_port($2); free($2); if (!ok) return (1); diff --git a/usr.sbin/ctld/uclparse.cc b/usr.sbin/ctld/uclparse.cc index 8a62636ffec6..0c6b2af8d741 100644 --- a/usr.sbin/ctld/uclparse.cc +++ b/usr.sbin/ctld/uclparse.cc @@ -1255,7 +1255,7 @@ uclparse_target(const char *name, const ucl::Ucl &top) return false; } - if (!target_set_physical_port(obj.string_value().c_str())) + if (!target_add_physical_port(obj.string_value().c_str())) return false; }