Blame SOURCES/0753-pid1-include-the-source-unit-in-UnitRef.patch

17b0f1
From ff80bfd94181327a5f8e0fbd70b9b7afe0c5545c Mon Sep 17 00:00:00 2001
17b0f1
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
17b0f1
Date: Tue, 13 Feb 2018 13:12:43 +0100
17b0f1
Subject: [PATCH] pid1: include the source unit in UnitRef
17b0f1
17b0f1
No functional change.
17b0f1
17b0f1
The source unit manages the reference. It allocates the UnitRef structure and
17b0f1
registers it in the target unit, and then the reference must be destroyed
17b0f1
before the source unit is destroyed. Thus, is should be OK to include the
17b0f1
pointer to the source unit, it should be live as long as the reference exists.
17b0f1
17b0f1
v2:
17b0f1
- rename refs to refs_by_target
17b0f1
17b0f1
(cherry picked from commit 7f7d01ed5804afef220ebdb29f22d8177d0d3a5c)
17b0f1
17b0f1
Related: #1718953
17b0f1
---
17b0f1
 src/core/busname.c       |  2 +-
17b0f1
 src/core/dbus-manager.c  |  2 +-
17b0f1
 src/core/dbus-unit.c     |  2 +-
17b0f1
 src/core/load-fragment.c |  6 +++---
17b0f1
 src/core/service.c       |  2 +-
17b0f1
 src/core/slice.c         |  2 +-
17b0f1
 src/core/socket.c        |  4 ++--
17b0f1
 src/core/unit.c          | 35 ++++++++++++++++++-----------------
17b0f1
 src/core/unit.h          | 12 ++++++------
17b0f1
 9 files changed, 34 insertions(+), 33 deletions(-)
17b0f1
17b0f1
diff --git a/src/core/busname.c b/src/core/busname.c
17b0f1
index a5e659049d..97886f1e05 100644
17b0f1
--- a/src/core/busname.c
17b0f1
+++ b/src/core/busname.c
17b0f1
@@ -175,7 +175,7 @@ static int busname_add_extras(BusName *n) {
17b0f1
                         if (r < 0)
17b0f1
                                 return r;
17b0f1
 
17b0f1
-                        unit_ref_set(&n->service, x);
17b0f1
+                        unit_ref_set(&n->service, u, x);
17b0f1
                 }
17b0f1
 
17b0f1
                 r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(n->service), true);
17b0f1
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
17b0f1
index 1766163b33..8267d44e1a 100644
17b0f1
--- a/src/core/dbus-manager.c
17b0f1
+++ b/src/core/dbus-manager.c
17b0f1
@@ -649,7 +649,7 @@ static int transient_unit_from_message(
17b0f1
             u->fragment_path ||
17b0f1
             u->source_path ||
17b0f1
             !strv_isempty(u->dropin_paths) ||
17b0f1
-            u->refs ||
17b0f1
+            u->refs_by_target ||
17b0f1
             set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0)
17b0f1
                 return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit %s already exists.", name);
17b0f1
 
17b0f1
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
17b0f1
index f0f75e01b0..77073308c8 100644
17b0f1
--- a/src/core/dbus-unit.c
17b0f1
+++ b/src/core/dbus-unit.c
17b0f1
@@ -967,7 +967,7 @@ static int bus_unit_set_transient_property(
17b0f1
                                 return -EINVAL;
17b0f1
 
17b0f1
                         if (mode != UNIT_CHECK) {
17b0f1
-                                unit_ref_set(&u->slice, slice);
17b0f1
+                                unit_ref_set(&u->slice, u, slice);
17b0f1
                                 unit_write_drop_in_private_format(u, mode, name, "Slice=%s\n", s);
17b0f1
                         }
17b0f1
                 }
17b0f1
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
17b0f1
index f3d0851fe2..1721fea8f3 100644
17b0f1
--- a/src/core/load-fragment.c
17b0f1
+++ b/src/core/load-fragment.c
17b0f1
@@ -1836,7 +1836,7 @@ int config_parse_socket_service(
17b0f1
                 return 0;
17b0f1
         }
17b0f1
 
17b0f1
-        unit_ref_set(&s->service, x);
17b0f1
+        unit_ref_set(&s->service, UNIT(s), x);
17b0f1
 
17b0f1
         return 0;
17b0f1
 }
17b0f1
@@ -2006,7 +2006,7 @@ int config_parse_busname_service(
17b0f1
                 return 0;
17b0f1
         }
17b0f1
 
17b0f1
-        unit_ref_set(&n->service, x);
17b0f1
+        unit_ref_set(&n->service, UNIT(n), x);
17b0f1
 
17b0f1
         return 0;
17b0f1
 }
17b0f1
@@ -2933,7 +2933,7 @@ int config_parse_unit_slice(
17b0f1
                 return 0;
17b0f1
         }
