X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmount.c;h=e46c72a644fcc088a41c88e7a6c3792f6ca30c39;hb=486cd82c8f7642016895b72bcc09a1bfe885a783;hp=bf1d43396692db35d968e513bb49c684ca14afaf;hpb=5bcb0f2ba0615897662fcd4f6227d066781c6fc2;p=elogind.git diff --git a/src/core/mount.c b/src/core/mount.c index bf1d43396..e46c72a64 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -217,7 +217,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; @@ -772,6 +773,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; @@ -789,6 +794,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; @@ -814,7 +820,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); } @@ -1095,8 +1103,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; } @@ -1153,22 +1159,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); @@ -1611,6 +1601,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); @@ -1763,6 +1760,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"