}
static int swap_add_default_dependencies(Swap *s) {
- bool nofail = false, noauto = false;
+ bool nofail, noauto;
int r;
assert(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) {
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))
first = other;
}
+ /* Fall back to the first on the list */
return UNIT(first);
}