X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fswap.c;h=b2ca048bcbc0c23c3d476243b1e89e39dc3fb4b7;hb=56dec05d29098b151421625c68525c2c3961e574;hp=2e12824049a6ff9bbd49d57da01c092f6908a3e4;hpb=86b23b07c96b185126bfbf217227dad362a20c25;p=elogind.git diff --git a/src/core/swap.c b/src/core/swap.c index 2e1282404..b2ca048bc 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -213,7 +213,7 @@ static int swap_add_device_links(Swap *s) { } static int swap_add_default_dependencies(Swap *s) { - bool nofail = false, noauto = false; + bool nofail, noauto; int r; assert(s); @@ -228,23 +228,25 @@ static int swap_add_default_dependencies(Swap *s) { if (r < 0) return r; - if (s->from_fragment) { - SwapParameters *p = &s->parameters_fragment; + if (!s->from_fragment) + /* The swap unit can either be for an alternative device name, in which + * case we don't need to add the dependency on swap.target because this unit + * is following a different unit which will have this dependency added, + * or it can be derived from /proc/swaps, in which case it was started + * manually, and should not become a dependency of swap.target. */ + return 0; - nofail = p->nofail; - noauto = p->noauto; - } + nofail = s->parameters_fragment.nofail; + noauto = s->parameters_fragment.noauto; if (!noauto) { if (nofail) r = unit_add_dependency_by_name_inverse(UNIT(s), UNIT_WANTS, SPECIAL_SWAP_TARGET, NULL, true); else r = unit_add_two_dependencies_by_name_inverse(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SWAP_TARGET, NULL, true); - if (r < 0) - return r; } - return 0; + return r < 0 ? r : 0; } static int swap_verify(Swap *s) { @@ -610,7 +612,7 @@ static void swap_dump(Unit *u, FILE *f, const char *prefix) { prefix, p->priority, prefix, yes_no(p->noauto), prefix, yes_no(p->nofail), - prefix, p->discard); + prefix, p->discard ?: "none"); if (s->control_pid > 0) fprintf(f, @@ -1208,11 +1210,25 @@ static Unit *swap_following(Unit *u) { assert(s); - if (streq_ptr(s->what, s->devnode)) + /* If the user configured the swap through /etc/fstab or + * a device unit, follow that. */ + + if (s->from_fragment) return NULL; - /* Make everybody follow the unit that's named after the swap - * device in the kernel */ + LIST_FOREACH_AFTER(same_devnode, other, s) + if (other->from_fragment) + return UNIT(other); + + LIST_FOREACH_BEFORE(same_devnode, other, s) + if (other->from_fragment) + return UNIT(other); + + /* Otherwise make everybody follow the unit that's named after + * the swap device in the kernel */ + + if (streq_ptr(s->what, s->devnode)) + return NULL; LIST_FOREACH_AFTER(same_devnode, other, s) if (streq_ptr(other->what, other->devnode)) @@ -1225,6 +1241,7 @@ static Unit *swap_following(Unit *u) { first = other; } + /* Fall back to the first on the list */ return UNIT(first); }