[systemd-devel] [RFC] [PATCH] core: avoid duplicate unit property set

WaLyong Cho walyong.cho at samsung.com
Sun Dec 7 22:12:03 PST 2014


Currently, unit property set apis set unit property and also make a
dropin files in each dbus-xyz.c. And the dropin will set its
properties again in unit_load().
So don't need to set property immediatly. That will be set next
unit_load(). Just write dropin files only.
---
 src/core/dbus-cgroup.c   | 325 ++++++++++++++---------------------------------
 src/core/dbus-cgroup.h   |   2 +-
 src/core/dbus-execute.c  |  77 +++--------
 src/core/dbus-execute.h  |   2 +-
 src/core/dbus-kill.c     |  26 ++--
 src/core/dbus-kill.h     |   2 +-
 src/core/dbus-mount.c    |   8 +-
 src/core/dbus-scope.c    |   6 +-
 src/core/dbus-service.c  |  77 +++++------
 src/core/dbus-slice.c    |   6 +-
 src/core/dbus-socket.c   |   6 +-
 src/core/dbus-swap.c     |   6 +-
 src/core/dbus-unit.c     |  12 +-
 src/core/load-fragment.c |  61 ++++++---
 14 files changed, 227 insertions(+), 389 deletions(-)

diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c
index db99834..ffbd8d5 100644
--- a/src/core/dbus-cgroup.c
+++ b/src/core/dbus-cgroup.c
@@ -24,6 +24,7 @@
 #include "cgroup-util.h"
 #include "cgroup.h"
 #include "dbus-cgroup.h"
+#include "strv.h"
 
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_cgroup_device_policy, cgroup_device_policy, CGroupDevicePolicy);
 
