X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fmount.c;h=4a38e957003d6b8c14cc5d8d0ba6b2f14f13725d;hb=df1f0afe0c0d044a42ee726fa03730291d7082ee;hp=921984c1c116a6446ed4bb6facad915b5ac4a87b;hpb=307e85efbb781ac609b6b3f905ff76b886ddd01e;p=elogind.git diff --git a/src/mount.c b/src/mount.c index 921984c1c..4a38e9570 100644 --- a/src/mount.c +++ b/src/mount.c @@ -49,7 +49,7 @@ static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = { [MOUNT_REMOUNTING_SIGKILL] = UNIT_ACTIVE_RELOADING, [MOUNT_UNMOUNTING_SIGTERM] = UNIT_DEACTIVATING, [MOUNT_UNMOUNTING_SIGKILL] = UNIT_DEACTIVATING, - [MOUNT_MAINTAINANCE] = UNIT_INACTIVE, + [MOUNT_MAINTENANCE] = UNIT_INACTIVE, }; static void mount_init(Unit *u) { @@ -167,6 +167,19 @@ static int mount_add_swap_links(Mount *m) { return 0; } +static int mount_add_path_links(Mount *m) { + Meta *other; + int r; + + assert(m); + + LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_PATH]) + if ((r = path_add_one_mount_link((Path*) other, m)) < 0) + return r; + + return 0; +} + static int mount_add_automount_links(Mount *m) { Meta *other; int r; @@ -267,9 +280,12 @@ static int mount_verify(Mount *m) { char *e; assert(m); - if (UNIT(m)->meta.load_state != UNIT_LOADED) + if (m->meta.load_state != UNIT_LOADED) return 0; + if (!m->from_etc_fstab && !m->from_fragment && !m->from_proc_self_mountinfo) + return -ENOENT; + if (!(e = unit_name_from_path(m->where, ".mount"))) return -ENOMEM; @@ -338,6 +354,9 @@ static int mount_load(Unit *u) { if ((r = mount_add_swap_links(m)) < 0) return r; + if ((r = mount_add_path_links(m)) < 0) + return r; + if ((r = mount_add_automount_links(m)) < 0) return r; @@ -397,7 +416,7 @@ static void mount_set_state(Mount *m, MountState state) { state == MOUNT_REMOUNTING_SIGKILL || state == MOUNT_UNMOUNTING_SIGTERM || state == MOUNT_UNMOUNTING_SIGKILL || - state == MOUNT_MAINTAINANCE) + state == MOUNT_MAINTENANCE) mount_notify_automount(m, -ENODEV); if (state != old_state) @@ -536,7 +555,7 @@ static void mount_enter_dead(Mount *m, bool success) { if (!success) m->failure = true; - mount_set_state(m, m->failure ? MOUNT_MAINTAINANCE : MOUNT_DEAD); + mount_set_state(m, m->failure ? MOUNT_MAINTENANCE : MOUNT_DEAD); } static void mount_enter_mounted(Mount *m, bool success) { @@ -761,7 +780,7 @@ static int mount_start(Unit *u) { m->state == MOUNT_MOUNTING_SIGKILL) return 0; - assert(m->state == MOUNT_DEAD || m->state == MOUNT_MAINTAINANCE); + assert(m->state == MOUNT_DEAD || m->state == MOUNT_MAINTENANCE); m->failure = false; mount_enter_mounting(m); @@ -902,12 +921,14 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) { assert(m); assert(pid >= 0); - success = is_clean_exit(code, status); - m->failure = m->failure || !success; + if (pid != m->control_pid) + return; - assert(m->control_pid == pid); m->control_pid = 0; + success = is_clean_exit(code, status); + m->failure = m->failure || !success; + if (m->control_command) { exec_status_fill(&m->control_command->exec_status, pid, code, status); m->control_command = NULL; @@ -933,7 +954,7 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) { case MOUNT_REMOUNTING_SIGKILL: case MOUNT_REMOUNTING_SIGTERM: - if (success && m->from_proc_self_mountinfo) + if (success) mount_enter_mounted(m, true); else if (m->from_proc_self_mountinfo) mount_enter_mounted(m, false); @@ -1243,7 +1264,7 @@ finish: static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { int r; - char *device, *path, *options, *fstype, *d, *p; + char *device, *path, *options, *options2, *fstype, *d, *p, *o; assert(m); @@ -1252,7 +1273,7 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { for (;;) { int k; - device = path = options = fstype = d = p = NULL; + device = path = options = options2 = fstype = d = p = o = NULL; if ((k = fscanf(m->proc_self_mountinfo, "%*s " /* (1) mount id */ @@ -1265,11 +1286,13 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { "- " /* (8) seperator */ "%ms " /* (9) file system type */ "%ms" /* (10) mount source */ + "%ms" /* (11) mount options 2 */ "%*[^\n]", /* some rubbish at the end */ &path, &options, &fstype, - &device)) != 4) { + &device, + &options2)) != 5) { if (k == EOF) break; @@ -1278,21 +1301,28 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { goto finish; } + if (asprintf(&o, "%s,%s", options, options2) < 0) { + r = -ENOMEM; + goto finish; + } + if (!(d = cunescape(device)) || !(p = cunescape(path))) { r = -ENOMEM; goto finish; } - if ((r = mount_add_one(m, d, p, options, fstype, true, set_flags)) < 0) + if ((r = mount_add_one(m, d, p, o, fstype, true, set_flags)) < 0) goto finish; free(device); free(path); free(options); + free(options2); free(fstype); free(d); free(p); + free(o); } r = 0; @@ -1301,9 +1331,11 @@ finish: free(device); free(path); free(options); + free(options2); free(fstype); free(d); free(p); + free(o); return r; } @@ -1403,7 +1435,7 @@ void mount_fd_event(Manager *m, int events) { switch (mount->state) { case MOUNT_DEAD: - case MOUNT_MAINTAINANCE: + case MOUNT_MAINTENANCE: mount_enter_mounted(mount, true); break; @@ -1491,7 +1523,7 @@ static const char* const mount_state_table[_MOUNT_STATE_MAX] = { [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill", [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm", [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill", - [MOUNT_MAINTAINANCE] = "maintainance" + [MOUNT_MAINTENANCE] = "maintenance" }; DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);