Page MenuHomeFreeBSD

D57092.diff
No OneTemporary

D57092.diff

diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh
--- a/usr.sbin/ctld/ctld.hh
+++ b/usr.sbin/ctld/ctld.hh
@@ -487,7 +487,7 @@
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/ctld.cc b/usr.sbin/ctld/ctld.cc
--- a/usr.sbin/ctld/ctld.cc
+++ b/usr.sbin/ctld/ctld.cc
@@ -1180,16 +1180,8 @@
}
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<ioctl_port>(target, pp, vp));
@@ -1387,6 +1379,19 @@
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 @@
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/kernel.cc b/usr.sbin/ctld/kernel.cc
--- a/usr.sbin/ctld/kernel.cc
+++ b/usr.sbin/ctld/kernel.cc
@@ -549,7 +549,10 @@
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);

File Metadata

Mime Type
text/plain
Expires
Thu, Jun 25, 3:49 AM (22 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34303180
Default Alt Text
D57092.diff (3 KB)

Event Timeline