X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmount.c;h=1251c94608d6a678fc1f04a33a53a00a4f75363a;hb=f5b51ea7fcb0b6380c3ceb4d4f3f22f647c6fd32;hp=a551235f139973eb0e56afbc7e4ce8a235380752;hpb=d15d0333be6a1ca7fdd99a1881d967b6be8f387a;p=elogind.git diff --git a/src/core/mount.c b/src/core/mount.c index a551235f1..1251c9460 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -30,8 +29,6 @@ #include "manager.h" #include "unit.h" #include "mount.h" -#include "load-fragment.h" -#include "load-dropin.h" #include "log.h" #include "sd-messages.h" #include "strv.h" @@ -41,9 +38,7 @@ #include "unit-name.h" #include "dbus-mount.h" #include "special.h" -#include "bus-common-errors.h" #include "exit-status.h" -#include "def.h" #include "fstab-util.h" #define RETRY_UMOUNT_MAX 32 @@ -300,7 +295,7 @@ static int mount_add_device_links(Mount *m) { assert(m); - p = get_mount_parameters_fragment(m); + p = get_mount_parameters(m); if (!p) return 0; @@ -378,13 +373,20 @@ static int mount_add_default_dependencies(Mount *m) { if (UNIT(m)->manager->running_as != SYSTEMD_SYSTEM) return 0; - p = get_mount_parameters(m); - - if (!p) + /* We do not add any default dependencies to / and /usr, since + * they are guaranteed to stay mounted the whole time, since + * our system is on it. Also, don't bother with anything + * mounted below virtual file systems, it's also going to be + * virtual, and hence not worth the effort. */ + if (path_equal(m->where, "/") || + path_equal(m->where, "/usr") || + path_startswith(m->where, "/proc") || + path_startswith(m->where, "/sys") || + path_startswith(m->where, "/dev")) return 0; - if (path_equal(m->where, "/") || - path_equal(m->where, "/usr")) + p = get_mount_parameters(m); + if (!p) return 0; if (mount_is_network(p)) { @@ -610,7 +612,7 @@ static void mount_set_state(Mount *m, MountState state) { m->reload_result = MOUNT_SUCCESS; } -static int mount_coldplug(Unit *u) { +static int mount_coldplug(Unit *u, Hashmap *deferred_work) { Mount *m = MOUNT(u); MountState new_state = MOUNT_DEAD; int r; @@ -704,7 +706,11 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) { assert(c); assert(_pid); - unit_realize_cgroup(UNIT(m)); + (void) unit_realize_cgroup(UNIT(m)); + if (m->reset_cpu_usage) { + (void) unit_reset_cpu_usage(UNIT(m)); + m->reset_cpu_usage = false; + } r = unit_setup_exec_runtime(UNIT(m)); if (r < 0) @@ -917,6 +923,13 @@ static void mount_enter_mounting(Mount *m) { goto fail; if (m->from_fragment) { + _cleanup_free_ char *opts = NULL; + + r = fstab_filter_options(m->parameters_fragment.options, + "nofail\0" "noauto\0" "auto\0", NULL, NULL, &opts); + if (r < 0) + goto fail; + r = exec_command_set(m->control_command, "/bin/mount", m->parameters_fragment.what, m->where, NULL); if (r >= 0 && UNIT(m)->manager->running_as == SYSTEMD_SYSTEM) @@ -925,8 +938,8 @@ static void mount_enter_mounting(Mount *m) { r = exec_command_append(m->control_command, "-s", NULL); if (r >= 0 && m->parameters_fragment.fstype) r = exec_command_append(m->control_command, "-t", m->parameters_fragment.fstype, NULL); - if (r >= 0 && m->parameters_fragment.options) - r = exec_command_append(m->control_command, "-o", m->parameters_fragment.options, NULL); + if (r >= 0 && !isempty(opts)) + r = exec_command_append(m->control_command, "-o", opts, NULL); } else r = -ENOENT; @@ -962,7 +975,7 @@ static void mount_enter_remounting(Mount *m) { const char *o; if (m->parameters_fragment.options) - o = strappenda("remount,", m->parameters_fragment.options); + o = strjoina("remount,", m->parameters_fragment.options); else o = "remount"; @@ -1021,9 +1034,10 @@ static int mount_start(Unit *u) { m->result = MOUNT_SUCCESS; m->reload_result = MOUNT_SUCCESS; + m->reset_cpu_usage = true; mount_enter_mounting(m); - return 0; + return 1; } static int mount_stop(Unit *u) { @@ -1047,7 +1061,7 @@ static int mount_stop(Unit *u) { m->state == MOUNT_REMOUNTING_SIGKILL); mount_enter_unmounting(m); - return 0; + return 1; } static int mount_reload(Unit *u) { @@ -1377,7 +1391,7 @@ static int mount_dispatch_timer(sd_event_source *source, usec_t usec, void *user return 0; } -static int mount_add_one( +static int mount_setup_unit( Manager *m, const char *what, const char *where, @@ -1420,7 +1434,7 @@ static int mount_add_one( u = unit_new(m, sizeof(Mount)); if (!u) - return -ENOMEM; + return log_oom(); r = unit_add_name(u, e); if (r < 0) @@ -1533,6 +1547,8 @@ static int mount_add_one( return 0; fail: + log_warning_errno(r, "Failed to set up mount unit: %m"); + if (delete && u) unit_free(u); @@ -1540,33 +1556,36 @@ fail: } static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { - _cleanup_(mnt_free_tablep) struct libmnt_table *tb = NULL; - _cleanup_(mnt_free_iterp) struct libmnt_iter *itr = NULL; - struct libmnt_fs *fs; + _cleanup_(mnt_free_tablep) struct libmnt_table *t = NULL; + _cleanup_(mnt_free_iterp) struct libmnt_iter *i = NULL; int r = 0; assert(m); - tb = mnt_new_table(); - itr = mnt_new_iter(MNT_ITER_FORWARD); - if (!tb || !itr) + t = mnt_new_table(); + if (!t) + return log_oom(); + + i = mnt_new_iter(MNT_ITER_FORWARD); + if (!i) return log_oom(); - r = mnt_table_parse_mtab(tb, NULL); + r = mnt_table_parse_mtab(t, NULL); if (r < 0) - return r; + return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m"); r = 0; for (;;) { const char *device, *path, *options, *fstype; _cleanup_free_ const char *d = NULL, *p = NULL; + struct libmnt_fs *fs; int k; - k = mnt_table_next_fs(tb, itr, &fs); + k = mnt_table_next_fs(t, i, &fs); if (k == 1) break; - else if (k < 0) - return log_error_errno(k, "Failed to get next entry from /etc/fstab: %m"); + if (k < 0) + return log_error_errno(k, "Failed to get next entry from /proc/self/mountinfo: %m"); device = mnt_fs_get_source(fs); path = mnt_fs_get_target(fs); @@ -1574,11 +1593,16 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { fstype = mnt_fs_get_fstype(fs); d = cunescape(device); + if (!d) + return log_oom(); + p = cunescape(path); - if (!d || !p) + if (!p) return log_oom(); - k = mount_add_one(m, d, p, options, fstype, set_flags); + (void) device_found_node(m, d, true, DEVICE_FOUND_MOUNT, set_flags); + + k = mount_setup_unit(m, d, p, options, fstype, set_flags); if (r == 0 && k < 0) r = k; } @@ -1722,8 +1746,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, r = mount_load_proc_self_mountinfo(m, true); if (r < 0) { - log_error_errno(r, "Failed to reread /proc/self/mountinfo: %m"); - /* Reset flags, just in case, for later calls */ LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_MOUNT]) { Mount *mount = MOUNT(u); @@ -1756,6 +1778,10 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, break; } + if (mount->parameters_proc_self_mountinfo.what) + (void) device_found_node(m, mount->parameters_proc_self_mountinfo.what, false, DEVICE_FOUND_MOUNT, true); + + } else if (mount->just_mounted || mount->just_changed) { /* New or changed mount entry */