X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fmount.c;h=77493dbd3c40c4ca72a9a96e4a385490c6a4199d;hp=99e7cedc459da0144f7ff79fd388a50cdb5c307d;hb=051dfe8708e394a64e8ef6c281228763481ad32c;hpb=718db96199eb307751264e4163555662c9a389fa diff --git a/src/core/mount.c b/src/core/mount.c index 99e7cedc4..77493dbd3 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -138,11 +138,13 @@ static void mount_init(Unit *u) { m->directory_mode = 0755; exec_context_init(&m->exec_context); + kill_context_init(&m->kill_context); + cgroup_context_init(&m->cgroup_context); if (unit_has_name(u, "-.mount")) { /* Don't allow start/stop for root directory */ - UNIT(m)->refuse_manual_start = true; - UNIT(m)->refuse_manual_stop = true; + u->refuse_manual_start = true; + u->refuse_manual_stop = true; } else { /* The stdio/kmsg bridge socket is on /, in order to avoid a * dep loop, don't use kmsg logging for -.mount */ @@ -150,9 +152,6 @@ static void mount_init(Unit *u) { m->exec_context.std_error = u->manager->default_std_error; } - kill_context_init(&m->kill_context); - cgroup_context_init(&m->cgroup_context); - /* We need to make sure that /bin/mount is always called in * the same process group as us, so that the autofs kernel * side doesn't send us another mount request while we are @@ -161,7 +160,7 @@ static void mount_init(Unit *u) { m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID; - UNIT(m)->ignore_on_isolate = true; + u->ignore_on_isolate = true; } static int mount_arm_timer(Mount *m) { @@ -217,7 +216,8 @@ static void mount_done(Unit *u) { mount_parameters_done(&m->parameters_fragment); cgroup_context_done(&m->cgroup_context); - exec_context_done(&m->exec_context, manager_is_reloading_or_reexecuting(u->manager)); + exec_context_done(&m->exec_context); + m->exec_runtime = exec_runtime_unref(m->exec_runtime); exec_command_done_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX); m->control_command = NULL; @@ -502,29 +502,22 @@ static int mount_verify(Mount *m) { b = unit_has_name(UNIT(m), e); if (!b) { - log_error_unit(UNIT(m)->id, - "%s's Where setting doesn't match unit name. Refusing.", - UNIT(m)->id); + log_error_unit(UNIT(m)->id, "%s's Where= setting doesn't match unit name. Refusing.", UNIT(m)->id); return -EINVAL; } if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) { - log_error_unit(UNIT(m)->id, - "Cannot create mount unit for API file system %s. Refusing.", - m->where); + log_error_unit(UNIT(m)->id, "Cannot create mount unit for API file system %s. Refusing.", m->where); return -EINVAL; } if (UNIT(m)->fragment_path && !m->parameters_fragment.what) { - log_error_unit(UNIT(m)->id, - "%s's What setting is missing. Refusing.", UNIT(m)->id); + log_error_unit(UNIT(m)->id, "%s's What setting is missing. Refusing.", UNIT(m)->id); return -EBADMSG; } if (m->exec_context.pam_name && m->kill_context.kill_mode != KILL_CONTROL_GROUP) { - log_error_unit(UNIT(m)->id, - "%s has PAM enabled. Kill mode must be set to control-group'. Refusing.", - UNIT(m)->id); + log_error_unit(UNIT(m)->id, "%s has PAM enabled. Kill mode must be set to control-group'. Refusing.",UNIT(m)->id); return -EINVAL; } @@ -535,7 +528,9 @@ static int mount_add_extras(Mount *m) { Unit *u = UNIT(m); int r; - if (UNIT(m)->fragment_path) + assert(m); + + if (u->fragment_path) m->from_fragment = true; if (!m->where) { @@ -550,7 +545,7 @@ static int mount_add_extras(Mount *m) { if (r < 0) return r; - if (!UNIT(m)->description) { + if (!u->description) { r = unit_set_description(u, m->where); if (r < 0) return r; @@ -568,7 +563,7 @@ static int mount_add_extras(Mount *m) { if (r < 0) return r; - if (UNIT(m)->default_dependencies) { + if (u->default_dependencies) { r = mount_add_default_dependencies(m); if (r < 0) return r; @@ -582,6 +577,10 @@ static int mount_add_extras(Mount *m) { if (r < 0) return r; + r = unit_exec_context_defaults(u, &m->exec_context); + if (r < 0) + return r; + return 0; } @@ -605,10 +604,6 @@ static int mount_load(Unit *u) { r = mount_add_extras(m); if (r < 0) return r; - - r = unit_exec_context_defaults(u, &m->exec_context); - if (r < 0) - return r; } return mount_verify(m); @@ -694,34 +689,33 @@ static int mount_coldplug(Unit *u) { else if (m->from_proc_self_mountinfo) new_state = MOUNT_MOUNTED; - if (new_state != m->state) { - - if (new_state == MOUNT_MOUNTING || - new_state == MOUNT_MOUNTING_DONE || - new_state == MOUNT_REMOUNTING || - new_state == MOUNT_UNMOUNTING || - new_state == MOUNT_MOUNTING_SIGTERM || - new_state == MOUNT_MOUNTING_SIGKILL || - new_state == MOUNT_UNMOUNTING_SIGTERM || - new_state == MOUNT_UNMOUNTING_SIGKILL || - new_state == MOUNT_REMOUNTING_SIGTERM || - new_state == MOUNT_REMOUNTING_SIGKILL) { - - if (m->control_pid <= 0) - return -EBADMSG; - - r = unit_watch_pid(UNIT(m), m->control_pid); - if (r < 0) - return r; + if (new_state == m->state) + return 0; - r = mount_arm_timer(m); - if (r < 0) - return r; - } + if (new_state == MOUNT_MOUNTING || + new_state == MOUNT_MOUNTING_DONE || + new_state == MOUNT_REMOUNTING || + new_state == MOUNT_UNMOUNTING || + new_state == MOUNT_MOUNTING_SIGTERM || + new_state == MOUNT_MOUNTING_SIGKILL || + new_state == MOUNT_UNMOUNTING_SIGTERM || + new_state == MOUNT_UNMOUNTING_SIGKILL || + new_state == MOUNT_REMOUNTING_SIGTERM || + new_state == MOUNT_REMOUNTING_SIGKILL) { + + if (m->control_pid <= 0) + return -EBADMSG; + + r = unit_watch_pid(UNIT(m), m->control_pid); + if (r < 0) + return r; - mount_set_state(m, new_state); + r = mount_arm_timer(m); + if (r < 0) + return r; } + mount_set_state(m, new_state); return 0; } @@ -773,6 +767,10 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) { unit_realize_cgroup(UNIT(m)); + r = unit_setup_exec_runtime(UNIT(m)); + if (r < 0) + goto fail; + r = mount_arm_timer(m); if (r < 0) goto fail; @@ -790,6 +788,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) { UNIT(m)->cgroup_path, UNIT(m)->id, NULL, + m->exec_runtime, &pid); if (r < 0) goto fail; @@ -815,7 +814,9 @@ static void mount_enter_dead(Mount *m, MountResult f) { if (f != MOUNT_SUCCESS) m->result = f; - exec_context_tmp_dirs_done(&m->exec_context); + exec_runtime_destroy(m->exec_runtime); + m->exec_runtime = exec_runtime_unref(m->exec_runtime); + mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD); } @@ -966,12 +967,6 @@ fail: mount_enter_dead(m, MOUNT_FAILURE_RESOURCES); } -static void mount_enter_mounting_done(Mount *m) { - assert(m); - - mount_set_state(m, MOUNT_MOUNTING_DONE); -} - static void mount_enter_remounting(Mount *m) { int r; @@ -1102,8 +1097,6 @@ static int mount_serialize(Unit *u, FILE *f, FDSet *fds) { if (m->control_command_id >= 0) unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id)); - exec_context_serialize(&m->exec_context, UNIT(m), f); - return 0; } @@ -1160,22 +1153,6 @@ static int mount_deserialize_item(Unit *u, const char *key, const char *value, F m->control_command_id = id; m->control_command = m->exec_command + id; } - } else if (streq(key, "tmp-dir")) { - char *t; - - t = strdup(value); - if (!t) - return log_oom(); - - m->exec_context.tmp_dir = t; - } else if (streq(key, "var-tmp-dir")) { - char *t; - - t = strdup(value); - if (!t) - return log_oom(); - - m->exec_context.var_tmp_dir = t; } else log_debug_unit(UNIT(m)->id, "Unknown serialization key '%s'", key); @@ -1618,6 +1595,13 @@ static int mount_enumerate(Manager *m) { r = sd_event_add_io(m->event, fileno(m->proc_self_mountinfo), EPOLLPRI, mount_dispatch_io, m, &m->mount_event_source); if (r < 0) goto fail; + + /* Dispatch this before we dispatch SIGCHLD, so that + * we always get the events from /proc/self/mountinfo + * before the SIGCHLD of /bin/mount. */ + r = sd_event_source_set_priority(m->mount_event_source, -10); + if (r < 0) + goto fail; } r = mount_load_proc_self_mountinfo(m, false); @@ -1691,7 +1675,7 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, break; case MOUNT_MOUNTING: - mount_enter_mounting_done(mount); + mount_set_state(mount, MOUNT_MOUNTING_DONE); break; default: @@ -1770,6 +1754,7 @@ const UnitVTable mount_vtable = { .exec_context_offset = offsetof(Mount, exec_context), .cgroup_context_offset = offsetof(Mount, cgroup_context), .kill_context_offset = offsetof(Mount, kill_context), + .exec_runtime_offset = offsetof(Mount, exec_runtime), .sections = "Unit\0"