X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmount.c;h=8e4a3769446a497ba9bfd5d72054e2bc6d6c09cc;hb=c43b2132f37264600cc26e07c8d85dfdd6c969f0;hp=612d15077b8c49525ee0a82a3191f128a3c0dfe3;hpb=76c37ab6d205c95e8f43ffbc19553b936330195a;p=elogind.git diff --git a/src/core/mount.c b/src/core/mount.c index 612d15077..8e4a37694 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)) { @@ -969,7 +971,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"; @@ -1030,7 +1032,7 @@ static int mount_start(Unit *u) { m->reload_result = MOUNT_SUCCESS; mount_enter_mounting(m); - return 0; + return 1; } static int mount_stop(Unit *u) { @@ -1054,7 +1056,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) { @@ -1384,7 +1386,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, @@ -1427,7 +1429,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) @@ -1540,6 +1542,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); @@ -1547,33 +1551,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(); - r = mnt_table_parse_mtab(tb, NULL); + i = mnt_new_iter(MNT_ITER_FORWARD); + if (!i) + return log_oom(); + + 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); @@ -1581,11 +1588,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; } @@ -1729,8 +1741,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); @@ -1763,6 +1773,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 */