@@ -173,16 +174,15 @@ const sd_bus_vtable bus_cgroup_vtable[] = {
 
 static int bus_cgroup_set_transient_property(
                 Unit *u,
-                CGroupContext *c,
                 const char *name,
                 sd_bus_message *message,
                 UnitSetPropertiesMode mode,
                 sd_bus_error *error) {
 
+
         int r;
 
         assert(u);
-        assert(c);
         assert(name);
         assert(message);
 
@@ -194,8 +194,9 @@ static int bus_cgroup_set_transient_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        c->delegate = b;
-                        unit_write_drop_in_private(u, mode, name, b ? "Delegate=yes" : "Delegate=no");
+                        r = unit_write_drop_in_private(u, mode, name, b ? "Delegate=yes" : "Delegate=no");
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -206,7 +207,6 @@ static int bus_cgroup_set_transient_property(
 
 int bus_cgroup_set_property(
                 Unit *u,
-                CGroupContext *c,
                 const char *name,
                 sd_bus_message *message,
                 UnitSetPropertiesMode mode,
@@ -215,7 +215,6 @@ int bus_cgroup_set_property(
         int r;
 
         assert(u);
-        assert(c);
         assert(name);
         assert(message);
 
@@ -227,9 +226,9 @@ int bus_cgroup_set_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        c->cpu_accounting = b;
-                        u->cgroup_realized_mask &= ~CGROUP_CPUACCT;
-                        unit_write_drop_in_private(u, mode, name, b ? "CPUAccounting=yes" : "CPUAccounting=no");
+                        r = unit_write_drop_in_private(u, mode, name, b ? "CPUAccounting=yes" : "CPUAccounting=no");
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -251,9 +250,9 @@ int bus_cgroup_set_property(
                 }
 
                 if (mode != UNIT_CHECK) {
-                        c->cpu_shares = ul;
-                        u->cgroup_realized_mask &= ~CGROUP_CPU;
-                        unit_write_drop_in_private_format(u, mode, name, "CPUShares=%lu", ul);
+                        r = unit_write_drop_in_private_format(u, mode, name, "CPUShares=%lu", ul);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -275,9 +274,9 @@ int bus_cgroup_set_property(
                 }
 
                 if (mode != UNIT_CHECK) {
-                        c->startup_cpu_shares = ul;
-                        u->cgroup_realized_mask &= ~CGROUP_CPU;
-                        unit_write_drop_in_private_format(u, mode, name, "StartupCPUShares=%lu", ul);
+                        r = unit_write_drop_in_private_format(u, mode, name, "StartupCPUShares=%lu", ul);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -293,9 +292,9 @@ int bus_cgroup_set_property(
                         return sd_bus_error_set_errnof(error, EINVAL, "CPUQuotaPerSecUSec value out of range");
 
                 if (mode != UNIT_CHECK) {
-                        c->cpu_quota_per_sec_usec = u64;
-                        u->cgroup_realized_mask &= ~CGROUP_CPU;
-                        unit_write_drop_in_private_format(u, mode, "CPUQuota", "CPUQuota=%0.f%%", (double) (c->cpu_quota_per_sec_usec / 10000));
+                        r = unit_write_drop_in_private_format(u, mode, "CPUQuota", "CPUQuota=%0.f%%", (double) (u64 / 10000));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -308,9 +307,9 @@ int bus_cgroup_set_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        c->blockio_accounting = b;
-                        u->cgroup_realized_mask &= ~CGROUP_BLKIO;
-                        unit_write_drop_in_private(u, mode, name, b ? "BlockIOAccounting=yes" : "BlockIOAccounting=no");
+                        r = unit_write_drop_in_private(u, mode, name, b ? "BlockIOAccounting=yes" : "BlockIOAccounting=no");
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -332,9 +331,9 @@ int bus_cgroup_set_property(
                 }
 
                 if (mode != UNIT_CHECK) {
-                        c->blockio_weight = ul;
-                        u->cgroup_realized_mask &= ~CGROUP_BLKIO;
-                        unit_write_drop_in_private_format(u, mode, name, "BlockIOWeight=%lu", ul);
+                        r = unit_write_drop_in_private_format(u, mode, name, "BlockIOWeight=%lu", ul);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -356,58 +355,38 @@ int bus_cgroup_set_property(
                 }
 
                 if (mode != UNIT_CHECK) {
-                        c->startup_blockio_weight = ul;
-                        u->cgroup_realized_mask &= ~CGROUP_BLKIO;
-                        unit_write_drop_in_private_format(u, mode, name, "StartupBlockIOWeight=%lu", ul);
+                        r = unit_write_drop_in_private_format(u, mode, name, "StartupBlockIOWeight=%lu", ul);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
 
-        } else if (streq(name, "BlockIOReadBandwidth") || streq(name, "BlockIOWriteBandwidth")) {
+        } else if (STR_IN_SET(name,
+                              "BlockIOReadBandwidth",
+                              "BlockIOWriteBandwidth")) {
                 const char *path;
-                bool read = true;
-                unsigned n = 0;
                 uint64_t u64;
+                _cleanup_free_ char *buf = NULL;
+                _cleanup_fclose_ FILE *f = NULL;
+
+                if (mode != UNIT_CHECK) {
+                        size_t size = 0;
 
-                if (streq(name, "BlockIOWriteBandwidth"))
-                        read = false;
+                        f = open_memstream(&buf, &size);
+                        if (!f)
+                                return -ENOMEM;
+
+                        fprintf(f, "%s=\n", name);
+                }
 
                 r = sd_bus_message_enter_container(message, 'a', "(st)");
                 if (r < 0)
                         return r;
 
-                while ((r = sd_bus_message_read(message, "(st)", &path, &u64)) > 0) {
-
-                        if (mode != UNIT_CHECK) {
-                                CGroupBlockIODeviceBandwidth *a = NULL, *b;
-
-                                LIST_FOREACH(device_bandwidths, b, c->blockio_device_bandwidths) {
-                                        if (path_equal(path, b->path) && read == b->read) {
-                                                a = b;
-                                                break;
-                                        }
-                                }
-
-                                if (!a) {
-                                        a = new0(CGroupBlockIODeviceBandwidth, 1);
-                                        if (!a)
-                                                return -ENOMEM;
-
-                                        a->read = read;
-                                        a->path = strdup(path);
-                                        if (!a->path) {
-                                                free(a);
-                                                return -ENOMEM;
-                                        }
-
-                                        LIST_PREPEND(device_bandwidths, c->blockio_device_bandwidths, a);
-                                }
-
-                                a->bandwidth = u64;
-                        }
-
-                        n++;
-                }
+                while ((r = sd_bus_message_read(message, "(st)", &path, &u64)) > 0)
+                        if (mode != UNIT_CHECK)
+                                fprintf(f, "%s=%s %" PRIu64 "\n", name, path, u64);
                 if (r < 0)
                         return r;
 
@@ -416,112 +395,49 @@ int bus_cgroup_set_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        CGroupBlockIODeviceBandwidth *a, *next;
-                        _cleanup_free_ char *buf = NULL;
-                        _cleanup_fclose_ FILE *f = NULL;
-                        size_t size = 0;
-
-                        if (n == 0) {
-                                LIST_FOREACH_SAFE(device_bandwidths, a, next, c->blockio_device_bandwidths)
-                                        if (a->read == read)
-                                                cgroup_context_free_blockio_device_bandwidth(c, a);
-                        }
-
-                        u->cgroup_realized_mask &= ~CGROUP_BLKIO;
-
-                        f = open_memstream(&buf, &size);
-                        if (!f)
-                                return -ENOMEM;
-
-                         if (read) {
-                                fputs("BlockIOReadBandwidth=\n", f);
-                                 LIST_FOREACH(device_bandwidths, a, c->blockio_device_bandwidths)
-                                        if (a->read)
-                                                fprintf(f, "BlockIOReadBandwidth=%s %" PRIu64 "\n", a->path, a->bandwidth);
-                        } else {
-                                fputs("BlockIOWriteBandwidth=\n", f);
-                                LIST_FOREACH(device_bandwidths, a, c->blockio_device_bandwidths)
-                                        if (!a->read)
-                                                fprintf(f, "BlockIOWriteBandwidth=%s %" PRIu64 "\n", a->path, a->bandwidth);
-                        }
-
                         fflush(f);
-                        unit_write_drop_in_private(u, mode, name, buf);
+                        r = unit_write_drop_in_private(u, mode, name, buf);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
 
         } else if (streq(name, "BlockIODeviceWeight")) {
+                _cleanup_free_ char *buf = NULL;
+                _cleanup_fclose_ FILE *f = NULL;
                 const char *path;
                 uint64_t u64;
-                unsigned n = 0;
+
+                if (mode != UNIT_CHECK) {
+                        size_t size = 0;
+
+                        f = open_memstream(&buf, &size);
+                        if (!f)
+                                return -ENOMEM;
+
+                        fputs("BlockIODeviceWeight=\n", f);
+                }
 
                 r = sd_bus_message_enter_container(message, 'a', "(st)");
                 if (r < 0)
                         return r;
 
-                while ((r = sd_bus_message_read(message, "(st)", &path, &u64)) > 0) {
-                        unsigned long ul = u64;
-
-                        if (ul < 10 || ul > 1000)
-                                return sd_bus_error_set_errnof(error, EINVAL, "BlockIODeviceWeight out of range");
-
-                        if (mode != UNIT_CHECK) {
-                                CGroupBlockIODeviceWeight *a = NULL, *b;
-
-                                LIST_FOREACH(device_weights, b, c->blockio_device_weights) {
-                                        if (path_equal(b->path, path)) {
-                                                a = b;
-                                                break;
-                                        }
-                                }
-
-                                if (!a) {
-                                        a = new0(CGroupBlockIODeviceWeight, 1);
-                                        if (!a)
-                                                return -ENOMEM;
-
-                                        a->path = strdup(path);
-                                        if (!a->path) {
-                                                free(a);
-                                                return -ENOMEM;
-                                        }
-                                        LIST_PREPEND(device_weights,c->blockio_device_weights, a);
-                                }
-
-                                a->weight = ul;
-                        }
-
-                        n++;
-                }
+                while ((r = sd_bus_message_read(message, "(st)", &path, &u64)) > 0)
+                        if (mode != UNIT_CHECK)
+                                fprintf(f, "%s=%s %lu\n", name, path, u64);
+                if (r < 0)
+                        return r;
 
                 r = sd_bus_message_exit_container(message);
                 if (r < 0)
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        _cleanup_free_ char *buf = NULL;
-                        _cleanup_fclose_ FILE *f = NULL;
-                        CGroupBlockIODeviceWeight *a;
-                        size_t size = 0;
-
-                        if (n == 0) {
-                                while (c->blockio_device_weights)
-                                        cgroup_context_free_blockio_device_weight(c, c->blockio_device_weights);
-                        }
-
-                        u->cgroup_realized_mask &= ~CGROUP_BLKIO;
-
-                        f = open_memstream(&buf, &size);
-                        if (!f)
-                                return -ENOMEM;
-
-                        fputs("BlockIODeviceWeight=\n", f);
-                        LIST_FOREACH(device_weights, a, c->blockio_device_weights)
-                                fprintf(f, "BlockIODeviceWeight=%s %lu\n", a->path, a->weight);
-
                         fflush(f);
-                        unit_write_drop_in_private(u, mode, name, buf);
+                        r = unit_write_drop_in_private(u, mode, name, buf);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -534,9 +450,9 @@ int bus_cgroup_set_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        c->memory_accounting = b;
-                        u->cgroup_realized_mask &= ~CGROUP_MEMORY;
-                        unit_write_drop_in_private(u, mode, name, b ? "MemoryAccounting=yes" : "MemoryAccounting=no");
+                        r = unit_write_drop_in_private_format(u, mode, name, "%s=%s", name, yes_no(b));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -549,9 +465,9 @@ int bus_cgroup_set_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        c->memory_limit = limit;
-                        u->cgroup_realized_mask &= ~CGROUP_MEMORY;
-                        unit_write_drop_in_private_format(u, mode, name, "%s=%" PRIu64, name, limit);
+                        r = unit_write_drop_in_private_format(u, mode, name, "%s=%" PRIu64, name, limit);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -569,70 +485,35 @@ int bus_cgroup_set_property(
                         return -EINVAL;
 
                 if (mode != UNIT_CHECK) {
-                        char *buf;
-
-                        c->device_policy = p;
-                        u->cgroup_realized_mask &= ~CGROUP_DEVICE;
-
-                        buf = strappenda("DevicePolicy=", policy);
-                        unit_write_drop_in_private(u, mode, name, buf);
+                        r = unit_write_drop_in_private_format(u, mode, name, "%s=%s", name, policy);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
 
         } else if (streq(name, "DeviceAllow")) {
+                _cleanup_free_ char *buf = NULL;
+                _cleanup_fclose_ FILE *f = NULL;
                 const char *path, *rwm;
-                unsigned n = 0;
-
-                r = sd_bus_message_enter_container(message, 'a', "(ss)");
-                if (r < 0)
-                        return r;
-
-                while ((r = sd_bus_message_read(message, "(ss)", &path, &rwm)) > 0) {
-
-                        if ((!startswith(path, "/dev/") &&
-                             !startswith(path, "block-") &&
-                             !startswith(path, "char-")) ||
-                            strpbrk(path, WHITESPACE))
-                            return sd_bus_error_set_errnof(error, EINVAL, "DeviceAllow= requires device node");
-
-                        if (isempty(rwm))
-                                rwm = "rwm";
-
-                        if (!in_charset(rwm, "rwm"))
-                                return sd_bus_error_set_errnof(error, EINVAL, "DeviceAllow= requires combination of rwm flags");
-
-                        if (mode != UNIT_CHECK) {
-                                CGroupDeviceAllow *a = NULL, *b;
-
-                                LIST_FOREACH(device_allow, b, c->device_allow) {
-                                        if (path_equal(b->path, path)) {
-                                                a = b;
-                                                break;
-                                        }
-                                }
 
-                                if (!a) {
-                                        a = new0(CGroupDeviceAllow, 1);
-                                        if (!a)
-                                                return -ENOMEM;
+                if (mode != UNIT_CHECK) {
+                        size_t size = 0;
 
-                                        a->path = strdup(path);
-                                        if (!a->path) {
-                                                free(a);
-                                                return -ENOMEM;
-                                        }
+                        f = open_memstream(&buf, &size);
+                        if (!f)
+                                return -ENOMEM;
 
-                                        LIST_PREPEND(device_allow, c->device_allow, a);
-                                }
+                        fputs("DeviceAllow=\n", f);
+                }
 
-                                a->r = !!strchr(rwm, 'r');
-                                a->w = !!strchr(rwm, 'w');
-                                a->m = !!strchr(rwm, 'm');
-                        }
+                r = sd_bus_message_enter_container(message, 'a', "(ss)");
+                if (r < 0)
+                        return r;
 
-                        n++;
-                }
+                while ((r = sd_bus_message_read(message, "(ss)", &path, &rwm)) > 0)
+                        if (mode != UNIT_CHECK)
+                                fprintf(f, "DeviceAllow=%s %s\n", path, rwm);
                 if (r < 0)
                         return r;
 
@@ -641,28 +522,10 @@ int bus_cgroup_set_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        _cleanup_free_ char *buf = NULL;
-                        _cleanup_fclose_ FILE *f = NULL;
-                        CGroupDeviceAllow *a;
-                        size_t size = 0;
-
-                        if (n == 0) {
-                                while (c->device_allow)
-                                        cgroup_context_free_device_allow(c, c->device_allow);
-                        }
-
-                        u->cgroup_realized_mask &= ~CGROUP_DEVICE;
-
-                        f = open_memstream(&buf, &size);
-                        if (!f)
-                                return -ENOMEM;
-
-                        fputs("DeviceAllow=\n", f);
-                        LIST_FOREACH(device_allow, a, c->device_allow)
-                                fprintf(f, "DeviceAllow=%s %s%s%s\n", a->path, a->r ? "r" : "", a->w ? "w" : "", a->m ? "m" : "");
-
                         fflush(f);
-                        unit_write_drop_in_private(u, mode, name, buf);
+                        r = unit_write_drop_in_private(u, mode, name, buf);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -670,7 +533,7 @@ int bus_cgroup_set_property(
         }
 
         if (u->transient && u->load_state == UNIT_STUB) {
-                r = bus_cgroup_set_transient_property(u, c, name, message, mode, error);
+                r = bus_cgroup_set_transient_property(u, name, message, mode, error);
                 if (r != 0)
                         return r;
 
diff --git a/src/core/dbus-cgroup.h b/src/core/dbus-cgroup.h
index c2a3910..5567e61 100644
--- a/src/core/dbus-cgroup.h
+++ b/src/core/dbus-cgroup.h
@@ -26,4 +26,4 @@
 
 extern const sd_bus_vtable bus_cgroup_vtable[];
 
-int bus_cgroup_set_property(Unit *u, CGroupContext *c, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
+int bus_cgroup_set_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c
index bbcd610..e32ae8e 100644
--- a/src/core/dbus-execute.c
+++ b/src/core/dbus-execute.c
@@ -759,7 +759,6 @@ int bus_property_get_exec_command_list(
 
 int bus_exec_context_set_transient_property(
                 Unit *u,
-                ExecContext *c,
                 const char *name,
                 sd_bus_message *message,
                 UnitSetPropertiesMode mode,
@@ -768,7 +767,6 @@ int bus_exec_context_set_transient_property(
         int r;
 
         assert(u);
-        assert(c);
         assert(name);
         assert(message);
 
@@ -780,22 +778,9 @@ int bus_exec_context_set_transient_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-
-                        if (isempty(uu)) {
-                                free(c->user);
-                                c->user = NULL;
-                        } else {
-                                char *t;
-
-                                t = strdup(uu);
-                                if (!t)
-                                        return -ENOMEM;
-
-                                free(c->user);
-                                c->user = t;
-                        }
-
-                        unit_write_drop_in_private_format(u, mode, name, "User=%s\n", uu);
+                        r = unit_write_drop_in_private_format(u, mode, name, "User=%s\n", uu);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -808,22 +793,9 @@ int bus_exec_context_set_transient_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-
-                        if (isempty(gg)) {
-                                free(c->group);
-                                c->group = NULL;
-                        } else {
-                                char *t;
-
-                                t = strdup(gg);
-                                if (!t)
-                                        return -ENOMEM;
-
-                                free(c->group);
-                                c->group = t;
-                        }
-
-                        unit_write_drop_in_private_format(u, mode, name, "Group=%s\n", gg);
+                        r = unit_write_drop_in_private_format(u, mode, name, "Group=%s\n", gg);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -839,8 +811,9 @@ int bus_exec_context_set_transient_property(
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Nice value out of range");
 
                 if (mode != UNIT_CHECK) {
-                        c->nice = n;
-                        unit_write_drop_in_private_format(u, mode, name, "Nice=%i\n", n);
+                        r = unit_write_drop_in_private_format(u, mode, name, "Nice=%i\n", n);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -858,20 +831,14 @@ int bus_exec_context_set_transient_property(
 
                 if (mode != UNIT_CHECK) {
                         _cleanup_free_ char *joined = NULL;
-                        char **e;
-
-                        e = strv_env_merge(2, c->environment, l);
-                        if (!e)
-                                return -ENOMEM;
-
-                        strv_free(c->environment);
-                        c->environment = e;
 
-                        joined = strv_join_quoted(c->environment);
+                        joined = strv_join_quoted(l);
                         if (!joined)
                                 return -ENOMEM;
 
-                        unit_write_drop_in_private_format(u, mode, name, "Environment=%s\n", joined);
+                        r = unit_write_drop_in_private_format(u, mode, name, "Environment=%s\n", joined);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -894,22 +861,12 @@ int bus_exec_context_set_transient_property(
                 }
 
                 if (mode != UNIT_CHECK) {
-                        int z;
-
-                        z = rlimit_from_string(name);
-
-                        if (!c->rlimit[z]) {
-                                c->rlimit[z] = new(struct rlimit, 1);
-                                if (!c->rlimit[z])
-                                        return -ENOMEM;
-                        }
-
-                        c->rlimit[z]->rlim_cur = c->rlimit[z]->rlim_max = x;
-
                         if (x == RLIM_INFINITY)
-                                unit_write_drop_in_private_format(u, mode, name, "%s=infinity\n", name);
+                                r = unit_write_drop_in_private_format(u, mode, name, "%s=infinity\n", name);
                         else
-                                unit_write_drop_in_private_format(u, mode, name, "%s=%" PRIu64 "\n", name, rl);
+                                r = unit_write_drop_in_private_format(u, mode, name, "%s=%" PRIu64 "\n", name, rl);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
diff --git a/src/core/dbus-execute.h b/src/core/dbus-execute.h
index e4c2d5d..baeb2c8 100644
--- a/src/core/dbus-execute.h
+++ b/src/core/dbus-execute.h
@@ -43,4 +43,4 @@ int bus_property_get_exec_output(sd_bus *bus, const char *path, const char *inte
 int bus_property_get_exec_command(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *ret_error);
 int bus_property_get_exec_command_list(sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *ret_error);
 
-int bus_exec_context_set_transient_property(Unit *u, ExecContext *c, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
+int bus_exec_context_set_transient_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
diff --git a/src/core/dbus-kill.c b/src/core/dbus-kill.c
index fb29e14..a095693 100644
--- a/src/core/dbus-kill.c
+++ b/src/core/dbus-kill.c
@@ -36,7 +36,6 @@ const sd_bus_vtable bus_kill_vtable[] = {
 
 int bus_kill_context_set_transient_property(
                 Unit *u,
-                KillContext *c,
                 const char *name,
                 sd_bus_message *message,
                 UnitSetPropertiesMode mode,
@@ -45,7 +44,6 @@ int bus_kill_context_set_transient_property(
         int r;
 
         assert(u);
-        assert(c);
         assert(name);
         assert(message);
 
@@ -62,9 +60,9 @@ int bus_kill_context_set_transient_property(
                         return -EINVAL;
 
                 if (mode != UNIT_CHECK) {
-                        c->kill_mode = k;
-
-                        unit_write_drop_in_private_format(u, mode, name, "KillMode=%s\n", kill_mode_to_string(k));
+                        r = unit_write_drop_in_private_format(u, mode, name, "%s=%s\n", name, kill_mode_to_string(k));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -80,9 +78,9 @@ int bus_kill_context_set_transient_property(
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Signal %i out of range", sig);
 
                 if (mode != UNIT_CHECK) {
-                        c->kill_signal = sig;
-
-                        unit_write_drop_in_private_format(u, mode, name, "KillSignal=%s\n", signal_to_string(sig));
+                        r = unit_write_drop_in_private_format(u, mode, name, "%s=%s\n", name, signal_to_string(sig));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -95,9 +93,9 @@ int bus_kill_context_set_transient_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        c->send_sighup = b;
-
-                        unit_write_drop_in_private_format(u, mode, name, "SendSIGHUP=%s\n", yes_no(b));
+                        r = unit_write_drop_in_private_format(u, mode, name, "%s=%s\n", name, yes_no(b));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -110,9 +108,9 @@ int bus_kill_context_set_transient_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        c->send_sigkill = b;
-
-                        unit_write_drop_in_private_format(u, mode, name, "SendSIGKILL=%s\n", yes_no(b));
+                        r = unit_write_drop_in_private_format(u, mode, name, "%s=%s\n", name, yes_no(b));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
diff --git a/src/core/dbus-kill.h b/src/core/dbus-kill.h
index 7c15f3a..4968804 100644
--- a/src/core/dbus-kill.h
+++ b/src/core/dbus-kill.h
@@ -27,4 +27,4 @@
 
 extern const sd_bus_vtable bus_kill_vtable[];
 
-int bus_kill_context_set_transient_property(Unit *u, KillContext *c, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
+int bus_kill_context_set_transient_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
diff --git a/src/core/dbus-mount.c b/src/core/dbus-mount.c
index 53fe4ed..97d28e9 100644
--- a/src/core/dbus-mount.c
+++ b/src/core/dbus-mount.c
@@ -176,11 +176,11 @@ int bus_mount_set_property(
         Mount *m = MOUNT(u);
         int r;
 
-        assert(m);
+        assert(u);
         assert(name);
         assert(message);
 
-        r = bus_cgroup_set_property(u, &m->cgroup_context, name, message, mode, error);
+        r = bus_cgroup_set_property(u, name, message, mode, error);
         if (r != 0)
                 return r;
 
@@ -191,11 +191,11 @@ int bus_mount_set_property(
                 if (r != 0)
                         return r;
 
-                r = bus_exec_context_set_transient_property(u, &m->exec_context, name, message, mode, error);
+                r = bus_exec_context_set_transient_property(u, name, message, mode, error);
                 if (r != 0)
                         return r;
 
-                r = bus_kill_context_set_transient_property(u, &m->kill_context, name, message, mode, error);
+                r = bus_kill_context_set_transient_property(u, name, message, mode, error);
                 if (r != 0)
                         return r;
         }
diff --git a/src/core/dbus-scope.c b/src/core/dbus-scope.c
index a762223..b61902c 100644
--- a/src/core/dbus-scope.c
+++ b/src/core/dbus-scope.c
@@ -168,11 +168,11 @@ int bus_scope_set_property(
         Scope *s = SCOPE(u);
         int r;
 
-        assert(s);
+        assert(u);
         assert(name);
         assert(message);
 
-        r = bus_cgroup_set_property(u, &s->cgroup_context, name, message, mode, error);
+        r = bus_cgroup_set_property(u, name, message, mode, error);
         if (r != 0)
                 return r;
 
@@ -183,7 +183,7 @@ int bus_scope_set_property(
                 if (r != 0)
                         return r;
 
-                r = bus_kill_context_set_transient_property(u, &s->kill_context, name, message, mode, error);
+                r = bus_kill_context_set_transient_property(u, name, message, mode, error);
                 if (r != 0)
                         return r;
         }
diff --git a/src/core/dbus-service.c b/src/core/dbus-service.c
index 5a881e8..6368beb 100644
--- a/src/core/dbus-service.c
+++ b/src/core/dbus-service.c
@@ -93,8 +93,9 @@ static int bus_service_set_transient_property(
                         return r;
 
                 if (mode != UNIT_CHECK) {
-                        s->remain_after_exit = b;
-                        unit_write_drop_in_private_format(UNIT(s), mode, name, "RemainAfterExit=%s\n", yes_no(b));
+                        r = unit_write_drop_in_private_format(UNIT(s), mode, name, "RemainAfterExit=%s\n", yes_no(b));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -112,19 +113,31 @@ static int bus_service_set_transient_property(
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid service type %s", t);
 
                 if (mode != UNIT_CHECK) {
-                        s->type = k;
-                        unit_write_drop_in_private_format(UNIT(s), mode, name, "Type=%s\n", service_type_to_string(s->type));
+                        r = unit_write_drop_in_private_format(UNIT(s), mode, name, "Type=%s\n", service_type_to_string(s->type));
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
 
         } else if (streq(name, "ExecStart")) {
-                unsigned n = 0;
+
+                _cleanup_free_ char *buf = NULL;
+                _cleanup_fclose_ FILE *f = NULL;
+                size_t size = 0;
 
                 r = sd_bus_message_enter_container(message, 'a', "(sasb)");
                 if (r < 0)
                         return r;
 
+                if (mode != UNIT_CHECK) {
+                        f = open_memstream(&buf, &size);
+                        if (!f)
+                                return -ENOMEM;
+
+                        fputs("ExecStart=\n", f);
+                }
+
                 while ((r = sd_bus_message_enter_container(message, 'r', "sasb")) > 0) {
                         _cleanup_strv_free_ char **argv = NULL;
                         const char *path;
@@ -151,6 +164,7 @@ static int bus_service_set_transient_property(
 
                         if (mode != UNIT_CHECK) {
                                 ExecCommand *c;
+                                _cleanup_free_ char *a;
 
                                 c = new0(ExecCommand, 1);
                                 if (!c)
@@ -168,38 +182,6 @@ static int bus_service_set_transient_property(
                                 c->ignore = b;
 
                                 path_kill_slashes(c->path);
-                                exec_command_append_list(&s->exec_command[SERVICE_EXEC_START], c);
-                        }
-
-                        n++;
-                }
-
-                if (r < 0)
-                        return r;
-
-                r = sd_bus_message_exit_container(message);
-                if (r < 0)
-                        return r;
-
-                if (mode != UNIT_CHECK) {
-                        _cleanup_free_ char *buf = NULL;
-                        _cleanup_fclose_ FILE *f = NULL;
-                        ExecCommand *c;
-                        size_t size = 0;
-
-                        if (n == 0) {
-                                exec_command_free_list(s->exec_command[SERVICE_EXEC_START]);
-                                s->exec_command[SERVICE_EXEC_START] = NULL;
-                        }
-
-                        f = open_memstream(&buf, &size);
-                        if (!f)
-                                return -ENOMEM;
-
-                        fputs("ExecStart=\n", f);
-
-                        LIST_FOREACH(command, c, s->exec_command[SERVICE_EXEC_START]) {
-                                _cleanup_free_ char *a;
 
                                 a = strv_join_quoted(c->argv);
                                 if (!a)
@@ -210,9 +192,20 @@ static int bus_service_set_transient_property(
                                         c->path,
                                         a);
                         }
+                }
 
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_message_exit_container(message);
+                if (r < 0)
+                        return r;
+
+                if (mode != UNIT_CHECK) {
                         fflush(f);
-                        unit_write_drop_in_private(UNIT(s), mode, name, buf);
+                        r = unit_write_drop_in_private(UNIT(s), mode, name, buf);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -231,11 +224,11 @@ int bus_service_set_property(
         Service *s = SERVICE(u);
         int r;
 
-        assert(s);
+        assert(u);
         assert(name);
         assert(message);
 
-        r = bus_cgroup_set_property(u, &s->cgroup_context, name, message, mode, error);
+        r = bus_cgroup_set_property(u, name, message, mode, error);
         if (r != 0)
                 return r;
 
@@ -246,11 +239,11 @@ int bus_service_set_property(
                 if (r != 0)
                         return r;
 
-                r = bus_exec_context_set_transient_property(u, &s->exec_context, name, message, mode, error);
+                r = bus_exec_context_set_transient_property(u, name, message, mode, error);
                 if (r != 0)
                         return r;
 
-                r = bus_kill_context_set_transient_property(u, &s->kill_context, name, message, mode, error);
+                r = bus_kill_context_set_transient_property(u, name, message, mode, error);
                 if (r != 0)
                         return r;
         }
diff --git a/src/core/dbus-slice.c b/src/core/dbus-slice.c
index 8bc90b1..88c3c0d 100644
--- a/src/core/dbus-slice.c
+++ b/src/core/dbus-slice.c
@@ -37,12 +37,10 @@ int bus_slice_set_property(
                 UnitSetPropertiesMode mode,
                 sd_bus_error *error) {
 
-        Slice *s = SLICE(u);
-
-        assert(name);
         assert(u);
+        assert(name);
 
-        return bus_cgroup_set_property(u, &s->cgroup_context, name, message, mode, error);
+        return bus_cgroup_set_property(u, name, message, mode, error);
 }
 
 int bus_slice_commit_properties(Unit *u) {
diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c
index 50b1674..6c7e6c4 100644
--- a/src/core/dbus-socket.c
+++ b/src/core/dbus-socket.c
@@ -142,13 +142,11 @@ int bus_socket_set_property(
                 UnitSetPropertiesMode mode,
                 sd_bus_error *error) {
 
-        Socket *s = SOCKET(u);
-
-        assert(s);
+        assert(u);
         assert(name);
         assert(message);
 
-        return bus_cgroup_set_property(u, &s->cgroup_context, name, message, mode, error);
+        return bus_cgroup_set_property(u, name, message, mode, error);
 }
 
 int bus_socket_commit_properties(Unit *u) {
diff --git a/src/core/dbus-swap.c b/src/core/dbus-swap.c
index 1e7f66d..107d0f4 100644
--- a/src/core/dbus-swap.c
+++ b/src/core/dbus-swap.c
@@ -99,13 +99,11 @@ int bus_swap_set_property(
                 UnitSetPropertiesMode mode,
                 sd_bus_error *error) {
 
-        Swap *s = SWAP(u);
-
-        assert(s);
+        assert(u);
         assert(name);
         assert(message);
 
-        return bus_cgroup_set_property(u, &s->cgroup_context, name, message, mode, error);
+        return bus_cgroup_set_property(u, name, message, mode, error);
 }
 
 int bus_swap_commit_properties(Unit *u) {
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
index cc09a26..408e1c5 100644
--- a/src/core/dbus-unit.c
+++ b/src/core/dbus-unit.c
@@ -857,7 +857,9 @@ static int bus_unit_set_transient_property(
                         if (r < 0)
                                 return r;
 
-                        unit_write_drop_in_format(u, mode, name, "[Unit]\nDescription=%s\n", d);
+                        r = unit_write_drop_in_format(u, mode, name, "[Unit]\nDescription=%s\n", d);
+                        if (r < 0)
+                                return r;
                 }
 
                 return 1;
@@ -889,7 +891,9 @@ static int bus_unit_set_transient_property(
 
                         if (mode != UNIT_CHECK) {
                                 unit_ref_set(&u->slice, slice);
-                                unit_write_drop_in_private_format(u, mode, name, "Slice=%s\n", s);
+                                r = unit_write_drop_in_private_format(u, mode, name, "Slice=%s\n", s);
+                                if (r < 0)
+                                        return r;
                         }
                 }
 
@@ -931,7 +935,9 @@ static int bus_unit_set_transient_property(
                                 if (!label)
                                         return -ENOMEM;
 
-                                unit_write_drop_in_format(u, mode, label, "[Unit]\n%s=%s\n", name, other);
+                                r = unit_write_drop_in_format(u, mode, label, "[Unit]\n%s=%s\n", name, other);
+                                if (r < 0)
+                                        return r;
                         }
 
                 }
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index d385968..1326eff 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -2741,6 +2741,7 @@ int config_parse_device_allow(
         _cleanup_free_ char *path = NULL;
         CGroupContext *c = data;
         CGroupDeviceAllow *a;
+        bool already = false;
         const char *m;
         size_t n;
 
@@ -2774,12 +2775,21 @@ int config_parse_device_allow(
                 return 0;
         }
 
-        a = new0(CGroupDeviceAllow, 1);
-        if (!a)
-                return log_oom();
+        LIST_FOREACH(device_allow, a, c->device_allow) {
+                already = path_equal(a->path, path);
+                if (already)
+                        break;
+        }
+
+        if (!already) {
+                a = new0(CGroupDeviceAllow, 1);
+                if (!a)
+                        return log_oom();
+
+                a->path = path;
+                path = NULL;
+        }
 
-        a->path = path;
-        path = NULL;
         a->r = !!strchr(m, 'r');
         a->w = !!strchr(m, 'w');
         a->m = !!strchr(m, 'm');
@@ -2838,6 +2848,7 @@ int config_parse_blockio_device_weight(
         _cleanup_free_ char *path = NULL;
         CGroupBlockIODeviceWeight *w;
         CGroupContext *c = data;
+        bool already = false;
         unsigned long lu;
         const char *weight;
         size_t n;
@@ -2880,12 +2891,20 @@ int config_parse_blockio_device_weight(
                 return 0;
         }
 
-        w = new0(CGroupBlockIODeviceWeight, 1);
-        if (!w)
-                return log_oom();
+        LIST_FOREACH(device_weights, w, c->blockio_device_weights) {
+                already = path_equal(w->path, path);
+                if (already)
+                        break;
+        }
 
-        w->path = path;
-        path = NULL;
+        if (!already) {
+                w = new0(CGroupBlockIODeviceWeight, 1);
+                if (!w)
+                        return log_oom();
+
+                w->path = path;
+                path = NULL;
+        }
 
         w->weight = lu;
 
@@ -2910,7 +2929,7 @@ int config_parse_blockio_bandwidth(
         CGroupContext *c = data;
         const char *bandwidth;
         off_t bytes;
-        bool read;
+        bool read, already = false;
         size_t n;
         int r;
 
@@ -2957,14 +2976,22 @@ int config_parse_blockio_bandwidth(
                 return 0;
         }
 
-        b = new0(CGroupBlockIODeviceBandwidth, 1);
-        if (!b)
-                return log_oom();
+        LIST_FOREACH(device_bandwidths, b, c->blockio_device_bandwidths) {
+                already = path_equal(path, b->path) && read == b->read;
+                if (already)
+                        break;
+        }
+
+        if (!already) {
+                b = new0(CGroupBlockIODeviceBandwidth, 1);
+                if (!b)
+                        return log_oom();
 
-        b->path = path;
-        path = NULL;
+                b->path = path;
+                path = NULL;
+                b->read = read;
+        }
         b->bandwidth = (uint64_t) bytes;
-        b->read = read;
 
         LIST_PREPEND(device_bandwidths, c->blockio_device_bandwidths, b);
 
-- 
1.9.3



More information about the systemd-devel mailing list