X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=swap.c;h=275f1d4a9f54c0ff1a4ab93baa761a40396323cb;hp=aacf0e8d554ba107f2e577202f9fc4dfcb8178dc;hb=2a1a539789190c2d413710bcd88f1e351400d700;hpb=07b0b134d3076fe223d6e15959b6081a74b56792 diff --git a/swap.c b/swap.c index aacf0e8d5..275f1d4a9 100644 --- a/swap.c +++ b/swap.c @@ -40,6 +40,14 @@ static const UnitActiveState state_translation_table[_SWAP_STATE_MAX] = { [SWAP_MAINTAINANCE] = UNIT_INACTIVE }; +static void swap_done(Unit *u) { + Swap *s = SWAP(u); + + assert(s); + + free(s->what); +} + static int swap_verify(Swap *s) { bool b; char *e; @@ -60,17 +68,52 @@ static int swap_verify(Swap *s) { return 0; } +int swap_add_one_mount_link(Swap *s, Mount *m) { + int r; + + assert(s); + assert(m); + + if (s->meta.load_state != UNIT_LOADED || + m->meta.load_state != UNIT_LOADED) + return 0; + + if (!path_startswith(s->what, m->where)) + return 0; + + if ((r = unit_add_dependency(UNIT(m), UNIT_BEFORE, UNIT(s), true)) < 0) + return r; + + if ((r = unit_add_dependency(UNIT(s), UNIT_REQUIRES, UNIT(m), true)) < 0) + return r; + + return 0; +} + +static int swap_add_mount_links(Swap *s) { + Meta *other; + int r; + + assert(s); + + LIST_FOREACH(units_per_type, other, s->meta.manager->units_per_type[UNIT_MOUNT]) + if ((r = swap_add_one_mount_link(s, (Mount*) other)) < 0) + return r; + + return 0; +} + static int swap_add_target_links(Swap *s) { Manager *m = s->meta.manager; Unit *tu; int r; - r = manager_load_unit(m, SPECIAL_SWAP_TARGET, NULL, &tu); - if (r < 0) + if ((r = manager_load_unit(m, SPECIAL_SWAP_TARGET, NULL, &tu)) < 0) return r; - if (!s->no_auto && (r = unit_add_dependency(tu, UNIT_WANTS, UNIT(s), true)) < 0) - return r; + if (!s->no_auto) + if ((r = unit_add_dependency(tu, UNIT_WANTS, UNIT(s), true)) < 0) + return r; return unit_add_dependency(UNIT(s), UNIT_BEFORE, tu, true); } @@ -93,12 +136,13 @@ static int swap_load(Unit *u) { path_kill_slashes(s->what); - if ((r = mount_add_node_links(u, s->what)) < 0) + if ((r = unit_add_node_link(u, s->what, + (u->meta.manager->running_as == MANAGER_INIT || + u->meta.manager->running_as == MANAGER_SYSTEM))) < 0) return r; - if (!path_startswith(s->what, "/dev/")) - if ((r = mount_add_path_links(u, s->what, true)) < 0) - return r; + if ((r = swap_add_mount_links(s)) < 0) + return r; if ((r = swap_add_target_links(s)) < 0) return r; @@ -310,7 +354,8 @@ static int swap_load_proc_swaps(Manager *m) { Meta *meta; rewind(m->proc_swaps); - fscanf(m->proc_self_mountinfo, "%*s %*s %*s %*s %*s\n"); + + (void) fscanf(m->proc_self_mountinfo, "%*s %*s %*s %*s %*s\n"); for (;;) { char *dev = NULL, *d; @@ -398,8 +443,10 @@ const UnitVTable swap_vtable = { .no_alias = true, .no_instances = true, + .no_isolate = true, .load = swap_load, + .done = swap_done, .coldplug = swap_coldplug, @@ -418,7 +465,6 @@ const UnitVTable swap_vtable = { .bus_message_handler = bus_swap_message_handler, - .shutdown = swap_shutdown, - - .enumerate = swap_enumerate + .enumerate = swap_enumerate, + .shutdown = swap_shutdown };