A System and Service Manager
CentOS Sources
2016-02-16 4e2e74ff857d63b164391a16e8a42c78e8a935be
import systemd-219-19.el7_2.4
10 files added
1 files modified
697 ■■■■■ changed files
SOURCES/0258-run-synchronously-wait-until-the-scope-unit-we-creat.patch 154 ●●●●● patch | view | raw | blame | history
SOURCES/0259-device-rework-how-we-enter-tentative-state.patch 158 ●●●●● patch | view | raw | blame | history
SOURCES/0260-core-Do-not-bind-a-mount-unit-to-a-device-if-it-was-.patch 127 ●●●●● patch | view | raw | blame | history
SOURCES/0261-logind-set-RemoveIPC-no-by-default.patch 36 ●●●●● patch | view | raw | blame | history
SOURCES/0262-sysv-generator-follow-symlinks-in-etc-rc.d-init.d.patch 31 ●●●●● patch | view | raw | blame | history
SOURCES/0263-man-RemoveIPC-is-set-to-no-on-rhel.patch 25 ●●●●● patch | view | raw | blame | history
SOURCES/0264-makefile-disable-udev-tests.patch 27 ●●●●● patch | view | raw | blame | history
SOURCES/0265-sysv-generator-test-always-log-to-console.patch 27 ●●●●● patch | view | raw | blame | history
SOURCES/0266-test-sysv-generator-Check-for-network-online.target.patch 56 ●●●●● patch | view | raw | blame | history
SOURCES/0267-Avoid-tmp-being-mounted-as-tmpfs-without-the-user-s-.patch 28 ●●●●● patch | view | raw | blame | history
SPECS/systemd.spec 28 ●●●●● patch | view | raw | blame | history
SOURCES/0258-run-synchronously-wait-until-the-scope-unit-we-creat.patch
New file
@@ -0,0 +1,154 @@
From 18d515aeb3a2007fa0a762b9b9658f489d4b403d Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 28 Apr 2015 12:21:31 +0200
Subject: [PATCH] run: synchronously wait until the scope unit we create is
 started
Otherwise it might happen that by the time PID 1 adds our process to the
scope unit the process might already have died, if the process is
short-running (such as an invocation to /bin/true).
https://bugs.freedesktop.org/show_bug.cgi?id=86520
Cherry-picked from: de158ed22db60e3a6654557fa4aa72f7248550af
Resolves: #1283192
---
 src/libsystemd/sd-bus/bus-util.c | 10 ++++++++++
 src/libsystemd/sd-bus/bus-util.h |  1 +
 src/run/run.c                    | 42 +++++++++++++++++++++++++++++++++-------
 3 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/src/libsystemd/sd-bus/bus-util.c b/src/libsystemd/sd-bus/bus-util.c
index e48abf5..6d56150 100644
--- a/src/libsystemd/sd-bus/bus-util.c
+++ b/src/libsystemd/sd-bus/bus-util.c
@@ -1854,6 +1854,16 @@ int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path) {
         return set_put_strdup(d->jobs, path);
 }