17b0f1
 
17b0f1
-        unit_ref_set(&u->slice, slice);
17b0f1
+        unit_ref_set(&u->slice, u, slice);
17b0f1
         return 0;
17b0f1
 }
17b0f1
 
17b0f1
diff --git a/src/core/service.c b/src/core/service.c
17b0f1
index 69ec916f2d..eaa588863f 100644
17b0f1
--- a/src/core/service.c
17b0f1
+++ b/src/core/service.c
17b0f1
@@ -3299,7 +3299,7 @@ int service_set_socket_fd(Service *s, int fd, Socket *sock, bool selinux_context
17b0f1
         s->socket_fd = fd;
17b0f1
         s->socket_fd_selinux_context_net = selinux_context_net;
17b0f1
 
17b0f1
-        unit_ref_set(&s->accept_socket, UNIT(sock));
17b0f1
+        unit_ref_set(&s->accept_socket, UNIT(s), UNIT(sock));
17b0f1
 
17b0f1
         return unit_add_two_dependencies(UNIT(sock), UNIT_BEFORE, UNIT_TRIGGERS, UNIT(s), false);
17b0f1
 }
17b0f1
diff --git a/src/core/slice.c b/src/core/slice.c
17b0f1
index 1cce3e1217..0985a65286 100644
17b0f1
--- a/src/core/slice.c
17b0f1
+++ b/src/core/slice.c
17b0f1
@@ -76,7 +76,7 @@ static int slice_add_parent_slice(Slice *s) {
17b0f1
         if (r < 0)
17b0f1
                 return r;
17b0f1
 
17b0f1
-        unit_ref_set(&UNIT(s)->slice, parent);
17b0f1
+        unit_ref_set(&UNIT(s)->slice, UNIT(s), parent);
17b0f1
         return 0;
17b0f1
 }
17b0f1
 
17b0f1
diff --git a/src/core/socket.c b/src/core/socket.c
17b0f1
index 3e4cdd467f..8489575de6 100644
17b0f1
--- a/src/core/socket.c
17b0f1
+++ b/src/core/socket.c
17b0f1
@@ -208,7 +208,7 @@ int socket_instantiate_service(Socket *s) {
17b0f1
                 return r;
17b0f1
 
17b0f1
         u->no_gc = true;
17b0f1
-        unit_ref_set(&s->service, u);
17b0f1
+        unit_ref_set(&s->service, UNIT(s), u);
17b0f1
 
17b0f1
         return unit_add_two_dependencies(UNIT(s), UNIT_BEFORE, UNIT_TRIGGERS, u, false);
17b0f1
 }
17b0f1
@@ -313,7 +313,7 @@ static int socket_add_extras(Socket *s) {
17b0f1
                         if (r < 0)
17b0f1
                                 return r;
17b0f1
 
17b0f1
-                        unit_ref_set(&s->service, x);
17b0f1
+                        unit_ref_set(&s->service, u, x);
17b0f1
                 }
17b0f1
 
17b0f1
                 r = unit_add_two_dependencies(u, UNIT_BEFORE, UNIT_TRIGGERS, UNIT_DEREF(s->service), true);
