valeriyvdovin / rpms / systemd

Forked from rpms/systemd 4 years ago
Clone

Blame SOURCES/0297-core-look-for-instance-when-processing-template-name.patch

1abbee
From 0e6ec33b5e8c8790e60d1b79801dc360dad010d3 Mon Sep 17 00:00:00 2001
1abbee
From: Michal Sekletar <msekleta@redhat.com>
1abbee
Date: Wed, 16 Mar 2016 15:47:18 +0100
1abbee
Subject: [PATCH] core: look for instance when processing template name
1abbee
1abbee
If first attempt to merge units failed and we are trying to do
1abbee
merge the other way around and at the same time we are working with
1abbee
template name, then other unit can't possibly be template, because it is
1abbee
not possible to have template unit running, only instances of the
1abbee
template. Thus we need to look for already active instance instead.
1abbee
1abbee
rhel-only (upstream review pending)
1abbee
1abbee
Related: #1159308
1abbee
---
1abbee
 src/core/load-fragment.c | 11 ++++++++++-
1abbee
 1 file changed, 10 insertions(+), 1 deletion(-)
1abbee
1abbee
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
181b3f
index 70c09188a..b188ec99d 100644
1abbee
--- a/src/core/load-fragment.c
1abbee
+++ b/src/core/load-fragment.c
1abbee
@@ -3472,8 +3472,17 @@ static int merge_by_names(Unit **u, Set *names, const char *id) {
1abbee
                         /* Hmm, we couldn't merge the other unit into
1abbee
                          * ours? Then let's try it the other way
1abbee
                          * round */
1abbee
+                        if (unit_name_is_template(k) && (*u)->instance) {
1abbee
+                                _cleanup_free_ char *instance = NULL;
1abbee
+
1abbee
+                                instance = unit_name_replace_instance(k, (*u)->instance);
1abbee
+                                if(!instance)
1abbee
+                                        return -ENOMEM;
1abbee
+                                other = manager_get_unit((*u)->manager, instance);
1abbee
+
1abbee
+                        } else
1abbee
+                                other = manager_get_unit((*u)->manager, k);
1abbee
 
1abbee
-                        other = manager_get_unit((*u)->manager, k);
1abbee
                         free(k);
1abbee
 
1abbee
                         if (other) {