X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fmount.c;h=45c0040bd1e0541f30086518b748aa6fc9b4d08d;hp=634dff19a978a28ccf554eaae940ec4517ad4b54;hb=5c56a259e07661a66e806cc2fbc71de96a75f78e;hpb=290837072b136624f1f3d941c7274e4b1b275021 diff --git a/src/core/mount.c b/src/core/mount.c index 634dff19a..45c0040bd 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -138,6 +138,8 @@ 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 */ @@ -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 @@ -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); @@ -755,8 +750,8 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) { if (m->control_pid > 0) fprintf(f, - "%sControl PID: %lu\n", - prefix, (unsigned long) m->control_pid); + "%sControl PID: "PID_FMT"\n", + prefix, m->control_pid); exec_context_dump(&m->exec_context, f, prefix); kill_context_dump(&m->kill_context, f, prefix); @@ -772,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; @@ -788,7 +787,9 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) { UNIT(m)->manager->cgroup_supported, UNIT(m)->cgroup_path, UNIT(m)->id, + 0, NULL, + m->exec_runtime, &pid); if (r < 0) goto fail; @@ -814,7 +815,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); } @@ -851,8 +854,14 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) { goto fail; mount_set_state(m, state); - } else if (state == MOUNT_REMOUNTING_SIGTERM || state == MOUNT_REMOUNTING_SIGKILL) + } else if (state == MOUNT_REMOUNTING_SIGTERM) + mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_SUCCESS); + else if (state == MOUNT_REMOUNTING_SIGKILL) mount_enter_mounted(m, MOUNT_SUCCESS); + else if (state == MOUNT_MOUNTING_SIGTERM) + mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_SUCCESS); + else if (state == MOUNT_UNMOUNTING_SIGTERM) + mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_SUCCESS); else mount_enter_dead(m, MOUNT_SUCCESS); @@ -1090,13 +1099,11 @@ static int mount_serialize(Unit *u, FILE *f, FDSet *fds) { unit_serialize_item(u, f, "reload-result", mount_result_to_string(m->reload_result)); if (m->control_pid > 0) - unit_serialize_item_format(u, f, "control-pid", "%lu", (unsigned long) m->control_pid); + unit_serialize_item_format(u, f, "control-pid", PID_FMT, m->control_pid); 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 +1160,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); @@ -1393,12 +1384,13 @@ static int mount_add_one( const char *options, const char *fstype, bool set_flags) { - int r; - Unit *u; - bool delete; - char *e, *w = NULL, *o = NULL, *f = NULL; - MountParameters *p; + + _cleanup_free_ char *e = NULL, *w = NULL, *o = NULL, *f = NULL; bool load_extras = false; + MountParameters *p; + bool delete; + Unit *u; + int r; assert(m); assert(what); @@ -1424,20 +1416,13 @@ static int mount_add_one( u = manager_get_unit(m, e); if (!u) { - const char* const target = - fstype_is_network(fstype) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET; - delete = true; u = unit_new(m, sizeof(Mount)); - if (!u) { - free(e); + if (!u) return -ENOMEM; - } r = unit_add_name(u, e); - free(e); - if (r < 0) goto fail; @@ -1453,20 +1438,26 @@ static int mount_add_one( goto fail; } - r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true); - if (r < 0) - goto fail; - if (should_umount(MOUNT(u))) { - r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true); + if (m->running_as == SYSTEMD_SYSTEM) { + const char* target; + + target = fstype_is_network(fstype) ? SPECIAL_REMOTE_FS_TARGET : SPECIAL_LOCAL_FS_TARGET; + + r = unit_add_dependency_by_name(u, UNIT_BEFORE, target, NULL, true); if (r < 0) goto fail; + + if (should_umount(MOUNT(u))) { + r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true); + if (r < 0) + goto fail; + } } unit_add_to_load_queue(u); } else { delete = false; - free(e); if (!MOUNT(u)->where) { MOUNT(u)->where = strdup(where); @@ -1504,12 +1495,15 @@ static int mount_add_one( free(p->what); p->what = w; + w = NULL; free(p->options); p->options = o; + o = NULL; free(p->fstype); p->fstype = f; + f = NULL; if (load_extras) { r = mount_add_extras(MOUNT(u)); @@ -1522,10 +1516,6 @@ static int mount_add_one( return 0; fail: - free(w); - free(o); - free(f); - if (delete && u) unit_free(u); @@ -1599,6 +1589,20 @@ static void mount_shutdown(Manager *m) { } } +static int mount_get_timeout(Unit *u, uint64_t *timeout) { + Mount *m = MOUNT(u); + int r; + + if (!m->timer_event_source) + return 0; + + r = sd_event_source_get_time(m->timer_event_source, timeout); + if (r < 0) + return r; + + return 1; +} + static int mount_enumerate(Manager *m) { int r; assert(m); @@ -1770,6 +1774,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" @@ -1808,10 +1813,11 @@ const UnitVTable mount_vtable = { .bus_interface = "org.freedesktop.systemd1.Mount", .bus_vtable = bus_mount_vtable, - .bus_changing_properties = bus_mount_changing_properties, .bus_set_property = bus_mount_set_property, .bus_commit_properties = bus_mount_commit_properties, + .get_timeout = mount_get_timeout, + .enumerate = mount_enumerate, .shutdown = mount_shutdown,