17b0f1
diff --git a/src/core/unit.c b/src/core/unit.c
17b0f1
index 1b8ec9a20e..5376ef862f 100644
17b0f1
--- a/src/core/unit.c
17b0f1
+++ b/src/core/unit.c
17b0f1
@@ -315,7 +315,7 @@ bool unit_may_gc(Unit *u) {
17b0f1
         if (u->no_gc)
17b0f1
                 return false;
17b0f1
 
17b0f1
-        if (u->refs)
17b0f1
+        if (u->refs_by_target)
17b0f1
                 return false;
17b0f1
 
17b0f1
         if (UNIT_VTABLE(u)->may_gc && !UNIT_VTABLE(u)->may_gc(u))
17b0f1
@@ -553,9 +553,8 @@ void unit_free(Unit *u) {
17b0f1
         condition_free_list(u->asserts);
17b0f1
 
17b0f1
         unit_ref_unset(&u->slice);
17b0f1
-
17b0f1
-        while (u->refs)
17b0f1
-                unit_ref_unset(u->refs);
17b0f1
+        while (u->refs_by_target)
17b0f1
+                unit_ref_unset(u->refs_by_target);
17b0f1
 
17b0f1
         free(u);
17b0f1
 }
17b0f1
@@ -737,8 +736,8 @@ int unit_merge(Unit *u, Unit *other) {
17b0f1
                 return r;
17b0f1
 
17b0f1
         /* Redirect all references */
17b0f1
-        while (other->refs)
17b0f1
-                unit_ref_set(other->refs, u);
17b0f1
+        while (other->refs_by_target)
17b0f1
+                unit_ref_set(other->refs_by_target, other->refs_by_target->source, u);
17b0f1
 
17b0f1
         /* Merge dependencies */
17b0f1
         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
17b0f1
@@ -2493,7 +2492,7 @@ int unit_add_default_slice(Unit *u, CGroupContext *c) {
17b0f1
         if (r < 0)
17b0f1
                 return r;
17b0f1
 
17b0f1
-        unit_ref_set(&u->slice, slice);
17b0f1
+        unit_ref_set(&u->slice, u, slice);
17b0f1
         return 0;
17b0f1
 }
17b0f1
 
17b0f1
@@ -3130,30 +3129,32 @@ int unit_get_unit_file_preset(Unit *u) {
17b0f1
         return u->unit_file_preset;
17b0f1
 }
17b0f1
 
17b0f1
-Unit* unit_ref_set(UnitRef *ref, Unit *u) {
17b0f1
+Unit* unit_ref_set(UnitRef *ref, Unit *source, Unit *target) {
17b0f1
         assert(ref);
17b0f1
-        assert(u);
17b0f1
+        assert(source);
17b0f1
+        assert(target);
17b0f1
 
17b0f1
-        if (ref->unit)
17b0f1
+        if (ref->target)
17b0f1
                 unit_ref_unset(ref);
17b0f1
 
17b0f1
-        ref->unit = u;
17b0f1
-        LIST_PREPEND(refs, u->refs, ref);
17b0f1
-        return u;
17b0f1
+        ref->source = source;
17b0f1
+        ref->target = target;
17b0f1
+        LIST_PREPEND(refs_by_target, target->refs_by_target, ref);
17b0f1
+        return target;
17b0f1
 }
17b0f1
 
17b0f1
 void unit_ref_unset(UnitRef *ref) {
17b0f1
         assert(ref);
17b0f1
 
17b0f1
-        if (!ref->unit)
17b0f1
+        if (!ref->target)
17b0f1
                 return;
17b0f1
 
17b0f1
         /* We are about to drop a reference to the unit, make sure the garbage collection has a look at it as it might
17b0f1
          * be unreferenced now. */
17b0f1
-        unit_add_to_gc_queue(ref->unit);
17b0f1
+        unit_add_to_gc_queue(ref->target);
17b0f1
 
17b0f1
-        LIST_REMOVE(refs, ref->unit->refs, ref);
17b0f1
-        ref->unit = NULL;
17b0f1
+        LIST_REMOVE(refs_by_target, ref->target->refs_by_target, ref);
17b0f1
+        ref->source = ref->target = NULL;
17b0f1
 }
17b0f1
 
17b0f1
 int unit_patch_contexts(Unit *u) {
17b0f1
diff --git a/src/core/unit.h b/src/core/unit.h
17b0f1
index 3f411a1793..a6e21d60ce 100644
17b0f1
--- a/src/core/unit.h
17b0f1
+++ b/src/core/unit.h
17b0f1
@@ -84,8 +84,8 @@ struct UnitRef {
17b0f1
          * that we can merge two units if necessary and correct all
17b0f1
          * references to them */
17b0f1
 
17b0f1
-        Unit* unit;
17b0f1
-        LIST_FIELDS(UnitRef, refs);
17b0f1
+        Unit *source, *target;
17b0f1
+        LIST_FIELDS(UnitRef, refs_by_target);
17b0f1
 };
17b0f1
 
17b0f1
 struct Unit {
17b0f1
@@ -125,7 +125,7 @@ struct Unit {
17b0f1
         char *job_timeout_reboot_arg;
17b0f1
 
17b0f1
         /* References to this */
17b0f1
-        LIST_HEAD(UnitRef, refs);
17b0f1
+        LIST_HEAD(UnitRef, refs_by_target);
17b0f1
 
17b0f1
         /* Conditions to check */
17b0f1
         LIST_HEAD(Condition, conditions);
17b0f1
@@ -591,11 +591,11 @@ void unit_trigger_notify(Unit *u);
17b0f1
 UnitFileState unit_get_unit_file_state(Unit *u);
17b0f1
 int unit_get_unit_file_preset(Unit *u);
17b0f1
 
17b0f1
-Unit* unit_ref_set(UnitRef *ref, Unit *u);
17b0f1
+Unit* unit_ref_set(UnitRef *ref, Unit *source, Unit *target);
17b0f1
 void unit_ref_unset(UnitRef *ref);
17b0f1
 
17b0f1
-#define UNIT_DEREF(ref) ((ref).unit)
17b0f1
-#define UNIT_ISSET(ref) (!!(ref).unit)
17b0f1
+#define UNIT_DEREF(ref) ((ref).target)
17b0f1
+#define UNIT_ISSET(ref) (!!(ref).target)
17b0f1
 
17b0f1
 int unit_patch_contexts(Unit *u);
17b0f1