X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fmount.c;h=47422ccf8bafc4a59e9b2af5f3f6ea4041f11f43;hp=4b300364aff39699374d1104a67d52b54730fc35;hb=4deba285591ad2a388496d9c017da25e68db6f30;hpb=155da4572965abb2ced1d0eeba2e9f0de81d94b7 diff --git a/src/mount.c b/src/mount.c index 4b300364a..47422ccf8 100644 --- a/src/mount.c +++ b/src/mount.c @@ -68,8 +68,10 @@ static void mount_init(Unit *u) { /* The stdio/kmsg bridge socket is on /, in order to avoid a * dep loop, don't use kmsg logging for -.mount */ - if (!unit_has_name(u, "-.mount")) - m->exec_context.std_output = EXEC_OUTPUT_KMSG; + if (!unit_has_name(u, "-.mount")) { + m->exec_context.std_output = u->meta.manager->default_std_output; + m->exec_context.std_error = u->meta.manager->default_std_error; + } /* We need to make sure that /bin/mount is always called in * the same process group as us, so that the autofs kernel @@ -114,7 +116,7 @@ static void mount_done(Unit *u) { m->where = NULL; /* Try to detach us from the automount unit if there is any */ - LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_AUTOMOUNT]) { + LIST_FOREACH(units_by_type, other, m->meta.manager->units_by_type[UNIT_AUTOMOUNT]) { Automount *a = (Automount*) other; if (a->mount == m) @@ -166,7 +168,7 @@ static int mount_add_mount_links(Mount *m) { /* Adds in links to other mount points that might lie below or * above us in the hierarchy */ - LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_MOUNT]) { + LIST_FOREACH(units_by_type, other, m->meta.manager->units_by_type[UNIT_MOUNT]) { Mount *n = (Mount*) other; MountParameters *pn; @@ -223,7 +225,7 @@ static int mount_add_swap_links(Mount *m) { assert(m); - LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_SWAP]) + LIST_FOREACH(units_by_type, other, m->meta.manager->units_by_type[UNIT_SWAP]) if ((r = swap_add_one_mount_link((Swap*) other, m)) < 0) return r; @@ -236,7 +238,7 @@ static int mount_add_path_links(Mount *m) { assert(m); - LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_PATH]) + LIST_FOREACH(units_by_type, other, m->meta.manager->units_by_type[UNIT_PATH]) if ((r = path_add_one_mount_link((Path*) other, m)) < 0) return r; @@ -249,7 +251,7 @@ static int mount_add_automount_links(Mount *m) { assert(m); - LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_AUTOMOUNT]) + LIST_FOREACH(units_by_type, other, m->meta.manager->units_by_type[UNIT_AUTOMOUNT]) if ((r = automount_add_one_mount_link((Automount*) other, m)) < 0) return r; @@ -262,7 +264,7 @@ static int mount_add_socket_links(Mount *m) { assert(m); - LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_SOCKET]) + LIST_FOREACH(units_by_type, other, m->meta.manager->units_by_type[UNIT_SOCKET]) if ((r = socket_add_one_mount_link((Socket*) other, m)) < 0) return r; @@ -320,11 +322,14 @@ static bool needs_quota(MountParameters *p) { return false; return mount_test_option(p->options, "usrquota") || - mount_test_option(p->options, "grpquota"); + mount_test_option(p->options, "grpquota") || + mount_test_option(p->options, "quota") || + mount_test_option(p->options, "usrjquota") || + mount_test_option(p->options, "grpjquota"); } static int mount_add_fstab_links(Mount *m) { - const char *target, *after = NULL; + const char *target, *after = NULL, *after2 = NULL; MountParameters *p; Unit *tu; int r; @@ -354,9 +359,12 @@ static int mount_add_fstab_links(Mount *m) { if (mount_is_network(p)) { target = SPECIAL_REMOTE_FS_TARGET; - after = SPECIAL_NETWORK_TARGET; - } else + after = SPECIAL_REMOTE_FS_PRE_TARGET; + after2 = SPECIAL_NETWORK_TARGET; + } else { target = SPECIAL_LOCAL_FS_TARGET; + after = SPECIAL_LOCAL_FS_PRE_TARGET; + } if (!path_equal(m->where, "/")) if ((r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true)) < 0) @@ -369,6 +377,10 @@ static int mount_add_fstab_links(Mount *m) { if ((r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after, NULL, true)) < 0) return r; + if (after2) + if ((r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, after2, NULL, true)) < 0) + return r; + if (automount) { Unit *am; @@ -791,6 +803,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) { true, m->meta.manager->confirm_spawn, m->meta.cgroup_bondings, + m->meta.cgroup_attributes, &pid)) < 0) goto fail; @@ -1212,7 +1225,7 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) { m->failure = m->failure || !success; if (m->control_command) { - exec_status_exit(&m->control_command->exec_status, pid, code, status, m->exec_context.utmp_id); + exec_status_exit(&m->control_command->exec_status, &m->exec_context, pid, code, status); m->control_command = NULL; m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID; } @@ -1473,7 +1486,7 @@ static int mount_find_pri(char *options) { char *end, *pri; unsigned long r; - if (!(pri = mount_test_option(options, "pri="))) + if (!(pri = mount_test_option(options, "pri"))) return 0; pri += 4; @@ -1687,7 +1700,7 @@ void mount_fd_event(Manager *m, int events) { log_error("Failed to reread /proc/self/mountinfo: %s", strerror(-r)); /* Reset flags, just in case, for later calls */ - LIST_FOREACH(units_per_type, meta, m->units_per_type[UNIT_MOUNT]) { + LIST_FOREACH(units_by_type, meta, m->units_by_type[UNIT_MOUNT]) { Mount *mount = (Mount*) meta; mount->is_mounted = mount->just_mounted = mount->just_changed = false; @@ -1698,7 +1711,7 @@ void mount_fd_event(Manager *m, int events) { manager_dispatch_load_queue(m); - LIST_FOREACH(units_per_type, meta, m->units_per_type[UNIT_MOUNT]) { + LIST_FOREACH(units_by_type, meta, m->units_by_type[UNIT_MOUNT]) { Mount *mount = (Mount*) meta; if (!mount->is_mounted) { @@ -1769,19 +1782,20 @@ static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError if (who == KILL_MAIN) { dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "Mount units have no main processes"); - return -EINVAL; + return -ESRCH; } if (m->control_pid <= 0 && who == KILL_CONTROL) { dbus_set_error(error, BUS_ERROR_NO_SUCH_PROCESS, "No control process to kill"); - return -ENOENT; + return -ESRCH; } - if (m->control_pid > 0) - if (kill(m->control_pid, signo) < 0) - r = -errno; + if (who == KILL_CONTROL || who == KILL_ALL) + if (m->control_pid > 0) + if (kill(m->control_pid, signo) < 0) + r = -errno; - if (mode == KILL_CONTROL_GROUP) { + if (who == KILL_ALL && mode == KILL_CONTROL_GROUP) { int q; if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) @@ -1795,7 +1809,7 @@ static int mount_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError } if ((q = cgroup_bonding_kill_list(m->meta.cgroup_bondings, signo, false, pid_set)) < 0) - if (r != -EAGAIN && r != -ESRCH && r != -ENOENT) + if (q != -EAGAIN && q != -ESRCH && q != -ENOENT) r = q; } @@ -1834,6 +1848,10 @@ DEFINE_STRING_TABLE_LOOKUP(mount_exec_command, MountExecCommand); const UnitVTable mount_vtable = { .suffix = ".mount", + .sections = + "Unit\0" + "Mount\0" + "Install\0", .no_alias = true, .no_instances = true,