+int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet) {
+        int r;
+
+        r = bus_wait_for_jobs_add(d, path);
+        if (r < 0)
+                return log_oom();
+
+        return bus_wait_for_jobs(d, quiet);
+}
+
 int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, UnitFileChange **changes, unsigned *n_changes) {
         const char *type, *path, *source;
         int r;
diff --git a/src/libsystemd/sd-bus/bus-util.h b/src/libsystemd/sd-bus/bus-util.h
index 21db982..8c8846c 100644
--- a/src/libsystemd/sd-bus/bus-util.h
+++ b/src/libsystemd/sd-bus/bus-util.h
@@ -209,6 +209,7 @@ int bus_wait_for_jobs_new(sd_bus *bus, BusWaitForJobs **ret);
 void bus_wait_for_jobs_free(BusWaitForJobs *d);
 int bus_wait_for_jobs_add(BusWaitForJobs *d, const char *path);
 int bus_wait_for_jobs(BusWaitForJobs *d, bool quiet);
+int bus_wait_for_jobs_one(BusWaitForJobs *d, const char *path, bool quiet);
 DEFINE_TRIVIAL_CLEANUP_FUNC(BusWaitForJobs*, bus_wait_for_jobs_free);
diff --git a/src/run/run.c b/src/run/run.c
index 0e5bde2..dd1338f 100644
--- a/src/run/run.c
+++ b/src/run/run.c
@@ -806,14 +806,20 @@ static int start_transient_scope(
                 char **argv) {
         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *reply = NULL;
+        _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
         _cleanup_strv_free_ char **env = NULL, **user_env = NULL;
-        _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
         _cleanup_free_ char *scope = NULL;
+        const char *object = NULL;
         int r;
         assert(bus);
         assert(argv);
+        r = bus_wait_for_jobs_new(bus, &w);
+        if (r < 0)
+                return log_oom();
+
         if (arg_unit) {
                 scope = unit_name_mangle_with_suffix(arg_unit, MANGLE_NOGLOB, ".scope");
                 if (!scope)
@@ -854,7 +860,7 @@ static int start_transient_scope(
         if (r < 0)
                 return bus_log_create_error(r);
-        r = sd_bus_call(bus, m, 0, &error, NULL);
+        r = sd_bus_call(bus, m, 0, &error, &reply);
         if (r < 0) {
                 log_error("Failed to start transient scope unit: %s", bus_error_message(&error, -r));
                 return r;
@@ -914,8 +920,16 @@ static int start_transient_scope(
         if (!env)
                 return log_oom();
+        r = sd_bus_message_read(reply, "o", &object);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = bus_wait_for_jobs_one(w, object, arg_quiet);
+        if (r < 0)
+                return r;
+
         if (!arg_quiet)
-                log_info("Running as unit %s.", scope);
+                log_info("Running scope as unit %s.", scope);
         execvpe(argv[0], argv, env);
@@ -927,13 +941,19 @@ static int start_transient_timer(
                 char **argv) {
         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
+        _cleanup_bus_message_unref_ sd_bus_message *m = NULL, *reply = NULL;
+        _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
         _cleanup_free_ char *timer = NULL, *service = NULL;
+        const char *object = NULL;
         int r;
         assert(bus);
         assert(argv);
+        r = bus_wait_for_jobs_new(bus, &w);
+        if (r < 0)
+                return log_oom();
+
         if (arg_unit) {
                 switch(unit_name_to_type(arg_unit)) {
@@ -1034,15 +1054,23 @@ static int start_transient_timer(
         if (r < 0)
                 return bus_log_create_error(r);
-        r = sd_bus_call(bus, m, 0, &error, NULL);
+        r = sd_bus_call(bus, m, 0, &error, &reply);
         if (r < 0) {
                 log_error("Failed to start transient timer unit: %s", bus_error_message(&error, -r));
                 return r;
         }
-        log_info("Running as unit %s.", timer);
+        r = sd_bus_message_read(reply, "o", &object);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        r = bus_wait_for_jobs_one(w, object, arg_quiet);
+        if (r < 0)
+                return r;
+
+        log_info("Running timer as unit %s.", timer);
         if (argv[0])
-                log_info("Will run as unit %s.", service);
+                log_info("Will run service as unit %s.", service);
         return 0;
 }
SOURCES/0259-device-rework-how-we-enter-tentative-state.patch
New file
@@ -0,0 +1,158 @@
From 960ea6ae7a9e2aca3594318ab893f7d5383e46b6 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 24 Apr 2015 12:29:05 +0200
Subject: [PATCH] device: rework how we enter tentative state
This reworks how we enter tentative state and does so only when a device
was previously not announced via udev. The previous check actually just
checked whether a new state bit was set, which is not correct.
Also, to be able to reliably maintain the tentative state across daemon
reloads, we need to serialize and deserialize it.
Cherry-picked from: f62009410
Resolves: #1283579
---
 src/core/device.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++--------
 src/core/device.h |  2 +-
 2 files changed, 69 insertions(+), 12 deletions(-)
diff --git a/src/core/device.c b/src/core/device.c
index cc4ebd2..8a6855d 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -151,14 +151,47 @@ static int device_coldplug(Unit *u, Hashmap *deferred_work) {
         if (d->found & DEVICE_FOUND_UDEV)
                 /* If udev says the device is around, it's around */
                 device_set_state(d, DEVICE_PLUGGED);
-        else if (d->found != DEVICE_NOT_FOUND)
+        else if (d->found != DEVICE_NOT_FOUND && d->deserialized_state != DEVICE_PLUGGED)
                 /* If a device is found in /proc/self/mountinfo or
-                 * /proc/swaps, it's "tentatively" around. */
+                 * /proc/swaps, and was not yet announced via udev,
+                 * it's "tentatively" around. */
                 device_set_state(d, DEVICE_TENTATIVE);
         return 0;
 }
+static int device_serialize(Unit *u, FILE *f, FDSet *fds) {
+        Device *d = DEVICE(u);
+
+        assert(u);
+        assert(f);
+        assert(fds);
+
+        unit_serialize_item(u, f, "state", device_state_to_string(d->state));
+}
+
+static int device_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
+        Device *d = DEVICE(u);
+
+        assert(u);
+        assert(key);
+        assert(value);
+        assert(fds);
+
+        if (streq(key, "state")) {
+                DeviceState state;
+
+                state = device_state_from_string(value);
+                if (state < 0)
+                        log_unit_debug(u->id, "Failed to parse state value %s", value);
+                else
+                        d->deserialized_state = state;
+        } else
+                log_unit_debug(u->id, "Unknown serialization key '%s'", key);
+
+        return 0;
+}
+
 static void device_dump(Unit *u, FILE *f, const char *prefix) {
         Device *d = DEVICE(u);
@@ -408,7 +441,7 @@ static int device_process_new(Manager *m, struct udev_device *dev) {
 }
 static void device_update_found_one(Device *d, bool add, DeviceFound found, bool now) {
-        DeviceFound n;
+        DeviceFound n, previous;
         assert(d);
@@ -416,16 +449,27 @@ static void device_update_found_one(Device *d, bool add, DeviceFound found, bool
         if (n == d->found)
                 return;
+        previous = d->found;
         d->found = n;
-        if (now) {
-                if (d->found & DEVICE_FOUND_UDEV)
-                        device_set_state(d, DEVICE_PLUGGED);
-                else if (add && d->found != DEVICE_NOT_FOUND)
-                        device_set_state(d, DEVICE_TENTATIVE);
-                else
-                        device_set_state(d, DEVICE_DEAD);
-        }
+        if (!now)
+                return;
+
+        if (d->found & DEVICE_FOUND_UDEV)
+                /* When the device is known to udev we consider it
+                 * plugged. */
+                device_set_state(d, DEVICE_PLUGGED);
+        else if (d->found != DEVICE_NOT_FOUND && (previous & DEVICE_FOUND_UDEV) == 0)
+                /* If the device has not been seen by udev yet, but is
+                 * now referenced by the kernel, then we assume the
+                 * kernel knows it now, and udev might soon too. */
+                device_set_state(d, DEVICE_TENTATIVE);
+        else
+                /* If nobody sees the device, or if the device was
+                 * previously seen by udev and now is only referenced
+                 * from the kernel, then we consider the device is
+                 * gone, the kernel just hasn't noticed it yet. */
+                device_set_state(d, DEVICE_DEAD);
 }
 static int device_update_found_by_sysfs(Manager *m, const char *sysfs, bool add, DeviceFound found, bool now) {
@@ -735,6 +779,16 @@ int device_found_node(Manager *m, const char *node, bool add, DeviceFound found,
                 if (!path_startswith(node, "/dev"))
                         return 0;
+                /* We make an extra check here, if the device node
+                 * actually exists. If it's missing, then this is an
+                 * indication that device was unplugged but is still
+                 * referenced in /proc/swaps or
+                 * /proc/self/mountinfo. Note that this check doesn't
+                 * really cover all cases where a device might be gone
+                 * away, since drives that can have a medium inserted
+                 * will still have a device node even when the medium
+                 * is not there... */
+
                 if (stat(node, &st) < 0) {
                         if (errno == ENOENT)
                                 return 0;
@@ -788,6 +842,9 @@ const UnitVTable device_vtable = {
         .coldplug = device_coldplug,
+        .serialize = device_serialize,
+        .deserialize_item = device_deserialize_item,
+
         .dump = device_dump,
         .active_state = device_active_state,
diff --git a/src/core/device.h b/src/core/device.h
index 0609b20..6724ab2 100644
--- a/src/core/device.h
+++ b/src/core/device.h
@@ -53,7 +53,7 @@ struct Device {
         devices for the same sysfs path. We chain them up here. */
         LIST_FIELDS(struct Device, same_sysfs);
-        DeviceState state;
+        DeviceState state, deserialized_state;
 };
 extern const UnitVTable device_vtable;
SOURCES/0260-core-Do-not-bind-a-mount-unit-to-a-device-if-it-was-.patch
New file
@@ -0,0 +1,127 @@
From c81de449d57bc563be7b4d4d53d07de28adcaa9b Mon Sep 17 00:00:00 2001
From: Harald Hoyer <harald@redhat.com>
Date: Tue, 24 Nov 2015 09:41:26 +0100
Subject: [PATCH] core: Do not bind a mount unit to a device, if it was from
 mountinfo
If a mount unit is bound to a device, systemd tries to umount the
mount point, if it thinks the device has gone away.
Due to the uevent queue and inotify of /proc/self/mountinfo being two
different sources, systemd can never get the ordering reliably correct.
It can happen, that in the uevent queue ADD,REMOVE,ADD is queued
and an inotify of mountinfo (or libmount event) happend with the
device in question.
systemd cannot know, at which point of time the mount happend in the
ADD,REMOVE,ADD sequence.
The real ordering might have been ADD,REMOVE,ADD,mount
and systemd might think ADD,mount,REMOVE,ADD and would umount the
mountpoint.
A test script which triggered this behaviour is:
rm -f test-efi-disk.img
dd if=/dev/null of=test-efi-disk.img bs=1M seek=512 count=1
parted --script test-efi-disk.img \
  "mklabel gpt" \
  "mkpart ESP fat32 1MiB 511MiB" \
  "set 1 boot on"
LOOP=$(losetup --show -f -P test-efi-disk.img)
udevadm settle
mkfs.vfat -F32 ${LOOP}p1
mkdir -p mnt
mount ${LOOP}p1 mnt
... <dostuffwith mnt>
Without the "udevadm settle" systemd unmounted mnt while the script was
operating on mnt.
Of course the question is, why there was a REMOVE in the first place,
but this is not part of this patch.
Cherry-picked from: 9d06297e262966de71095debd1537fc223f940a3
Resolves: #1283579
---
 src/core/mount.c  | 2 +-
 src/core/socket.c | 2 +-
 src/core/swap.c   | 2 +-
 src/core/unit.c   | 4 ++--
 src/core/unit.h   | 2 +-
 5 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/core/mount.c b/src/core/mount.c
index 1f1a41a..23f63ce 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -321,7 +321,7 @@ static int mount_add_device_links(Mount *m) {
         if (mount_is_auto(p) && UNIT(m)->manager->running_as == SYSTEMD_SYSTEM)
                 device_wants_mount = true;
-        r = unit_add_node_link(UNIT(m), p->what, device_wants_mount);
+        r = unit_add_node_link(UNIT(m), p->what, device_wants_mount, m->from_fragment ? UNIT_BINDS_TO : UNIT_REQUIRES);
         if (r < 0)
                 return r;
diff --git a/src/core/socket.c b/src/core/socket.c
index 7022e77..bc677a2 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -267,7 +267,7 @@ static int socket_add_device_link(Socket *s) {
                 return 0;
         t = strjoina("/sys/subsystem/net/devices/", s->bind_to_device);
-        return unit_add_node_link(UNIT(s), t, false);
+        return unit_add_node_link(UNIT(s), t, false, UNIT_BINDS_TO);
 }
 static int socket_add_default_dependencies(Socket *s) {
diff --git a/src/core/swap.c b/src/core/swap.c
index 369abf0..34a2c40 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -201,7 +201,7 @@ static int swap_add_device_links(Swap *s) {
                 return 0;
         if (is_device_path(s->what))
-                return unit_add_node_link(UNIT(s), s->what, UNIT(s)->manager->running_as == SYSTEMD_SYSTEM);
+                return unit_add_node_link(UNIT(s), s->what, UNIT(s)->manager->running_as == SYSTEMD_SYSTEM, UNIT_BINDS_TO);
         else
                 /* File based swap devices need to be ordered after
                  * systemd-remount-fs.service, since they might need a
diff --git a/src/core/unit.c b/src/core/unit.c
index fa17567..ae47a28 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -2823,7 +2823,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
         }
 }
-int unit_add_node_link(Unit *u, const char *what, bool wants) {
+int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency dep) {
         Unit *device;
         _cleanup_free_ char *e = NULL;
         int r;
@@ -2850,7 +2850,7 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
         if (r < 0)
                 return r;
-        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_BINDS_TO : UNIT_WANTS, device, true);
+        r = unit_add_two_dependencies(u, UNIT_AFTER, u->manager->running_as == SYSTEMD_SYSTEM ? dep : UNIT_WANTS, device, true);
         if (r < 0)
                 return r;
diff --git a/src/core/unit.h b/src/core/unit.h
index 7ebc489..0eebc0b 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -548,7 +548,7 @@ void unit_serialize_item_format(Unit *u, FILE *f, const char *key, const char *v
 void unit_serialize_item(Unit *u, FILE *f, const char *key, const char *value);
 int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
-int unit_add_node_link(Unit *u, const char *what, bool wants);
+int unit_add_node_link(Unit *u, const char *what, bool wants, UnitDependency d);
 int unit_coldplug(Unit *u, Hashmap *deferred_work);
SOURCES/0261-logind-set-RemoveIPC-no-by-default.patch
New file
@@ -0,0 +1,36 @@
From b4d12e023a1418e850ec96616739e7be1d71c4f5 Mon Sep 17 00:00:00 2001
From: Lukas Nykryn <lnykryn@redhat.com>
Date: Thu, 26 Nov 2015 14:14:55 +0100
Subject: [PATCH] logind: set RemoveIPC=no by default
RHEL-only
Resolves: #1284588
---
 src/login/logind.c    | 2 +-
 src/login/logind.conf | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/login/logind.c b/src/login/logind.c
index b44f376..3afbf34 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -49,7 +49,7 @@ Manager *manager_new(void) {
         m->n_autovts = 6;
         m->reserve_vt = 6;
-        m->remove_ipc = true;
+        m->remove_ipc = false;
         m->inhibit_delay_max = 5 * USEC_PER_SEC;
         m->handle_power_key = HANDLE_POWEROFF;
         m->handle_suspend_key = HANDLE_SUSPEND;
diff --git a/src/login/logind.conf b/src/login/logind.conf
index 834c4c2..be8d7df 100644
--- a/src/login/logind.conf
+++ b/src/login/logind.conf
@@ -30,4 +30,4 @@
 #IdleAction=ignore
 #IdleActionSec=30min
 #RuntimeDirectorySize=10%
-#RemoveIPC=yes
+#RemoveIPC=no
SOURCES/0262-sysv-generator-follow-symlinks-in-etc-rc.d-init.d.patch
New file
@@ -0,0 +1,31 @@
From 25dc202140f4daa18faeae11e26e9e16e8dae84e Mon Sep 17 00:00:00 2001
From: Lukas Nykryn <lnykryn@redhat.com>
Date: Fri, 11 Sep 2015 16:23:07 +0200
Subject: [PATCH] sysv-generator: follow symlinks in /etc/rc.d/init.d
Some java packages puts a symlink to init.d and its content is pointing
to latest java installation (because you can have multiple javas on you
machine).
On rhel-based distributions you can use alternatives --initscript
instread of symlink, but this is not usable for other distributions.
Cherry-picked from: 7b729f8686a83b24f3d9a891cde1c
Resolves: #1288005
---
 src/sysv-generator/sysv-generator.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
index 3c6cb8f..0a8a528 100644
--- a/src/sysv-generator/sysv-generator.c
+++ b/src/sysv-generator/sysv-generator.c
@@ -753,7 +753,7 @@ static int enumerate_sysv(const LookupPaths *lp, Hashmap *all_services) {
                         if (hidden_file(de->d_name))
                                 continue;
-                        if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
+                        if (fstatat(dirfd(d), de->d_name, &st, 0) < 0) {
                                 log_warning_errno(errno, "stat() failed on %s/%s: %m", *path, de->d_name);
                                 continue;
                         }
SOURCES/0263-man-RemoveIPC-is-set-to-no-on-rhel.patch
New file
@@ -0,0 +1,25 @@
From 931ad3c2c253b40cb2c8eef8876b962e8f2d1072 Mon Sep 17 00:00:00 2001
From: Lukas Nykryn <lnykryn@redhat.com>
Date: Thu, 10 Dec 2015 09:34:34 +0100
Subject: [PATCH] man: RemoveIPC is set to no on rhel
RHEL-only
Related: #1284588
---
 man/logind.conf.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/man/logind.conf.xml b/man/logind.conf.xml
index d02d573..54651f0 100644
--- a/man/logind.conf.xml
+++ b/man/logind.conf.xml
@@ -276,7 +276,7 @@
         memory and message queues, as well as POSIX shared memory and
         message queues. Note that IPC objects of the root user are
         excluded from the effect of this setting. Defaults to
-        <literal>yes</literal>.</para></listitem>
+        <literal>no</literal>.</para></listitem>
       </varlistentry>
     </variablelist>
SOURCES/0264-makefile-disable-udev-tests.patch
New file
@@ -0,0 +1,27 @@
From c79d960c9cf769e913c6824363c0f2f7f257762e Mon Sep 17 00:00:00 2001
From: Lukas Nykryn <lnykryn@redhat.com>
Date: Thu, 10 Dec 2015 11:08:19 +0100
Subject: [PATCH] makefile: disable udev tests
RHEL-only
---
 Makefile.am | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 887e70a..2645f66 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3785,9 +3785,9 @@ hwdb-remove-hook:
 endif
 # ------------------------------------------------------------------------------
-TESTS += \
-    test/udev-test.pl \
-    $(NULL)
+#TESTS += \
+#    test/udev-test.pl \
+#    $(NULL)
 if HAVE_PYTHON
 TESTS += \
SOURCES/0265-sysv-generator-test-always-log-to-console.patch
New file
@@ -0,0 +1,27 @@
From dff573ed5425cad26370ce5f4dc95c859d58ee72 Mon Sep 17 00:00:00 2001
From: Martin Pitt <martin.pitt@ubuntu.com>
Date: Mon, 15 Jun 2015 08:59:44 +0200
Subject: [PATCH] sysv-generator test: always log to console
Set $SYSTEMD_LOG_TARGET so that the output always goes to stdout/stderr. This
fixes running the test as root, as that logged to the journal previously.
https://github.com/systemd/systemd/issues/195
Cherry-picked from: 6b7d32add4733a83f86e18bb86f914037a6688b7
---
 test/sysv-generator-test.py | 1 +
 1 file changed, 1 insertion(+)
diff --git a/test/sysv-generator-test.py b/test/sysv-generator-test.py
index e716d70..1537864 100644
--- a/test/sysv-generator-test.py
+++ b/test/sysv-generator-test.py
@@ -60,6 +60,7 @@ class SysvGeneratorTest(unittest.TestCase):
         '''
         env = os.environ.copy()
         env['SYSTEMD_LOG_LEVEL'] = 'debug'
+        env['SYSTEMD_LOG_TARGET'] = 'console'
         env['SYSTEMD_SYSVINIT_PATH'] = self.init_d_dir
         env['SYSTEMD_SYSVRCND_PATH'] = self.rcnd_dir
         env['SYSTEMD_UNIT_PATH'] = self.unit_dir
SOURCES/0266-test-sysv-generator-Check-for-network-online.target.patch
New file
@@ -0,0 +1,56 @@
From dc923c37bf23c035e510c241ff228e3e2f92c1ef Mon Sep 17 00:00:00 2001
From: Branislav Blaskovic <bblaskov@redhat.com>
Date: Sat, 7 Nov 2015 11:32:49 +0100
Subject: [PATCH] test sysv-generator: Check for network-online.target.
---
 test/sysv-generator-test.py | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/test/sysv-generator-test.py b/test/sysv-generator-test.py
index 1537864..2060ad7 100644
--- a/test/sysv-generator-test.py
+++ b/test/sysv-generator-test.py
@@ -225,21 +225,27 @@ class SysvGeneratorTest(unittest.TestCase):
                               'Should-Start': 'may1 ne_may2'},
                       enable=True, prio=40)
         self.add_sysv('must1', {}, enable=True, prio=10)
+        self.add_sysv('prio10', {}, enable=True, prio=10)
+        self.add_sysv('prio11', {}, enable=True, prio=11)
         self.add_sysv('must2', {}, enable=True, prio=15)
         self.add_sysv('may1', {}, enable=True, prio=20)
         # do not create ne_may2
         err, results = self.run_generator()
         self.assertEqual(sorted(results),
-                         ['foo.service', 'may1.service', 'must1.service', 'must2.service'])
+                         ['foo.service', 'may1.service', 'must1.service', 'must2.service', 'prio10.service', 'prio11.service'])
         # foo should depend on all of them
+        print results['foo.service'].get('Unit', 'After')
         self.assertEqual(sorted(results['foo.service'].get('Unit', 'After').split()),
-                         ['may1.service', 'must1.service', 'must2.service', 'ne_may2.service'])
+                         ['may1.service', 'must1.service', 'must2.service', 'ne_may2.service', 'network-online.target'])
+        # from prio 10 network-online.target is default dependency (src/sysv-generator/sysv-generator.c)
+        self.assertEqual(sorted(results['must2.service'].get('Unit', 'After').split()), ['network-online.target'])
+        self.assertEqual(sorted(results['may1.service'].get('Unit', 'After').split()), ['network-online.target'])
+        self.assertEqual(sorted(results['prio11.service'].get('Unit', 'After').split()), ['network-online.target'])
         # other services should not depend on each other
         self.assertFalse(results['must1.service'].has_option('Unit', 'After'))
-        self.assertFalse(results['must2.service'].has_option('Unit', 'After'))
-        self.assertFalse(results['may1.service'].has_option('Unit', 'After'))
+        self.assertFalse(results['prio10.service'].has_option('Unit', 'After'))
     def test_symlink_prio_deps(self):
         '''script without LSB headers use rcN.d priority'''
@@ -259,8 +265,8 @@ class SysvGeneratorTest(unittest.TestCase):
         err, results = self.run_generator()
         self.assertEqual(sorted(results), ['consumer.service', 'provider.service'])
         self.assertFalse(results['provider.service'].has_option('Unit', 'After'))
-        self.assertEqual(results['consumer.service'].get('Unit', 'After'),
-                         'provider.service')
+        self.assertEqual(results['consumer.service'].get('Unit', 'After').split(),
+                         ['network-online.target', 'provider.service'])
     def test_multiple_provides(self):
         '''multiple Provides: names'''
SOURCES/0267-Avoid-tmp-being-mounted-as-tmpfs-without-the-user-s-.patch
New file
@@ -0,0 +1,28 @@
From 73d33e8e1b310c292dc92d26ca0cd7bfefa31852 Mon Sep 17 00:00:00 2001
From: Didier Roche <didrocks@ubuntu.com>
Date: Wed, 13 Jan 2016 12:49:57 +0100
Subject: [PATCH] Avoid /tmp being mounted as tmpfs without the user's will
Ensure PrivateTmp doesn't require tmpfs through tmp.mount, but rather
adds an After relationship.
rhel-only
Resolves: #1298109
---
 src/core/unit.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/core/unit.c b/src/core/unit.c
index ae47a28..4fb2fd3 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -807,7 +807,7 @@ int unit_add_exec_dependencies(Unit *u, ExecContext *c) {
                 return 0;
         if (c->private_tmp) {
-                r = unit_require_mounts_for(u, "/tmp");
+                r = unit_add_dependency_by_name(u, UNIT_AFTER, "tmp.mount", NULL, true);
                 if (r < 0)
                         return r;
SPECS/systemd.spec
@@ -7,7 +7,7 @@
Name:           systemd
Url:            http://www.freedesktop.org/wiki/Software/systemd
Version:        219
Release:        19%{?dist}
Release:        19%{?dist}.4
# For a breakdown of the licensing, see README
License:        LGPLv2+ and MIT and GPLv2+
Summary:        A System and Service Manager
@@ -285,6 +285,16 @@
Patch0255: 0255-tmpfiles.d-don-t-clean-SAP-lockfiles-and-logs.patch
Patch0256: 0256-udev-make-naming-for-virtio-devices-opt-in.patch
Patch0257: 0257-tmpfiles.d-don-t-clean-SAP-sockets-either.patch
Patch0258: 0258-run-synchronously-wait-until-the-scope-unit-we-creat.patch
Patch0259: 0259-device-rework-how-we-enter-tentative-state.patch
Patch0260: 0260-core-Do-not-bind-a-mount-unit-to-a-device-if-it-was-.patch
Patch0261: 0261-logind-set-RemoveIPC-no-by-default.patch
Patch0262: 0262-sysv-generator-follow-symlinks-in-etc-rc.d-init.d.patch
Patch0263: 0263-man-RemoveIPC-is-set-to-no-on-rhel.patch
Patch0264: 0264-makefile-disable-udev-tests.patch
Patch0265: 0265-sysv-generator-test-always-log-to-console.patch
Patch0266: 0266-test-sysv-generator-Check-for-network-online.target.patch
Patch0267: 0267-Avoid-tmp-being-mounted-as-tmpfs-without-the-user-s-.patch
%global num_patches %{lua: c=0; for i,p in ipairs(patches) do c=c+1; end; print(c);}
@@ -327,6 +337,7 @@
BuildRequires:  libtool
BuildRequires:  git
BuildRequires:  libmount-devel
BuildRequires:  tree
Requires(post): coreutils
Requires(post): gawk
@@ -1243,6 +1254,21 @@
%{_mandir}/man8/systemd-resolved.*
%changelog
* Wed Jan 13 2016 Lukas Nykryn <lnykryn@redhat.com> - 219-19.4
- Avoid /tmp being mounted as tmpfs without the user's will (#1298109)
* Thu Dec 10 2015 Lukas Nykryn <lnykryn@redhat.com> - 219-19.3
- sysv-generator: follow symlinks in /etc/rc.d/init.d (#1288005)
- man: RemoveIPC is set to no on rhel (#1284588)
* Fri Nov 27 2015 Lukas Nykryn <lnykryn@redhat.com> - 219-19.2
- device: rework how we enter tentative state (#1283579)
- core: Do not bind a mount unit to a device, if it was from mountinfo (#1283579)
- logind: set RemoveIPC=no by default (#1284588)
* Wed Nov 18 2015 Lukas Nykryn <lnykryn@redhat.com> - 219-19.1
- run: synchronously wait until the scope unit we create is started (#1283192)
* Mon Oct 12 2015 Lukas Nykryn <lnykryn@redhat.com> - 219-19
- udev: make naming for virtio devices opt-in (#1269216)
- tmpfiles.d: don't clean SAP sockets either (#1186044)