[systemd-commits] 5 commits - TODO src/core src/shared
Lennart Poettering
lennart at kemper.freedesktop.org
Fri Aug 15 09:29:29 PDT 2014
TODO | 9 +++++
src/core/cgroup.c | 30 +++++++++++------
src/core/main.c | 94 +++++++++++++-----------------------------------------
src/shared/log.c | 54 +++++++++++++++++++++----------
src/shared/util.c | 8 ++--
5 files changed, 95 insertions(+), 100 deletions(-)
New commits:
commit 4311fa08fe7f3e702a2adb569fe20fb023a4b746
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 15 18:29:21 2014 +0200
update TODO
diff --git a/TODO b/TODO
index 979ac30..e85eb55 100644
--- a/TODO
+++ b/TODO
@@ -24,6 +24,9 @@ External:
Features:
+* sd_notify("SHUTDOWN=1") to fix a dbus activation race.
+ http://lists.freedesktop.org/archives/systemd-devel/2014-July/020983.html
+
* merge ~/.local/share and ~/.local/lib into one similar /usr/lib and /usr/share....
* make "systemctl suspend" block until we are back from suspend
commit 1aeab12b19df295dbce1d422d9ee176a332aa800
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 15 18:14:37 2014 +0200
cgroup: only generate warnings if actually writing to cgroup attributes failed
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 42bf09f..9248cb5 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -199,7 +199,8 @@ static int whitelist_device(const char *path, const char *node, const char *acc)
acc);
r = cg_set_attribute("devices", path, "devices.allow", buf);
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set devices.allow on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set devices.allow on %s: %s", path, strerror(-r));
return r;
}
@@ -270,7 +271,8 @@ static int whitelist_major(const char *path, const char *name, char type, const
acc);
r = cg_set_attribute("devices", path, "devices.allow", buf);
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set devices.allow on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set devices.allow on %s: %s", path, strerror(-r));
}
return 0;
@@ -301,18 +303,21 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha
state == MANAGER_STARTING && c->startup_cpu_shares != (unsigned long) -1 ? c->startup_cpu_shares :
c->cpu_shares != (unsigned long) -1 ? c->cpu_shares : 1024);
r = cg_set_attribute("cpu", path, "cpu.shares", buf);
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set cpu.shares on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set cpu.shares on %s: %s", path, strerror(-r));
sprintf(buf, USEC_FMT "\n", CGROUP_CPU_QUOTA_PERIOD_USEC);
r = cg_set_attribute("cpu", path, "cpu.cfs_period_us", buf);
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set cpu.cfs_period_us on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set cpu.cfs_period_us on %s: %s", path, strerror(-r));
if (c->cpu_quota_per_sec_usec != USEC_INFINITY) {
sprintf(buf, USEC_FMT "\n", c->cpu_quota_per_sec_usec * CGROUP_CPU_QUOTA_PERIOD_USEC / USEC_PER_SEC);
r = cg_set_attribute("cpu", path, "cpu.cfs_quota_us", buf);
} else
r = cg_set_attribute("cpu", path, "cpu.cfs_quota_us", "-1");
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set cpu.cfs_quota_us on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set cpu.cfs_quota_us on %s: %s", path, strerror(-r));
}
if (mask & CGROUP_BLKIO) {
@@ -326,7 +331,8 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha
sprintf(buf, "%lu\n", state == MANAGER_STARTING && c->startup_blockio_weight != (unsigned long) -1 ? c->startup_blockio_weight :
c->blockio_weight != (unsigned long) -1 ? c->blockio_weight : 1000);
r = cg_set_attribute("blkio", path, "blkio.weight", buf);
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set blkio.weight on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set blkio.weight on %s: %s", path, strerror(-r));
/* FIXME: no way to reset this list */
LIST_FOREACH(device_weights, w, c->blockio_device_weights) {
@@ -338,7 +344,8 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha
sprintf(buf, "%u:%u %lu", major(dev), minor(dev), w->weight);
r = cg_set_attribute("blkio", path, "blkio.weight_device", buf);
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set blkio.weight_device on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set blkio.weight_device on %s: %s", path, strerror(-r));
}
}
@@ -355,7 +362,8 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha
sprintf(buf, "%u:%u %" PRIu64 "\n", major(dev), minor(dev), b->bandwidth);
r = cg_set_attribute("blkio", path, a, buf);
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set %s on %s: %s", a, path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set %s on %s: %s", a, path, strerror(-r));
}
}
@@ -368,7 +376,8 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha
} else
r = cg_set_attribute("memory", path, "memory.limit_in_bytes", "-1");
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set memory.limit_in_bytes on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to set memory.limit_in_bytes on %s: %s", path, strerror(-r));
}
if ((mask & CGROUP_DEVICE) && !is_root) {
@@ -378,7 +387,8 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha
r = cg_set_attribute("devices", path, "devices.deny", "a");
else
r = cg_set_attribute("devices", path, "devices.allow", "a");
- log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to reset devices.list on %s: %s", path, strerror(-r));
+ if (r < 0)
+ log_full(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, "Failed to reset devices.list on %s: %s", path, strerror(-r));
if (c->device_policy == CGROUP_CLOSED ||
(c->device_policy == CGROUP_AUTO && c->device_allow)) {
commit 1de1c9c37bb58d99c3f9d86f50212e641a2948b4
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 15 18:07:36 2014 +0200
main,log: parse the log related kernel command line parameters at one place only, and for all tools
Previously, we ended up parsing some of them three times: in main.c when
processing the kernel cmdline, in main.c when processing the process
cmdline (only for containers), and in log.c again.
Let's streamline this, and only parse them in log.c
In PID 1 also make sure we parse "quiet" first, and then override this
with the more specific checks in log.c
diff --git a/src/core/main.c b/src/core/main.c
index e15355d..792b316 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -293,26 +293,6 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
if (in_initrd())
return set_default_unit(value);
- } else if (streq(key, "systemd.log_target") && value) {
-
- if (log_set_target_from_string(value) < 0)
- log_warning("Failed to parse log target %s. Ignoring.", value);
-
- } else if (streq(key, "systemd.log_level") && value) {
-
- if (log_set_max_level_from_string(value) < 0)
- log_warning("Failed to parse log level %s. Ignoring.", value);
-
- } else if (streq(key, "systemd.log_color") && value) {
-
- if (log_show_color_from_string(value) < 0)
- log_warning("Failed to parse log color setting %s. Ignoring.", value);
-
- } else if (streq(key, "systemd.log_location") && value) {
-
- if (log_show_location_from_string(value) < 0)
- log_warning("Failed to parse log location setting %s. Ignoring.", value);
-
} else if (streq(key, "systemd.dump_core") && value) {
r = parse_boolean(value);
@@ -388,7 +368,8 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
} else if (streq(key, "debug") && !value) {
- log_set_max_level(LOG_DEBUG);
+ /* Note that log_parse_environment() handles 'debug'
+ * too, and sets the log level to LOG_DEBUG. */
if (detect_container(NULL) > 0)
log_set_target(LOG_TARGET_CONSOLE);
@@ -963,37 +944,6 @@ static int parse_argv(int argc, char *argv[]) {
return -EINVAL;
}
- if (detect_container(NULL) > 0) {
- char **a;
-
- /* All /proc/cmdline arguments the kernel didn't
- * understand it passed to us. We're not really
- * interested in that usually since /proc/cmdline is
- * more interesting and complete. With one exception:
- * if we are run in a container /proc/cmdline is not
- * relevant for the container, hence we rely on argv[]
- * instead. */
-
- for (a = argv; a < argv + argc; a++) {
- _cleanup_free_ char *w;
- char *value;
-
- w = strdup(*a);
- if (!w)
- return log_oom();
-
- value = strchr(w, '=');
- if (value)
- *(value++) = 0;
-
- r = parse_proc_cmdline_item(w, value);
- if (r < 0) {
- log_error("Failed on cmdline argument %s: %s", *a, strerror(-r));
- return r;
- }
- }
- }
-
return 0;
}
@@ -1455,6 +1405,8 @@ int main(int argc, char *argv[]) {
if (parse_proc_cmdline(parse_proc_cmdline_item) < 0)
goto finish;
+ /* Note that this also parses bits from the kernel command
+ * line, including "debug". */
log_parse_environment();
if (parse_argv(argc, argv) < 0)
diff --git a/src/shared/log.c b/src/shared/log.c
index 2bac998..b730ac9 100644
--- a/src/shared/log.c
+++ b/src/shared/log.c
@@ -871,27 +871,47 @@ int log_set_max_level_from_string(const char *e) {
return 0;
}
+static int parse_proc_cmdline_item(const char *key, const char *value) {
+
+ /*
+ * The systemd.log_xyz= settings are parsed by all tools, and
+ * so is "debug".
+ *
+ * However, "quiet" is only parsed by PID 1!
+ */
+
+ if (streq(key, "debug") && !value)
+ log_set_max_level(LOG_DEBUG);
+
+ else if (streq(key, "systemd.log_target") && value) {
+
+ if (log_set_target_from_string(value) < 0)
+ log_warning("Failed to parse log target '%s'. Ignoring.", value);
+
+ } else if (streq(key, "systemd.log_level") && value) {
+
+ if (log_set_max_level_from_string(value) < 0)
+ log_warning("Failed to parse log level '%s'. Ignoring.", value);
+
+ } else if (streq(key, "systemd.log_color") && value) {
+
+ if (log_show_color_from_string(value) < 0)
+ log_warning("Failed to parse log color setting '%s'. Ignoring.", value);
+
+ } else if (streq(key, "systemd.log_location") && value) {
+
+ if (log_show_location_from_string(value) < 0)
+ log_warning("Failed to parse log location setting '%s'. Ignoring.", value);
+ }
+
+ return 0;
+}
+
void log_parse_environment(void) {
_cleanup_free_ char *line = NULL;
const char *e;
- int r;
- r = proc_cmdline(&line);
- if (r < 0)
- log_warning("Failed to read /proc/cmdline. Ignoring: %s", strerror(-r));
- else if (r > 0) {
- const char *word, *state;
- size_t l;
-
- FOREACH_WORD_QUOTED(word, l, line, state) {
- if (l == 5 && startswith(word, "debug")) {
- log_set_max_level(LOG_DEBUG);
- break;
- }
- }
- if (!isempty(state))
- log_warning("Trailing garbage and the end of kernel commandline, ignoring.");
- }
+ parse_proc_cmdline(parse_proc_cmdline_item);
e = secure_getenv("SYSTEMD_LOG_TARGET");
if (e && log_set_target_from_string(e) < 0)
commit 56d96fc00cd009e92e611c11f15c1bfb1b1eb9e8
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 15 18:01:52 2014 +0200
main: minor code modernization for initializing the console
diff --git a/src/core/main.c b/src/core/main.c
index f33b78d..e15355d 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -228,31 +228,25 @@ static void install_crash_handler(void) {
sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
}
-static int console_setup(bool do_reset) {
- int tty_fd, r;
-
- /* If we are init, we connect stdin/stdout/stderr to /dev/null
- * and make sure we don't have a controlling tty. */
-
- release_terminal();
-
- if (!do_reset)
- return 0;
+static int console_setup(void) {
+ _cleanup_close_ int tty_fd = -1;
+ int r;
tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
if (tty_fd < 0) {
log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
- return -tty_fd;
+ return tty_fd;
}
- /* We don't want to force text mode.
- * plymouth may be showing pictures already from initrd. */
+ /* We don't want to force text mode. plymouth may be showing
+ * pictures already from initrd. */
r = reset_terminal_fd(tty_fd, false);
- if (r < 0)
+ if (r < 0) {
log_error("Failed to reset /dev/console: %s", strerror(-r));
+ return r;
+ }
- safe_close(tty_fd);
- return r;
+ return 0;
}
static int set_default_unit(const char *u) {
@@ -1537,8 +1531,16 @@ int main(int argc, char *argv[]) {
/* Reset the console, but only if this is really init and we
* are freshly booted */
- if (arg_running_as == SYSTEMD_SYSTEM && arg_action == ACTION_RUN)
- console_setup(getpid() == 1 && !skip_setup);
+ if (arg_running_as == SYSTEMD_SYSTEM && arg_action == ACTION_RUN) {
+
+ /* If we are init, we connect stdin/stdout/stderr to
+ * /dev/null and make sure we don't have a controlling
+ * tty. */
+ release_terminal();
+
+ if (getpid() == 1 && !skip_setup)
+ console_setup();
+ }
/* Open the logging devices, if possible and necessary */
log_open();
diff --git a/src/shared/util.c b/src/shared/util.c
index d6cea4d..18d40f3 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -2084,12 +2084,14 @@ fail:
}
int release_terminal(void) {
- int r = 0;
- struct sigaction sa_old, sa_new = {
+ static const struct sigaction sa_new = {
.sa_handler = SIG_IGN,
.sa_flags = SA_RESTART,
};
- _cleanup_close_ int fd;
+
+ _cleanup_close_ int fd = -1;
+ struct sigaction sa_old;
+ int r = 0;
fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY|O_CLOEXEC);
if (fd < 0)
commit 563b1bdc09efe0cf94dd3f514f30376ca854c1ce
Author: Lennart Poettering <lennart at poettering.net>
Date: Fri Aug 15 18:01:30 2014 +0200
update TODO
diff --git a/TODO b/TODO
index 8d3c1ca..979ac30 100644
--- a/TODO
+++ b/TODO
@@ -24,6 +24,12 @@ External:
Features:
+* merge ~/.local/share and ~/.local/lib into one similar /usr/lib and /usr/share....
+
+* make "systemctl suspend" block until we are back from suspend
+
+* remove readahead in 217
+
* journald: allows specification of UID range for splitting up journal files
* systemd.show_status= should probably have a mode where only failed
More information about the systemd-commits
mailing list