The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=888ec3a71912994e4585a6444962de691b56d5d6
commit 888ec3a71912994e4585a6444962de691b56d5d6 Author: John Baldwin <j...@freebsd.org> AuthorDate: 2025-08-04 19:38:07 +0000 Commit: John Baldwin <j...@freebsd.org> CommitDate: 2025-08-04 19:38:07 +0000 ctld: Convert struct conf to a C++ class - Various functions to add or lookup configuration objects are now methods of the conf class. - Use std::string and freebsd::pidfile for various members. - Rename the global set_timeout() to start_timer() to avoid shadowing conf::set_timeout() and also split out a separate stop_timer(). Sponsored by: Chelsio Communications Pull Request: https://github.com/freebsd/freebsd-src/pull/1794 --- usr.sbin/ctld/conf.cc | 63 ++---- usr.sbin/ctld/ctld.cc | 564 +++++++++++++++++++++++++++--------------------- usr.sbin/ctld/ctld.hh | 109 ++++++---- usr.sbin/ctld/kernel.cc | 28 +-- 4 files changed, 416 insertions(+), 348 deletions(-) diff --git a/usr.sbin/ctld/conf.cc b/usr.sbin/ctld/conf.cc index 81451009067c..2eae12c31d0c 100644 --- a/usr.sbin/ctld/conf.cc +++ b/usr.sbin/ctld/conf.cc @@ -70,48 +70,43 @@ conf_finish(void) bool isns_add_server(const char *addr) { - return (isns_new(conf, addr)); + return (conf->add_isns(addr)); } void conf_set_debug(int debug) { - conf->conf_debug = debug; + conf->set_debug(debug); } void conf_set_isns_period(int period) { - conf->conf_isns_period = period; + conf->set_isns_period(period); } void conf_set_isns_timeout(int timeout) { - conf->conf_isns_timeout = timeout; + conf->set_isns_timeout(timeout); } void conf_set_maxproc(int maxproc) { - conf->conf_maxproc = maxproc; + conf->set_maxproc(maxproc); } bool conf_set_pidfile_path(const char *path) { - if (conf->conf_pidfile_path != NULL) { - log_warnx("pidfile specified more than once"); - return (false); - } - conf->conf_pidfile_path = checked_strdup(path); - return (true); + return (conf->set_pidfile_path(path)); } void conf_set_timeout(int timeout) { - conf->conf_timeout = timeout; + conf->set_timeout(timeout); } bool @@ -148,22 +143,10 @@ auth_group_set_type(const char *type) bool auth_group_start(const char *name) { - /* - * Make it possible to redefine the default auth-group. but - * only once. - */ - if (strcmp(name, "default") == 0) { - if (conf->conf_default_ag_defined) { - log_warnx("duplicated auth-group \"default\""); - return (false); - } - - conf->conf_default_ag_defined = true; - auth_group = auth_group_find(conf, "default").get(); - return (true); - } - - auth_group = auth_group_new(conf, name); + if (strcmp(name, "default") == 0) + auth_group = conf->define_default_auth_group(); + else + auth_group = conf->add_auth_group(name); return (auth_group != nullptr); } @@ -176,22 +159,10 @@ auth_group_finish(void) bool portal_group_start(const char *name) { - /* - * Make it possible to redefine the default portal-group. but - * only once. - */ - if (strcmp(name, "default") == 0) { - if (conf->conf_default_pg_defined) { - log_warnx("duplicated portal-group \"default\""); - return (false); - } - - conf->conf_default_pg_defined = true; - portal_group = portal_group_find(conf, "default"); - return (true); - } - - portal_group = portal_group_new(conf, name); + if (strcmp(name, "default") == 0) + portal_group = conf->define_default_portal_group(); + else + portal_group = conf->add_portal_group(name); return (portal_group != NULL); } @@ -264,7 +235,7 @@ portal_group_set_tag(uint16_t tag) bool lun_start(const char *name) { - lun = lun_new(conf, name); + lun = conf->add_lun(name); return (lun != NULL); } @@ -331,7 +302,7 @@ lun_set_ctl_lun(uint32_t value) bool target_start(const char *name) { - target = target_new(conf, name); + target = conf->add_target(name); return (target != NULL); } diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc index 2aaba32ed101..d3106a00d417 100644 --- a/usr.sbin/ctld/ctld.cc +++ b/usr.sbin/ctld/ctld.cc @@ -96,29 +96,75 @@ usage(void) exit(1); } -struct conf * -conf_new(void) +void +conf::set_debug(int debug) { - struct conf *conf; + conf_debug = debug; +} - conf = new struct conf(); +void +conf::set_isns_period(int period) +{ + conf_isns_period = period; +} - conf->conf_isns_period = 900; - conf->conf_isns_timeout = 5; - conf->conf_debug = 0; - conf->conf_timeout = 60; - conf->conf_maxproc = 30; +void +conf::set_isns_timeout(int timeout) +{ + conf_isns_timeout = timeout; +} - return (conf); +void +conf::set_maxproc(int maxproc) +{ + conf_maxproc = maxproc; +} + +void +conf::set_timeout(int timeout) +{ + conf_timeout = timeout; +} + +bool +conf::set_pidfile_path(std::string_view path) +{ + if (!conf_pidfile_path.empty()) { + log_warnx("pidfile specified more than once"); + return (false); + } + conf_pidfile_path = path; + return (true); +} + +void +conf::open_pidfile() +{ + const char *path; + pid_t otherpid; + + assert(!conf_pidfile_path.empty()); + path = conf_pidfile_path.c_str(); + log_debugx("opening pidfile %s", path); + conf_pidfile = pidfile_open(path, 0600, &otherpid); + if (!conf_pidfile) { + if (errno == EEXIST) + log_errx(1, "daemon already running, pid: %jd.", + (intmax_t)otherpid); + log_err(1, "cannot open or create pidfile \"%s\"", path); + } } void -conf_delete(struct conf *conf) +conf::write_pidfile() { - assert(conf->conf_pidfh == NULL); + conf_pidfile.write(); +} - free(conf->conf_pidfile_path); - delete conf; +void +conf::close_pidfile() +{ + conf_pidfile.close(); } #ifdef ICL_KERNEL_PROXY @@ -393,9 +439,9 @@ auth_group::initiator_permitted(const struct sockaddr *sa) const } struct auth_group * -auth_group_new(struct conf *conf, const char *name) +conf::add_auth_group(const char *name) { - const auto &pair = conf->conf_auth_groups.try_emplace(name, + const auto &pair = conf_auth_groups.try_emplace(name, std::make_shared<auth_group>(freebsd::stringf("auth-group \"%s\"", name))); if (!pair.second) { @@ -406,11 +452,26 @@ auth_group_new(struct conf *conf, const char *name) return (pair.first->second.get()); } +/* + * Make it possible to redefine the default auth-group, but only once. + */ +struct auth_group * +conf::define_default_auth_group() +{ + if (conf_default_ag_defined) { + log_warnx("duplicated auth-group \"default\""); + return (nullptr); + } + + conf_default_ag_defined = true; + return (find_auth_group("default").get()); +} + auth_group_sp -auth_group_find(const struct conf *conf, const char *name) +conf::find_auth_group(std::string_view name) { - auto it = conf->conf_auth_groups.find(name); - if (it == conf->conf_auth_groups.end()) + auto it = conf_auth_groups.find(std::string(name)); + if (it == conf_auth_groups.end()) return {}; return (it->second); @@ -422,10 +483,10 @@ portal_group::portal_group(struct conf *conf, std::string_view name) } struct portal_group * -portal_group_new(struct conf *conf, const char *name) +conf::add_portal_group(const char *name) { - auto pair = conf->conf_portal_groups.try_emplace(name, - std::make_unique<portal_group>(conf, name)); + auto pair = conf_portal_groups.try_emplace(name, + std::make_unique<portal_group>(this, name)); if (!pair.second) { log_warnx("duplicated portal-group \"%s\"", name); return (nullptr); @@ -434,11 +495,27 @@ portal_group_new(struct conf *conf, const char *name) return (pair.first->second.get()); } +/* + * Make it possible to redefine the default portal-group, but only + * once. + */ +struct portal_group * +conf::define_default_portal_group() +{ + if (conf_default_pg_defined) { + log_warnx("duplicated portal-group \"default\""); + return (nullptr); + } + + conf_default_pg_defined = true; + return (find_portal_group("default")); +} + struct portal_group * -portal_group_find(struct conf *conf, const char *name) +conf::find_portal_group(std::string_view name) { - auto it = conf->conf_portal_groups.find(name); - if (it == conf->conf_portal_groups.end()) + auto it = conf_portal_groups.find(std::string(name)); + if (it == conf_portal_groups.end()) return (nullptr); return (it->second.get()); @@ -554,7 +631,7 @@ portal_group::set_discovery_auth_group(const char *ag_name) "\"%s\" specified more than once", name()); return (false); } - pg_discovery_auth_group = auth_group_find(pg_conf, ag_name); + pg_discovery_auth_group = pg_conf->find_auth_group(ag_name); if (pg_discovery_auth_group == nullptr) { log_warnx("unknown discovery-auth-group \"%s\" " "for portal-group \"%s\"", ag_name, name()); @@ -666,7 +743,7 @@ void portal_group::verify(struct conf *conf) { if (pg_discovery_auth_group == nullptr) { - pg_discovery_auth_group = auth_group_find(conf, "default"); + pg_discovery_auth_group = conf->find_auth_group("default"); assert(pg_discovery_auth_group != nullptr); } @@ -748,9 +825,9 @@ portal_group::close_sockets() } bool -isns_new(struct conf *conf, const char *addr) +conf::add_isns(const char *addr) { - if (conf->conf_isns.count(addr) > 0) { + if (conf_isns.count(addr) > 0) { log_warnx("duplicate iSNS address %s", addr); return (false); } @@ -766,10 +843,11 @@ isns_new(struct conf *conf, const char *addr) * those into multiple servers. */ - conf->conf_isns.emplace(addr, isns(addr, std::move(ai))); + conf_isns.emplace(addr, isns(addr, std::move(ai))); return (true); } + freebsd::fd_up isns::connect() { @@ -807,18 +885,18 @@ isns::send_request(int s, struct isns_req req) return (true); } -static struct isns_req -isns_register_request(struct conf *conf, const char *hostname) +struct isns_req +conf::isns_register_request(const char *hostname) { const struct portal_group *pg; isns_req req(ISNS_FUNC_DEVATTRREG, ISNS_FLAG_CLIENT, "register"); - req.add_str(32, conf->conf_first_target->name()); + req.add_str(32, conf_first_target->name()); req.add_delim(); req.add_str(1, hostname); req.add_32(2, 2); /* 2 -- iSCSI */ - req.add_32(6, conf->conf_isns_period); - for (const auto &kv : conf->conf_portal_groups) { + req.add_32(6, conf_isns_period); + for (const auto &kv : conf_portal_groups) { pg = kv.second.get(); if (!pg->assigned()) @@ -828,7 +906,7 @@ isns_register_request(struct conf *conf, const char *hostname) req.add_port(17, portal->ai()); } } - for (const auto &kv : conf->conf_targets) { + for (const auto &kv : conf_targets) { const struct target *target = kv.second.get(); req.add_str(32, target->name()); @@ -849,40 +927,39 @@ isns_register_request(struct conf *conf, const char *hostname) return (req); } -static struct isns_req -isns_check_request(struct conf *conf, const char *hostname) +struct isns_req +conf::isns_check_request(const char *hostname) { isns_req req(ISNS_FUNC_DEVATTRQRY, ISNS_FLAG_CLIENT, "check"); - req.add_str(32, conf->conf_first_target->name()); + req.add_str(32, conf_first_target->name()); req.add_str(1, hostname); req.add_delim(); req.add(2, 0, NULL); return (req); } -static struct isns_req -isns_deregister_request(struct conf *conf, const char *hostname) +struct isns_req +conf::isns_deregister_request(const char *hostname) { isns_req req(ISNS_FUNC_DEVDEREG, ISNS_FLAG_CLIENT, "deregister"); - req.add_str(32, conf->conf_first_target->name()); + req.add_str(32, conf_first_target->name()); req.add_delim(); req.add_str(1, hostname); return (req); } void -isns_register_targets(struct conf *conf, struct isns *isns, - struct conf *oldconf) +conf::isns_register_targets(struct isns *isns, struct conf *oldconf) { int error; char hostname[256]; - if (conf->conf_targets.empty() || conf->conf_portal_groups.empty()) + if (conf_targets.empty() || conf_portal_groups.empty()) return; - set_timeout(conf->conf_isns_timeout, false); + start_timer(conf_isns_timeout); freebsd::fd_up s = isns->connect(); if (!s) { - set_timeout(0, false); + stop_timer(); return; } error = gethostname(hostname, sizeof(hostname)); @@ -890,48 +967,48 @@ isns_register_targets(struct conf *conf, struct isns *isns, log_err(1, "gethostname"); if (oldconf == nullptr || oldconf->conf_first_target == nullptr) - oldconf = conf; - isns->send_request(s, isns_deregister_request(oldconf, hostname)); - isns->send_request(s, isns_register_request(conf, hostname)); + oldconf = this; + isns->send_request(s, oldconf->isns_deregister_request(hostname)); + isns->send_request(s, isns_register_request(hostname)); s.reset(); - set_timeout(0, false); + stop_timer(); } void -isns_check(struct conf *conf, struct isns *isns) +conf::isns_check(struct isns *isns) { int error; char hostname[256]; - if (conf->conf_targets.empty() || conf->conf_portal_groups.empty()) + if (conf_targets.empty() || conf_portal_groups.empty()) return; - set_timeout(conf->conf_isns_timeout, false); + start_timer(conf_isns_timeout); freebsd::fd_up s = isns->connect(); if (!s) { - set_timeout(0, false); + stop_timer(); return; } error = gethostname(hostname, sizeof(hostname)); if (error != 0) log_err(1, "gethostname"); - if (!isns->send_request(s, isns_check_request(conf, hostname))) { - isns->send_request(s, isns_deregister_request(conf, hostname)); - isns->send_request(s, isns_register_request(conf, hostname)); + if (!isns->send_request(s, isns_check_request(hostname))) { + isns->send_request(s, isns_deregister_request(hostname)); + isns->send_request(s, isns_register_request(hostname)); } s.reset(); - set_timeout(0, false); + stop_timer(); } void -isns_deregister_targets(struct conf *conf, struct isns *isns) +conf::isns_deregister_targets(struct isns *isns) { int error; char hostname[256]; - if (conf->conf_targets.empty() || conf->conf_portal_groups.empty()) + if (conf_targets.empty() || conf_portal_groups.empty()) return; - set_timeout(conf->conf_isns_timeout, false); + start_timer(conf_isns_timeout); freebsd::fd_up s = isns->connect(); if (!s) return; @@ -939,9 +1016,26 @@ isns_deregister_targets(struct conf *conf, struct isns *isns) if (error != 0) log_err(1, "gethostname"); - isns->send_request(s, isns_deregister_request(conf, hostname)); + isns->send_request(s, isns_deregister_request(hostname)); s.reset(); - set_timeout(0, false); + stop_timer(); +} + +void +conf::isns_schedule_update() +{ + if (!conf_isns.empty()) + start_timer((conf_isns_period + 2) / 3); +} + +void +conf::isns_update() +{ + stop_timer(); + for (auto &kv : conf_isns) + isns_check(&kv.second); + + isns_schedule_update(); } bool @@ -1012,12 +1106,11 @@ portal_group_port::clear_references() } bool -port_new(struct conf *conf, struct target *target, struct portal_group *pg, - auth_group_sp ag) +conf::add_port(struct target *target, struct portal_group *pg, auth_group_sp ag) { std::string name = freebsd::stringf("%s-%s", pg->name(), target->name()); - const auto &pair = conf->conf_ports.try_emplace(name, + const auto &pair = conf_ports.try_emplace(name, std::make_unique<portal_group_port>(target, pg, ag)); if (!pair.second) { log_warnx("duplicate port \"%s\"", name.c_str()); @@ -1028,12 +1121,12 @@ port_new(struct conf *conf, struct target *target, struct portal_group *pg, } bool -port_new(struct conf *conf, struct target *target, struct portal_group *pg, +conf::add_port(struct target *target, struct portal_group *pg, uint32_t ctl_port) { std::string name = freebsd::stringf("%s-%s", pg->name(), target->name()); - const auto &pair = conf->conf_ports.try_emplace(name, + const auto &pair = conf_ports.try_emplace(name, std::make_unique<portal_group_port>(target, pg, ctl_port)); if (!pair.second) { log_warnx("duplicate port \"%s\"", name.c_str()); @@ -1043,12 +1136,12 @@ port_new(struct conf *conf, struct target *target, struct portal_group *pg, return (true); } -static bool -port_new_pp(struct conf *conf, struct target *target, struct pport *pp) +bool +conf::add_port(struct target *target, struct pport *pp) { std::string name = freebsd::stringf("%s-%s", pp->name(), target->name()); - const auto &pair = conf->conf_ports.try_emplace(name, + const auto &pair = conf_ports.try_emplace(name, std::make_unique<kernel_port>(target, pp)); if (!pair.second) { log_warnx("duplicate port \"%s\"", name.c_str()); @@ -1059,9 +1152,8 @@ port_new_pp(struct conf *conf, struct target *target, struct pport *pp) return (true); } -static bool -port_new_ioctl(struct conf *conf, struct kports &kports, struct target *target, - int pp, int vp) +bool +conf::add_port(struct kports &kports, struct target *target, int pp, int vp) { struct pport *pport; @@ -1069,10 +1161,10 @@ port_new_ioctl(struct conf *conf, struct kports &kports, struct target *target, pport = kports.find_port(pname); if (pport != NULL) - return (port_new_pp(conf, target, pport)); + return (add_port(target, pport)); std::string name = pname + "-" + target->name(); - const auto &pair = conf->conf_ports.try_emplace(name, + const auto &pair = conf_ports.try_emplace(name, std::make_unique<ioctl_port>(target, pp, vp)); if (!pair.second) { log_warnx("duplicate port \"%s\"", name.c_str()); @@ -1092,7 +1184,7 @@ portal_group::find_port(std::string_view target) const } struct target * -target_new(struct conf *conf, const char *name) +conf::add_target(const char *name) { if (!valid_iscsi_name(name, log_warnx)) return (nullptr); @@ -1104,23 +1196,23 @@ target_new(struct conf *conf, const char *name) for (char &c : t_name) c = tolower(c); - auto const &pair = conf->conf_targets.try_emplace(t_name, - std::make_unique<target>(conf, t_name)); + auto const &pair = conf_targets.try_emplace(t_name, + std::make_unique<target>(this, t_name)); if (!pair.second) { log_warnx("duplicated target \"%s\"", name); return (NULL); } - if (conf->conf_first_target == nullptr) - conf->conf_first_target = pair.first->second.get(); + if (conf_first_target == nullptr) + conf_first_target = pair.first->second.get(); return (pair.first->second.get()); } struct target * -target_find(struct conf *conf, const char *name) +conf::find_target(std::string_view name) { - auto it = conf->conf_targets.find(name); - if (it == conf->conf_targets.end()) + auto it = conf_targets.find(std::string(name)); + if (it == conf_targets.end()) return (nullptr); return (it->second.get()); } @@ -1191,7 +1283,7 @@ target::add_lun(u_int id, const char *lun_name) return (false); } - t_lun = lun_find(t_conf, lun_name); + t_lun = t_conf->find_lun(lun_name); if (t_lun == NULL) { log_warnx("unknown LUN named %s used for target \"%s\"", lun_name, name()); @@ -1208,7 +1300,7 @@ target::add_portal_group(const char *pg_name, const char *ag_name) struct portal_group *pg; auth_group_sp ag; - pg = portal_group_find(t_conf, pg_name); + pg = t_conf->find_portal_group(pg_name); if (pg == NULL) { log_warnx("unknown portal-group \"%s\" for target \"%s\"", pg_name, name()); @@ -1216,7 +1308,7 @@ target::add_portal_group(const char *pg_name, const char *ag_name) } if (ag_name != NULL) { - ag = auth_group_find(t_conf, ag_name); + ag = t_conf->find_auth_group(ag_name); if (ag == NULL) { log_warnx("unknown auth-group \"%s\" for target \"%s\"", ag_name, name()); @@ -1224,7 +1316,7 @@ target::add_portal_group(const char *pg_name, const char *ag_name) } } - if (!port_new(t_conf, this, pg, std::move(ag))) { + if (!t_conf->add_port(this, pg, std::move(ag))) { log_warnx("can't link portal-group \"%s\" to target \"%s\"", pg_name, name()); return (false); @@ -1256,7 +1348,7 @@ target::set_auth_group(const char *ag_name) "specified more than once", name()); return (false); } - t_auth_group = auth_group_find(t_conf, ag_name); + t_auth_group = t_conf->find_auth_group(ag_name); if (t_auth_group == nullptr) { log_warnx("unknown auth-group \"%s\" for target \"%s\"", ag_name, name()); @@ -1317,7 +1409,7 @@ target::start_lun(u_int id) } std::string lun_name = freebsd::stringf("%s,lun,%u", name(), id); - new_lun = lun_new(t_conf, lun_name.c_str()); + new_lun = t_conf->add_lun(lun_name.c_str()); if (new_lun == nullptr) return (nullptr); @@ -1352,13 +1444,13 @@ void target::verify() { if (t_auth_group == nullptr) { - t_auth_group = auth_group_find(t_conf, "default"); + t_auth_group = t_conf->find_auth_group("default"); assert(t_auth_group != nullptr); } if (t_ports.empty()) { - struct portal_group *pg = portal_group_find(t_conf, "default"); + struct portal_group *pg = t_conf->find_portal_group("default"); assert(pg != NULL); - port_new(t_conf, this, pg, nullptr); + t_conf->add_port(this, pg, nullptr); } bool found = std::any_of(t_luns.begin(), t_luns.end(), @@ -1376,10 +1468,10 @@ lun::lun(struct conf *conf, std::string_view name) } struct lun * -lun_new(struct conf *conf, const char *name) +conf::add_lun(const char *name) { - const auto &pair = conf->conf_luns.try_emplace(name, - std::make_unique<lun>(conf, name)); + const auto &pair = conf_luns.try_emplace(name, + std::make_unique<lun>(this, name)); if (!pair.second) { log_warnx("duplicated lun \"%s\"", name); return (NULL); @@ -1387,18 +1479,18 @@ lun_new(struct conf *conf, const char *name) return (pair.first->second.get()); } -static void -conf_delete_target_luns(struct conf *conf, struct lun *lun) +void +conf::delete_target_luns(struct lun *lun) { - for (const auto &kv : conf->conf_targets) + for (const auto &kv : conf_targets) kv.second->remove_lun(lun); } struct lun * -lun_find(const struct conf *conf, const char *name) +conf::find_lun(std::string_view name) { - auto it = conf->conf_luns.find(name); - if (it == conf->conf_luns.end()) + auto it = conf_luns.find(std::string(name)); + if (it == conf_luns.end()) return (nullptr); return (it->second.get()); } @@ -1721,13 +1813,13 @@ lun::verify() } bool -conf_verify(struct conf *conf) +conf::verify() { - if (conf->conf_pidfile_path == NULL) - conf->conf_pidfile_path = checked_strdup(DEFAULT_PIDFILE); + if (conf_pidfile_path.empty()) + conf_pidfile_path = DEFAULT_PIDFILE; std::unordered_map<std::string, struct lun *> path_map; - for (const auto &kv : conf->conf_luns) { + for (const auto &kv : conf_luns) { struct lun *lun = kv.second.get(); if (!lun->verify()) return (false); @@ -1746,13 +1838,13 @@ conf_verify(struct conf *conf) } } - for (auto &kv : conf->conf_targets) { + for (auto &kv : conf_targets) { kv.second->verify(); } - for (auto &kv : conf->conf_portal_groups) { - kv.second->verify(conf); + for (auto &kv : conf_portal_groups) { + kv.second->verify(this); } - for (const auto &kv : conf->conf_auth_groups) { + for (const auto &kv : conf_auth_groups) { const std::string &ag_name = kv.first; if (ag_name == "default" || ag_name == "no-authentication" || @@ -1903,41 +1995,44 @@ conf::reuse_portal_group_socket(struct portal &newp) return (false); } -static int -conf_apply(struct conf *oldconf, struct conf *newconf) +int +conf::apply(struct conf *oldconf) { int cumulated_error = 0; - if (oldconf->conf_debug != newconf->conf_debug) { - log_debugx("changing debug level to %d", newconf->conf_debug); - log_init(newconf->conf_debug); + if (oldconf->conf_debug != conf_debug) { + log_debugx("changing debug level to %d", conf_debug); + log_init(conf_debug); } - if (oldconf->conf_pidfile_path != NULL && - newconf->conf_pidfile_path != NULL) - { - if (strcmp(oldconf->conf_pidfile_path, - newconf->conf_pidfile_path) != 0) - { + /* + * On startup, oldconf created via conf_new_from_kernel will + * not contain a valid pidfile_path, and the current + * conf_pidfile will already own the pidfile. On shutdown, + * the temporary newconf will not contain a valid + * pidfile_path, and the pidfile will be cleaned up when the + * oldconf is deleted. + */ + if (!oldconf->conf_pidfile_path.empty() && + !conf_pidfile_path.empty()) { + if (oldconf->conf_pidfile_path != conf_pidfile_path) { /* pidfile has changed. rename it */ log_debugx("moving pidfile to %s", - newconf->conf_pidfile_path); - if (rename(oldconf->conf_pidfile_path, - newconf->conf_pidfile_path)) - { + conf_pidfile_path.c_str()); + if (rename(oldconf->conf_pidfile_path.c_str(), + conf_pidfile_path.c_str()) != 0) { log_err(1, "renaming pidfile %s -> %s", - oldconf->conf_pidfile_path, - newconf->conf_pidfile_path); + oldconf->conf_pidfile_path.c_str(), + conf_pidfile_path.c_str()); } } - newconf->conf_pidfh = oldconf->conf_pidfh; - oldconf->conf_pidfh = NULL; + conf_pidfile = std::move(oldconf->conf_pidfile); } /* * Go through the new portal groups, assigning tags or preserving old. */ - for (auto &kv : newconf->conf_portal_groups) { + for (auto &kv : conf_portal_groups) { struct portal_group &newpg = *kv.second; if (newpg.tag() != 0) @@ -1951,14 +2046,14 @@ conf_apply(struct conf *oldconf, struct conf *newconf) /* Deregister on removed iSNS servers. */ for (auto &kv : oldconf->conf_isns) { - if (newconf->conf_isns.count(kv.first) == 0) - isns_deregister_targets(oldconf, &kv.second); + if (conf_isns.count(kv.first) == 0) + oldconf->isns_deregister_targets(&kv.second); } /* * XXX: If target or lun removal fails, we should somehow "move" - * the old lun or target into newconf, so that subsequent - * conf_apply() would try to remove them again. That would + * the old lun or target into this, so that subsequent + * conf::apply() would try to remove them again. That would * be somewhat hairy, though, and lun deletion failures don't * really happen, so leave it as it is for now. */ @@ -1972,9 +2067,8 @@ conf_apply(struct conf *oldconf, struct conf *newconf) if (oldport->is_dummy()) continue; - const auto it = newconf->conf_ports.find(name); - if (it != newconf->conf_ports.end() && - !it->second->is_dummy()) + const auto it = conf_ports.find(name); + if (it != conf_ports.end() && !it->second->is_dummy()) continue; log_debugx("removing port \"%s\"", name.c_str()); if (!oldport->kernel_remove()) { @@ -1995,8 +2089,8 @@ conf_apply(struct conf *oldconf, struct conf *newconf) it != oldconf->conf_luns.end(); ) { struct lun *oldlun = it->second.get(); - auto newit = newconf->conf_luns.find(it->first); - if (newit == newconf->conf_luns.end()) { + auto newit = conf_luns.find(it->first); + if (newit == conf_luns.end()) { log_debugx("lun \"%s\", CTL lun %d " "not found in new configuration; " "removing", oldlun->name(), oldlun->ctl_lun()); @@ -2034,8 +2128,7 @@ conf_apply(struct conf *oldconf, struct conf *newconf) it++; } - for (auto it = newconf->conf_luns.begin(); - it != newconf->conf_luns.end(); ) { + for (auto it = conf_luns.begin(); it != conf_luns.end(); ) { struct lun *newlun = it->second.get(); auto oldit = oldconf->conf_luns.find(it->first); @@ -2055,8 +2148,8 @@ conf_apply(struct conf *oldconf, struct conf *newconf) log_debugx("adding lun \"%s\"", newlun->name()); if (!newlun->kernel_add()) { log_warnx("failed to add lun \"%s\"", newlun->name()); - conf_delete_target_luns(newconf, newlun); - it = newconf->conf_luns.erase(it); + delete_target_luns(newlun); + it = conf_luns.erase(it); cumulated_error++; } else it++; @@ -2065,8 +2158,7 @@ conf_apply(struct conf *oldconf, struct conf *newconf) /* * Now add new ports or modify existing ones. */ - for (auto it = newconf->conf_ports.begin(); - it != newconf->conf_ports.end(); ) { + for (auto it = conf_ports.begin(); it != conf_ports.end(); ) { const std::string &name = it->first; port *newport = it->second.get(); @@ -2096,7 +2188,7 @@ conf_apply(struct conf *oldconf, struct conf *newconf) * deleting the port. */ newport->clear_references(); - it = newconf->conf_ports.erase(it); + it = conf_ports.erase(it); } else it++; } else { @@ -2111,7 +2203,7 @@ conf_apply(struct conf *oldconf, struct conf *newconf) /* * Go through the new portals, opening the sockets as necessary. */ - for (auto &kv : newconf->conf_portal_groups) { + for (auto &kv : conf_portal_groups) { cumulated_error += kv.second->open_sockets(*oldconf); } @@ -2123,17 +2215,15 @@ conf_apply(struct conf *oldconf, struct conf *newconf) } /* (Re-)Register on remaining/new iSNS servers. */ - for (auto &kv : newconf->conf_isns) { + for (auto &kv : conf_isns) { auto it = oldconf->conf_isns.find(kv.first); if (it == oldconf->conf_isns.end()) - isns_register_targets(newconf, &kv.second, nullptr); + isns_register_targets(&kv.second, nullptr); else *** 617 LINES SKIPPED ***