bus: don't switch to kdbus if not requested
Whenever systemd is re-executed, it tries to create a system bus via kdbus. If the system did not have kdbus loaded during bootup, but the module is loaded later on manually, this will cause two system buses running (kdbus and dbus-daemon in parallel). This patch makes sure we never try to create kdbus buses if it wasn't explicitly requested on the command-line.
This commit is contained in:
parent
f2bf5007a9
commit
d79acc3093
|
@ -988,7 +988,7 @@ static bool busname_supported(void) {
|
|||
static int supported = -1;
|
||||
|
||||
if (supported < 0)
|
||||
supported = access("/sys/fs/kdbus", F_OK) >= 0;
|
||||
supported = is_kdbus_available();
|
||||
|
||||
return supported;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "macro.h"
|
||||
#include "capability.h"
|
||||
#include "bus-util.h"
|
||||
#include "kmod-setup.h"
|
||||
|
||||
#ifdef HAVE_KMOD
|
||||
|
@ -44,10 +45,6 @@ static void systemd_kmod_log(
|
|||
log_internalv(LOG_DEBUG, 0, file, line, fn, format, args);
|
||||
REENABLE_WARNING;
|
||||
}
|
||||
|
||||
static bool cmdline_check_kdbus(void) {
|
||||
return get_proc_cmdline_key("kdbus", NULL) > 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int kmod_setup(void) {
|
||||
|
@ -69,7 +66,7 @@ int kmod_setup(void) {
|
|||
{ "unix", "/proc/net/unix", true, NULL },
|
||||
|
||||
/* IPC is needed before we bring up any other services */
|
||||
{ "kdbus", "/sys/fs/kdbus", false, cmdline_check_kdbus },
|
||||
{ "kdbus", "/sys/fs/kdbus", false, is_kdbus_wanted },
|
||||
|
||||
/* netfilter is needed by networkd, nspawn among others, and cannot be autoloaded */
|
||||
{ "ip_tables", "/proc/net/ip_tables_names", false, NULL },
|
||||
|
|
|
@ -721,6 +721,8 @@ static int manager_setup_kdbus(Manager *m) {
|
|||
|
||||
if (m->test_run || m->kdbus_fd >= 0)
|
||||
return 0;
|
||||
if (!is_kdbus_available())
|
||||
return -ESOCKTNOSUPPORT;
|
||||
|
||||
if (m->running_as == SYSTEMD_SYSTEM && detect_container(NULL) <= 0)
|
||||
bus_kernel_fix_attach_mask();
|
||||
|
|
|
@ -302,7 +302,7 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
umask(0022);
|
||||
|
||||
if (access("/sys/fs/kdbus/control", F_OK) < 0)
|
||||
if (!is_kdbus_available())
|
||||
return 0;
|
||||
|
||||
r = cg_pid_get_owner_uid(0, NULL);
|
||||
|
@ -310,7 +310,7 @@ int main(int argc, char *argv[]) {
|
|||
path = "/usr/share/dbus-1/services";
|
||||
type = "session";
|
||||
units = USER_DATA_UNIT_PATH;
|
||||
} else if (r == -ENOENT) {
|
||||
} else if (r == -ENXIO) {
|
||||
path = "/usr/share/dbus-1/system-services";
|
||||
type = "system";
|
||||
units = SYSTEM_DATA_UNIT_PATH;
|
||||
|
|
|
@ -2051,3 +2051,30 @@ int bus_path_decode_unique(const char *path, const char *prefix, char **ret_send
|
|||
*ret_external = external;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool is_kdbus_wanted(void) {
|
||||
_cleanup_free_ char *value = NULL;
|
||||
int r;
|
||||
|
||||
if (get_proc_cmdline_key("kdbus", NULL) <= 0) {
|
||||
r = get_proc_cmdline_key("kdbus=", &value);
|
||||
if (r <= 0 || parse_boolean(value) != 1)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool is_kdbus_available(void) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
struct kdbus_cmd cmd = { .size = sizeof(cmd), .flags = KDBUS_FLAG_NEGOTIATE };
|
||||
|
||||
if (!is_kdbus_wanted())
|
||||
return false;
|
||||
|
||||
fd = open("/sys/fs/kdbus/control", O_RDWR | O_CLOEXEC | O_NONBLOCK | O_NOCTTY);
|
||||
if (fd < 0)
|
||||
return false;
|
||||
|
||||
return ioctl(fd, KDBUS_CMD_BUS_MAKE, &cmd) >= 0;
|
||||
}
|
||||
|
|
|
@ -205,3 +205,6 @@ int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet);
|
|||
|
||||
int bus_path_encode_unique(sd_bus *b, const char *prefix, const char *sender_id, const char *external_id, char **ret_path);
|
||||
int bus_path_decode_unique(const char *path, const char *prefix, char **ret_sender, char **ret_external);
|
||||
|
||||
bool is_kdbus_wanted(void);
|
||||
bool is_kdbus_available(void);
|
||||
|
|
Loading…
Reference in a new issue