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=09efa1b6e0649f652f814cdc319d2432c95d14e5;hb=5c56a259e07661a66e806cc2fbc71de96a75f78e;hpb=09812eb764b440651f3ff4cb5d37bd343f800560 diff --git a/src/core/mount.c b/src/core/mount.c index 09efa1b6e..45c0040bd 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -750,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); @@ -854,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); @@ -1093,7 +1099,7 @@ 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)); @@ -1378,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); @@ -1409,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; @@ -1438,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); @@ -1489,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)); @@ -1507,10 +1516,6 @@ static int mount_add_one( return 0; fail: - free(w); - free(o); - free(f); - if (delete && u) unit_free(u); @@ -1584,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); @@ -1797,6 +1816,8 @@ const UnitVTable mount_vtable = { .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,