diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/unit.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/core/unit.c b/src/core/unit.c index 409668f6d2..44f1d5e206 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1083,6 +1083,7 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) { /* Common implementation for multiple backends */ int unit_load_fragment_and_dropin(Unit *u) { + Unit *t; int r; assert(u); @@ -1095,16 +1096,18 @@ int unit_load_fragment_and_dropin(Unit *u) { if (u->load_state == UNIT_STUB) return -ENOENT; - /* Load drop-in directory data */ - r = unit_load_dropin(unit_follow_merge(u)); - if (r < 0) - return r; + /* If the unit is an alias and the final unit has already been + * loaded, there's no point in reloading the dropins one more time. */ + t = unit_follow_merge(u); + if (t != u && t->load_state != UNIT_STUB) + return 0; - return 0; + return unit_load_dropin(t); } /* Common implementation for multiple backends */ int unit_load_fragment_and_dropin_optional(Unit *u) { + Unit *t; int r; assert(u); @@ -1120,12 +1123,13 @@ int unit_load_fragment_and_dropin_optional(Unit *u) { if (u->load_state == UNIT_STUB) u->load_state = UNIT_LOADED; - /* Load drop-in directory data */ - r = unit_load_dropin(unit_follow_merge(u)); - if (r < 0) - return r; + /* If the unit is an alias and the final unit has already been + * loaded, there's no point in reloading the dropins one more time. */ + t = unit_follow_merge(u); + if (t != u && t->load_state != UNIT_STUB) + return 0; - return 0; + return unit_load_dropin(t); } int unit_add_default_target_dependency(Unit *u, Unit *target) { |