zbyszek pushed to systemd (master). "Patches for selinux issue and other problems"
notifications at fedoraproject.org
notifications at fedoraproject.org
Wed Jun 10 19:09:25 UTC 2015
From 436654a8a5b690be43288e46ba4b9acdeff9638b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
Date: Wed, 10 Jun 2015 13:30:16 -0400
Subject: Patches for selinux issue and other problems
diff --git a/0001-NEWS-fix-date.patch b/0001-NEWS-fix-date.patch
new file mode 100644
index 0000000..04c8dc0
--- /dev/null
+++ b/0001-NEWS-fix-date.patch
@@ -0,0 +1,24 @@
+From 39315f9f8dd5a16b4561c5efffc6114c75835011 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Fri, 22 May 2015 01:37:16 +0200
+Subject: [PATCH] NEWS: fix date
+
+Ah, bummer, it's tagged an now I realize I didn't fix the date. Let's do
+so now, post-commit.
+---
+ NEWS | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/NEWS b/NEWS
+index 7a4621cc5d..f72f502129 100644
+--- a/NEWS
++++ b/NEWS
+@@ -227,7 +227,7 @@ CHANGES WITH 220:
+ Gundersen, Torstein Husebø, Umut Tezduyar Lindskog, Will
+ Woods, Zachary Cook, Zbigniew Jędrzejewski-Szmek
+
+- -- Berlin, 2015-05-??
++ -- Berlin, 2015-05-22
+
+ CHANGES WITH 219:
+
diff --git a/0001-udevd-event-fix-event-queue-in-daemenozied-mode.patch b/0001-udevd-event-fix-event-queue-in-daemenozied-mode.patch
deleted file mode 100644
index 7f8a6a0..0000000
--- a/0001-udevd-event-fix-event-queue-in-daemenozied-mode.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 040e689654ef08c63ab93bf0875865398e8d9c91 Mon Sep 17 00:00:00 2001
-From: Tom Gundersen <teg at jklm.no>
-Date: Sun, 24 May 2015 15:20:36 +0200
-Subject: [PATCH] udevd: event - fix event queue in daemenozied mode
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-We would enforce that events could only be added to the queue from the
-main process, but that brake in daemonized mode. Relax the restriction
-to only allow one process to add events to the queue.
-
-Reported by Mantas Mikulėnas.
----
- src/udev/udevd.c | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/src/udev/udevd.c b/src/udev/udevd.c
-index 4a44b03..b33a262 100644
---- a/src/udev/udevd.c
-+++ b/src/udev/udevd.c
-@@ -564,7 +564,10 @@ static int event_queue_insert(Manager *manager, struct udev_device *dev) {
- assert(manager);
- assert(dev);
-
-- /* only the main process can add events to the queue */
-+ /* only one process can add events to the queue */
-+ if (manager->pid == 0)
-+ manager->pid = getpid();
-+
- assert(manager->pid == getpid());
-
- event = new0(struct event, 1);
-@@ -1300,8 +1303,6 @@ static int manager_new(Manager **ret) {
- if (!manager)
- return log_oom();
-
-- manager->pid = getpid();
--
- manager->fd_ep = -1;
- manager->fd_ctrl = -1;
- manager->fd_uevent = -1;
---
-2.3.1
-
diff --git a/0001-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch b/0001-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch
deleted file mode 100644
index 88e4a1e..0000000
--- a/0001-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From 86c3bece38bcf55da6387d20c6f01da9ad0284dc Mon Sep 17 00:00:00 2001
-From: Tom Gundersen <teg at jklm.no>
-Date: Wed, 27 May 2015 18:39:36 +0200
-Subject: [PATCH] udevd: fix SIGCHLD handling in --daemon mode
-
-We were listening for SIGCHLD in the wrong process.
----
- src/udev/udevd.c | 33 ++++++++++++++++++++++-----------
- 1 file changed, 22 insertions(+), 11 deletions(-)
-
-diff --git a/src/udev/udevd.c b/src/udev/udevd.c
-index 87e677e..299fda8 100644
---- a/src/udev/udevd.c
-+++ b/src/udev/udevd.c
-@@ -1288,13 +1288,6 @@ static int parse_argv(int argc, char *argv[]) {
-
- static int manager_new(Manager **ret) {
- _cleanup_(manager_freep) Manager *manager = NULL;
-- struct epoll_event ep_ctrl = { .events = EPOLLIN };
-- struct epoll_event ep_inotify = { .events = EPOLLIN };
-- struct epoll_event ep_signal = { .events = EPOLLIN };
-- struct epoll_event ep_netlink = { .events = EPOLLIN };
-- struct epoll_event ep_worker = { .events = EPOLLIN };
-- sigset_t mask;
-- int r, one = 1;
-
- assert(ret);
-
-@@ -1323,6 +1316,23 @@ static int manager_new(Manager **ret) {
- udev_list_node_init(&manager->events);
- udev_list_init(manager->udev, &manager->properties, true);
-
-+ *ret = manager;
-+ manager = NULL;
-+
-+ return 0;
-+}
-+
-+static int manager_listen(Manager *manager) {
-+ struct epoll_event ep_ctrl = { .events = EPOLLIN };
-+ struct epoll_event ep_inotify = { .events = EPOLLIN };
-+ struct epoll_event ep_signal = { .events = EPOLLIN };
-+ struct epoll_event ep_netlink = { .events = EPOLLIN };
-+ struct epoll_event ep_worker = { .events = EPOLLIN };
-+ sigset_t mask;
-+ int r, one = 1;
-+
-+ assert(manager);
-+
- r = systemd_fds(&manager->fd_ctrl, &manager->fd_uevent);
- if (r >= 0) {
- /* get control and netlink socket from systemd */
-@@ -1404,10 +1414,7 @@ static int manager_new(Manager **ret) {
- epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_worker, &ep_worker) < 0)
- return log_error_errno(errno, "fail to add fds to epoll: %m");
-
-- *ret = manager;
-- manager = NULL;
--
-- return 1;
-+ return 0;
- }
-
- int main(int argc, char *argv[]) {
-@@ -1518,6 +1525,10 @@ int main(int argc, char *argv[]) {
- } else
- sd_notify(1, "READY=1");
-
-+ r = manager_listen(manager);
-+ if (r < 0)
-+ return log_error_errno(r, "failed to set up fds and listen for events: %m");
-+
- for (;;) {
- static usec_t last_usec;
- struct epoll_event ev[8];
---
-2.3.1
-
diff --git a/0002-udev-net_id-Only-read-the-first-64-bytes-of-PCI-conf.patch b/0002-udev-net_id-Only-read-the-first-64-bytes-of-PCI-conf.patch
new file mode 100644
index 0000000..0fbb2fc
--- /dev/null
+++ b/0002-udev-net_id-Only-read-the-first-64-bytes-of-PCI-conf.patch
@@ -0,0 +1,56 @@
+From 4db1a8d691a85aa1f75b7eeb283246f488e47a3b Mon Sep 17 00:00:00 2001
+From: "Jason S. McMullan" <jason.mcmullan at gmail.com>
+Date: Fri, 22 May 2015 20:30:01 +0200
+Subject: [PATCH] udev/net_id: Only read the first 64 bytes of PCI config space
+
+The original code used fread(), which on some libc implementions
+(ie glibc 2.17) would pre-read a full 4K (PAGE_SIZE) of the
+PCI config space, when only 64 bytes were requested.
+
+I have recently come across PCIe hardware which responds with
+Completion Timeouts when accesses above 256 bytes are attempted.
+
+This can cause server systems with GHES/AEPI support to cause
+and immediate kernel panic due to the failed PCI transaction.
+
+This change replaces the buffered fread() with an explict
+unbuffered read() of 64 bytes, which corrects this issue by
+only reading the guaranteed first 64 bytes of PCIe config space.
+
+(cherry picked from commit 0454229c100a2113ba82df55703436d6cb2c492b)
+---
+ src/udev/udev-builtin-net_id.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
+index 78aef206b2..448920507a 100644
+--- a/src/udev/udev-builtin-net_id.c
++++ b/src/udev/udev-builtin-net_id.c
+@@ -91,6 +91,7 @@
+ #include <stdlib.h>
+ #include <stdarg.h>
+ #include <unistd.h>
++#include <fcntl.h>
+ #include <string.h>
+ #include <errno.h>
+ #include <net/if.h>
+@@ -166,15 +167,15 @@ static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) {
+
+ /* read the 256 bytes PCI configuration space to check the multi-function bit */
+ static bool is_pci_multifunction(struct udev_device *dev) {
+- _cleanup_fclose_ FILE *f = NULL;
++ _cleanup_close_ int fd = -1;
+ const char *filename;
+ uint8_t config[64];
+
+ filename = strjoina(udev_device_get_syspath(dev), "/config");
+- f = fopen(filename, "re");
+- if (!f)
++ fd = open(filename, O_RDONLY | O_CLOEXEC);
++ if (fd < 0)
+ return false;
+- if (fread(&config, sizeof(config), 1, f) != 1)
++ if (read(fd, &config, sizeof(config)) != sizeof(config))
+ return false;
+
+ /* bit 0-6 header type, bit 7 multi/single function device */
diff --git a/0003-bootctl-ferror-must-be-called-before-FILE-is-closed.patch b/0003-bootctl-ferror-must-be-called-before-FILE-is-closed.patch
new file mode 100644
index 0000000..c22043c
--- /dev/null
+++ b/0003-bootctl-ferror-must-be-called-before-FILE-is-closed.patch
@@ -0,0 +1,58 @@
+From 0628a6f0ffc097c0061d7d03e39c912eba91d1e3 Mon Sep 17 00:00:00 2001
+From: Thomas Hindoe Paaboel Andersen <phomes at gmail.com>
+Date: Fri, 22 May 2015 23:40:19 +0200
+Subject: [PATCH] bootctl: ferror must be called before FILE is closed
+
+Otherwise it will not show any error stored
+
+(cherry picked from commit 717442507b4b11aa1d76810d7b12b15948c7a250)
+---
+ src/boot/bootctl.c | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c
+index 3a007578dc..ba534b172e 100644
+--- a/src/boot/bootctl.c
++++ b/src/boot/bootctl.c
+@@ -884,7 +884,7 @@ static int install_loader_config(const char *esp_path) {
+ char *p;
+ char line[64];
+ char *machine = NULL;
+- FILE *f;
++ _cleanup_fclose_ FILE *f = NULL, *g = NULL;
+
+ f = fopen("/etc/machine-id", "re");
+ if (!f)
+@@ -899,18 +899,16 @@ static int install_loader_config(const char *esp_path) {
+ if (strlen(line) == 32)
+ machine = line;
+ }
+- fclose(f);
+
+ if (!machine)
+ return -ESRCH;
+
+ p = strjoina(esp_path, "/loader/loader.conf");
+- f = fopen(p, "wxe");
+- if (f) {
+- fprintf(f, "#timeout 3\n");
+- fprintf(f, "default %s-*\n", machine);
+- fclose(f);
+- if (ferror(f))
++ g = fopen(p, "wxe");
++ if (g) {
++ fprintf(g, "#timeout 3\n");
++ fprintf(g, "default %s-*\n", machine);
++ if (ferror(g))
+ return log_error_errno(EIO, "Failed to write \"%s\": %m", p);
+ }
+
+@@ -926,7 +924,7 @@ static int help(void) {
+ " --path=PATH Path to the EFI System Partition (ESP)\n"
+ " --no-variables Don't touch EFI variables\n"
+ "\n"
+- "Comands:\n"
++ "Commands:\n"
+ " status Show status of installed systemd-boot and EFI variables\n"
+ " install Install systemd-boot to the ESP and EFI variables\n"
+ " update Update systemd-boot in the ESP and EFI variables\n"
diff --git a/0004-cryptsetup-craft-a-unique-ID-with-the-source-device.patch b/0004-cryptsetup-craft-a-unique-ID-with-the-source-device.patch
deleted file mode 100644
index 1be76c0..0000000
--- a/0004-cryptsetup-craft-a-unique-ID-with-the-source-device.patch
+++ /dev/null
@@ -1,166 +0,0 @@
-From f6373b7dd7a2b8a8e38c289f289728d289382f29 Mon Sep 17 00:00:00 2001
-From: Harald Hoyer <harald at redhat.com>
-Date: Mon, 1 Jun 2015 17:26:27 +0200
-Subject: [PATCH 4/4] cryptsetup: craft a unique ID with the source device
-
-If cryptsetup is called with a source device as argv[3], then craft the
-ID for the password agent with a unique device path.
-
-If possible "/dev/block/<maj>:<min>" is used, otherwise the original
-argv[3] is used.
-
-This enables password agents like petera [1] to provide a password
-according to the source device. The original ID did not carry enough
-information and was more targeted for a human readable string, which
-is specified in the "Message" field anyway.
-
-With this patch the ID of the ask.XXX ini file looks like this:
-ID=cryptsetup:/dev/block/<maj>:<min>
-
-[1] https://github.com/npmccallum/petera
----
- src/cryptsetup/cryptsetup.c | 90 +++++++++++++++++++++++++++++----------------
- 1 file changed, 58 insertions(+), 32 deletions(-)
-
-diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c
-index a5018f1..5c6c7c0 100644
---- a/src/cryptsetup/cryptsetup.c
-+++ b/src/cryptsetup/cryptsetup.c
-@@ -238,6 +238,23 @@ static void log_glue(int level, const char *msg, void *usrptr) {
- log_debug("%s", msg);
- }
-
-+static int disk_major_minor(const char *path, char **ret) {
-+ struct stat st;
-+
-+ assert(path);
-+
-+ if (stat(path, &st) < 0)
-+ return -errno;
-+
-+ if (!S_ISBLK(st.st_mode))
-+ return -EINVAL;
-+
-+ if (asprintf(ret, "/dev/block/%d:%d", major(st.st_rdev), minor(st.st_rdev)) < 0)
-+ return -errno;
-+
-+ return 0;
-+}
-+
- static char* disk_description(const char *path) {
-
- static const char name_fields[] =
-@@ -295,20 +312,55 @@ static char *disk_mount_point(const char *label) {
- return NULL;
- }
-
--static int get_password(const char *name, usec_t until, bool accept_cached, char ***passwords) {
-- int r;
-+static int get_password(const char *vol, const char *src, usec_t until, bool accept_cached, char ***passwords) {
-+ int r = 0;
- char **p;
- _cleanup_free_ char *text = NULL;
- _cleanup_free_ char *escaped_name = NULL;
- char *id;
-+ const char *name = NULL;
-+ _cleanup_free_ char *description = NULL, *name_buffer = NULL,
-+ *mount_point = NULL, *maj_min = NULL;
-
-- assert(name);
-+ assert(vol);
-+ assert(src);
- assert(passwords);
-
-+ description = disk_description(src);
-+ mount_point = disk_mount_point(vol);
-+
-+ if (description && streq(vol, description)) {
-+ /* If the description string is simply the
-+ * volume name, then let's not show this
-+ * twice */
-+ free(description);
-+ description = NULL;
-+ }
-+
-+ if (mount_point && description)
-+ r = asprintf(&name_buffer, "%s (%s) on %s", description, vol, mount_point);
-+ else if (mount_point)
-+ r = asprintf(&name_buffer, "%s on %s", vol, mount_point);
-+ else if (description)
-+ r = asprintf(&name_buffer, "%s (%s)", description, vol);
-+
-+ if (r < 0)
-+ return log_oom();
-+
-+ name = name_buffer ? name_buffer : vol;
-+
- if (asprintf(&text, "Please enter passphrase for disk %s!", name) < 0)
- return log_oom();
-
-- escaped_name = cescape(name);
-+ if (src)
-+ (void) disk_major_minor(src, &maj_min);
-+
-+ if (maj_min) {
-+ escaped_name = maj_min;
-+ maj_min = NULL;
-+ } else
-+ escaped_name = cescape(name);
-+
- if (!escaped_name)
- return log_oom();
-
-@@ -552,8 +604,7 @@ int main(int argc, char *argv[]) {
- unsigned tries;
- usec_t until;
- crypt_status_info status;
-- const char *key_file = NULL, *name = NULL;
-- _cleanup_free_ char *description = NULL, *name_buffer = NULL, *mount_point = NULL;
-+ const char *key_file = NULL;
-
- /* Arguments: systemd-cryptsetup attach VOLUME SOURCE-DEVICE [PASSWORD] [OPTIONS] */
-
-@@ -581,31 +632,6 @@ int main(int argc, char *argv[]) {
- /* A delicious drop of snake oil */
- mlockall(MCL_FUTURE);
-
-- description = disk_description(argv[3]);
-- mount_point = disk_mount_point(argv[2]);
--
-- if (description && streq(argv[2], description)) {
-- /* If the description string is simply the
-- * volume name, then let's not show this
-- * twice */
-- free(description);
-- description = NULL;
-- }
--
-- k = 0;
-- if (mount_point && description)
-- k = asprintf(&name_buffer, "%s (%s) on %s", description, argv[2], mount_point);
-- else if (mount_point)
-- k = asprintf(&name_buffer, "%s on %s", argv[2], mount_point);
-- else if (description)
-- k = asprintf(&name_buffer, "%s (%s)", description, argv[2]);
--
-- if (k < 0) {
-- log_oom();
-- goto finish;
-- }
-- name = name_buffer ? name_buffer : argv[2];
--
- if (arg_header) {
- log_debug("LUKS header: %s", arg_header);
- k = crypt_init(&cd, arg_header);
-@@ -652,7 +678,7 @@ int main(int argc, char *argv[]) {
- _cleanup_strv_free_ char **passwords = NULL;
-
- if (!key_file) {
-- k = get_password(name, until, tries == 0 && !arg_verify, &passwords);
-+ k = get_password(argv[2], argv[3], until, tries == 0 && !arg_verify, &passwords);
- if (k == -EAGAIN)
- continue;
- else if (k < 0)
---
-2.4.1
-
diff --git a/0004-fix-typos-in-systemd-nspawn-man-page.patch b/0004-fix-typos-in-systemd-nspawn-man-page.patch
new file mode 100644
index 0000000..775a701
--- /dev/null
+++ b/0004-fix-typos-in-systemd-nspawn-man-page.patch
@@ -0,0 +1,32 @@
+From cf118c70b6fa165db6d4eeccac3c8b88d9170d2f Mon Sep 17 00:00:00 2001
+From: Jonathan Boulle <jonathan.boulle at coreos.com>
+Date: Fri, 22 May 2015 20:11:01 -0700
+Subject: [PATCH] fix typos in systemd-nspawn man page
+
+(cherry picked from commit 7c918141edad0063a82411e0f9637e72a8aba223)
+---
+ man/systemd-nspawn.xml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml
+index 6a5db86cec..06285edc0b 100644
+--- a/man/systemd-nspawn.xml
++++ b/man/systemd-nspawn.xml
+@@ -330,7 +330,7 @@
+ first host UID to assign to the container, the second
+ parameter specifies the number of host UIDs to assign to the
+ container. If the second parameter is omitted, 65536 UIDs are
+- assigned. If the first parameter is also ommitted (and hence
++ assigned. If the first parameter is also omitted (and hence
+ no parameter passed at all), the first UID assigned to the
+ container is read from the owner of the root directory of the
+ container's directory tree. By default no user namespacing is
+@@ -454,7 +454,7 @@
+ container port number in the range from 1 to 65535. The
+ protocol specifier and its separating colon may be omitted, in
+ which case <literal>tcp</literal> is assumed. The container
+- port number and its colon may be ommitted, in which case the
++ port number and its colon may be omitted, in which case the
+ same port as the host port is implied. This option is only
+ supported if private networking is used, such as
+ <option>--network-veth</option> or
diff --git a/0005-bootctl-fix-an-error-check.patch b/0005-bootctl-fix-an-error-check.patch
new file mode 100644
index 0000000..47ca3b7
--- /dev/null
+++ b/0005-bootctl-fix-an-error-check.patch
@@ -0,0 +1,23 @@
+From 6f1181c3d69c1bd38df5c89ca844686fbd4d1218 Mon Sep 17 00:00:00 2001
+From: Thomas Hindoe Paaboel Andersen <phomes at gmail.com>
+Date: Sat, 23 May 2015 13:02:56 +0200
+Subject: [PATCH] bootctl: fix an error check
+
+(cherry picked from commit dd114e116bf73a616c95a5b9e400199eb3bfa4c7)
+---
+ src/boot/bootctl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c
+index ba534b172e..1e65597acf 100644
+--- a/src/boot/bootctl.c
++++ b/src/boot/bootctl.c
+@@ -805,7 +805,7 @@ static int remove_boot_efi(const char *esp_path) {
+ continue;
+
+ fd = openat(dirfd(d), de->d_name, O_RDONLY|O_CLOEXEC);
+- if (r < 0)
++ if (fd < 0)
+ return log_error_errno(errno, "Failed to open \"%s/%s\" for reading: %m", p, de->d_name);
+
+ r = get_file_version(fd, &v);
diff --git a/0005-rules-fix-typo-in-block-watch-rule.patch b/0005-rules-fix-typo-in-block-watch-rule.patch
deleted file mode 100644
index a399782..0000000
--- a/0005-rules-fix-typo-in-block-watch-rule.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 10c7cf9e109f6b59159e439774b5be5fd1faa24e Mon Sep 17 00:00:00 2001
-From: Tom Gundersen <teg at jklm.no>
-Date: Fri, 29 May 2015 19:59:24 +0200
-Subject: [PATCH] rules: fix typo in block watch rule
-
-The intention was to turn this rule from using a blacklist to a whitelist, but
-there was a stray '!'.
----
- rules/60-block.rules | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/rules/60-block.rules b/rules/60-block.rules
-index de41499..cfd5010 100644
---- a/rules/60-block.rules
-+++ b/rules/60-block.rules
-@@ -8,4 +8,4 @@ ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_
- ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
-
- # watch metadata changes, caused by tools closing the device node which was opened for writing
--ACTION=="add", SUBSYSTEM=="block", KERNEL!="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
-+ACTION=="add", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
diff --git a/0006-rules-restore-block-watch-after-CHANGE-events.patch b/0006-rules-restore-block-watch-after-CHANGE-events.patch
deleted file mode 100644
index ce496a0..0000000
--- a/0006-rules-restore-block-watch-after-CHANGE-events.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 7a41b5a87167c3628d702d5f9db0cba1df4eff2c Mon Sep 17 00:00:00 2001
-From: Tom Gundersen <teg at jklm.no>
-Date: Fri, 29 May 2015 20:55:39 +0200
-Subject: [PATCH] rules: restore block watch after CHANGE events
-
-When processing an event, the watch is disabled, make sure it is restorted after
-a CHANGE event has been processed.
----
- rules/60-block.rules | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/rules/60-block.rules b/rules/60-block.rules
-index cfd5010..a69d648 100644
---- a/rules/60-block.rules
-+++ b/rules/60-block.rules
-@@ -8,4 +8,4 @@ ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_
- ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
-
- # watch metadata changes, caused by tools closing the device node which was opened for writing
--ACTION=="add", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
-+ACTION!="remove", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
diff --git a/0006-udevd-event-fix-event-queue-in-daemenozied-mode.patch b/0006-udevd-event-fix-event-queue-in-daemenozied-mode.patch
new file mode 100644
index 0000000..37511d7
--- /dev/null
+++ b/0006-udevd-event-fix-event-queue-in-daemenozied-mode.patch
@@ -0,0 +1,44 @@
+From 8bfef09df8e1011c6f413822f4455d084b30ba15 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Sun, 24 May 2015 15:20:36 +0200
+Subject: [PATCH] udevd: event - fix event queue in daemenozied mode
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We would enforce that events could only be added to the queue from the
+main process, but that brake in daemonized mode. Relax the restriction
+to only allow one process to add events to the queue.
+
+Reported by Mantas Mikulėnas.
+
+(cherry picked from commit 040e689654ef08c63ab93bf0875865398e8d9c91)
+---
+ src/udev/udevd.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/udev/udevd.c b/src/udev/udevd.c
+index afd4640ad1..2a9a429e66 100644
+--- a/src/udev/udevd.c
++++ b/src/udev/udevd.c
+@@ -564,7 +564,10 @@ static int event_queue_insert(Manager *manager, struct udev_device *dev) {
+ assert(manager);
+ assert(dev);
+
+- /* only the main process can add events to the queue */
++ /* only one process can add events to the queue */
++ if (manager->pid == 0)
++ manager->pid = getpid();
++
+ assert(manager->pid == getpid());
+
+ event = new0(struct event, 1);
+@@ -1300,8 +1303,6 @@ static int manager_new(Manager **ret) {
+ if (!manager)
+ return log_oom();
+
+- manager->pid = getpid();
+-
+ manager->fd_ep = -1;
+ manager->fd_ctrl = -1;
+ manager->fd_uevent = -1;
diff --git a/0007-nspawn-be-verbose-about-interface-names.patch b/0007-nspawn-be-verbose-about-interface-names.patch
new file mode 100644
index 0000000..6ac4a73
--- /dev/null
+++ b/0007-nspawn-be-verbose-about-interface-names.patch
@@ -0,0 +1,32 @@
+From 3f712cd14c3af1ba2d177f5aa72ee63df9a41d0f Mon Sep 17 00:00:00 2001
+From: Umut Tezduyar Lindskog <umut.tezduyar at axis.com>
+Date: Fri, 22 May 2015 16:02:09 +0200
+Subject: [PATCH] nspawn: be verbose about interface names
+
+Allowed interface name is relatively small. Lets not make
+users go in to the source code to figure out what happened.
+
+--machine=debian-tree conflicts with
+--machine=debian-tree2
+
+ex: Failed to add new veth \
+ interfaces (host0, vb-debian-tree): File exists
+
+(cherry picked from commit 637aa8a36ce21e0c83466d9b91ee1bfad2404d1c)
+---
+ src/nspawn/nspawn.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
+index 500936387f..646edea700 100644
+--- a/src/nspawn/nspawn.c
++++ b/src/nspawn/nspawn.c
+@@ -2627,7 +2627,7 @@ static int setup_veth(pid_t pid, char iface_name[IFNAMSIZ], int *ifi) {
+
+ r = sd_rtnl_call(rtnl, m, 0, NULL);
+ if (r < 0)
+- return log_error_errno(r, "Failed to add new veth interfaces: %m");
++ return log_error_errno(r, "Failed to add new veth interfaces (host0, %s): %m", iface_name);
+
+ i = (int) if_nametoindex(iface_name);
+ if (i <= 0)
diff --git a/0008-shared-generator-correct-path-to-systemd-fsck.patch b/0008-shared-generator-correct-path-to-systemd-fsck.patch
new file mode 100644
index 0000000..9bec37f
--- /dev/null
+++ b/0008-shared-generator-correct-path-to-systemd-fsck.patch
@@ -0,0 +1,41 @@
+From 52125df42e5c9f207ccb4455593e2897bed6fbd6 Mon Sep 17 00:00:00 2001
+From: Mike Gilbert <floppym at gentoo.org>
+Date: Sun, 24 May 2015 16:33:35 -0400
+Subject: [PATCH] shared: generator - correct path to systemd-fsck
+
+In generated systemd-fsck-root.service. This would break if rootprefix
+is not /usr/lib/systemd.
+
+[tomegun: flesh out commit message]
+
+(cherry picked from commit 77eb82f9f0f60535ab5f585834ed6e66cf39b184)
+---
+ Makefile.am | 1 +
+ src/shared/generator.c | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 3821ee5eb4..dd1e9e4e48 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -188,6 +188,7 @@ AM_CPPFLAGS = \
+ -DCATALOG_DATABASE=\"$(catalogstatedir)/database\" \
+ -DSYSTEMD_CGROUP_AGENT_PATH=\"$(rootlibexecdir)/systemd-cgroups-agent\" \
+ -DSYSTEMD_BINARY_PATH=\"$(rootlibexecdir)/systemd\" \
++ -DSYSTEMD_FSCK_PATH=\"$(rootlibexecdir)/systemd-fsck\" \
+ -DSYSTEMD_SHUTDOWN_BINARY_PATH=\"$(rootlibexecdir)/systemd-shutdown\" \
+ -DSYSTEMD_SLEEP_BINARY_PATH=\"$(rootlibexecdir)/systemd-sleep\" \
+ -DSYSTEMCTL_BINARY_PATH=\"$(rootbindir)/systemctl\" \
+diff --git a/src/shared/generator.c b/src/shared/generator.c
+index 81284995f5..807569a1b8 100644
+--- a/src/shared/generator.c
++++ b/src/shared/generator.c
+@@ -61,7 +61,7 @@ static int write_fsck_sysroot_service(const char *dir, const char *what) {
+ "[Service]\n"
+ "Type=oneshot\n"
+ "RemainAfterExit=yes\n"
+- "ExecStart=/usr/lib/systemd/systemd-fsck %2$s\n"
++ "ExecStart=" SYSTEMD_FSCK_PATH " %2$s\n"
+ "TimeoutSec=0\n",
+ program_invocation_short_name,
+ what,
diff --git a/0009-networkd-fix-IFF_UP-when-ipv6-support-is-disabled.patch b/0009-networkd-fix-IFF_UP-when-ipv6-support-is-disabled.patch
new file mode 100644
index 0000000..bbfa4a2
--- /dev/null
+++ b/0009-networkd-fix-IFF_UP-when-ipv6-support-is-disabled.patch
@@ -0,0 +1,63 @@
+From c88fd204e9822cd92d97a93f9120c9d58d3a5037 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Mon, 25 May 2015 17:34:47 +0200
+Subject: [PATCH] networkd: fix IFF_UP when ipv6 support is disabled
+
+Passing ipv6 options (even when they should be noops) caused IFF_UP to fail when
+ipv6 was supported.
+
+Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=90103
+(cherry picked from commit 01d28f81a782616b6daa84a42447fd4939783a66)
+---
+ src/network/networkd-link.c | 31 +++++++++++++++++--------------
+ 1 file changed, 17 insertions(+), 14 deletions(-)
+
+diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
+index 8b0de1f741..f039a2d687 100644
+--- a/src/network/networkd-link.c
++++ b/src/network/networkd-link.c
+@@ -1010,27 +1010,30 @@ static int link_up(Link *link) {
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not open IFLA_AF_SPEC container: %m");
+
+- r = sd_rtnl_message_open_container(req, AF_INET6);
+- if (r < 0)
+- return log_link_error_errno(link, r, "Could not open AF_INET6 container: %m");
++ if (socket_ipv6_is_supported()) {
++ /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
++ r = sd_rtnl_message_open_container(req, AF_INET6);
++ if (r < 0)
++ return log_link_error_errno(link, r, "Could not open AF_INET6 container: %m");
+
+- ipv6ll_mode = link_ipv6ll_enabled(link) ? IN6_ADDR_GEN_MODE_EUI64 : IN6_ADDR_GEN_MODE_NONE;
+- r = sd_rtnl_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, ipv6ll_mode);
+- if (r < 0)
+- return log_link_error_errno(link, r, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
++ ipv6ll_mode = link_ipv6ll_enabled(link) ? IN6_ADDR_GEN_MODE_EUI64 : IN6_ADDR_GEN_MODE_NONE;
++ r = sd_rtnl_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, ipv6ll_mode);
++ if (r < 0)
++ return log_link_error_errno(link, r, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
++
++ if (!in_addr_is_null(AF_INET6, &link->network->ipv6_token)) {
++ r = sd_rtnl_message_append_in6_addr(req, IFLA_INET6_TOKEN, &link->network->ipv6_token.in6);
++ if (r < 0)
++ return log_link_error_errno(link, r, "Could not append IFLA_INET6_TOKEN: %m");
++ }
+
+- if (!in_addr_is_null(AF_INET6, &link->network->ipv6_token)) {
+- r = sd_rtnl_message_append_in6_addr(req, IFLA_INET6_TOKEN, &link->network->ipv6_token.in6);
++ r = sd_rtnl_message_close_container(req);
+ if (r < 0)
+- return log_link_error_errno(link, r, "Could not append IFLA_INET6_TOKEN: %m");
++ return log_link_error_errno(link, r, "Could not close AF_INET6 container: %m");
+ }
+
+ r = sd_rtnl_message_close_container(req);
+ if (r < 0)
+- return log_link_error_errno(link, r, "Could not close AF_INET6 container: %m");
+-
+- r = sd_rtnl_message_close_container(req);
+- if (r < 0)
+ return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
+
+ r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
diff --git a/0010-import-dkr-avoid-NULL-pointer-dereference.patch b/0010-import-dkr-avoid-NULL-pointer-dereference.patch
new file mode 100644
index 0000000..d70dc66
--- /dev/null
+++ b/0010-import-dkr-avoid-NULL-pointer-dereference.patch
@@ -0,0 +1,28 @@
+From 8241402c1aadd32f1918d75d04da485430818dcb Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Mon, 25 May 2015 22:47:42 +0200
+Subject: [PATCH] import: dkr - avoid NULL-pointer dereference
+
+A malformed manifest could in principle cause a NULL pointer dereference of. Check
+for this and fail early.
+
+Fixes CID 1299642.
+
+(cherry picked from commit 37591152d261ba980b8992de37ee940c9e5c5da0)
+---
+ src/import/pull-dkr.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/import/pull-dkr.c b/src/import/pull-dkr.c
+index 40aca786a5..d7476dc340 100644
+--- a/src/import/pull-dkr.c
++++ b/src/import/pull-dkr.c
+@@ -864,7 +864,7 @@ static void dkr_pull_job_on_finished_v2(PullJob *j) {
+ }
+
+ e = json_variant_value(doc, "fsLayers");
+- if (!e || e->type != JSON_VARIANT_ARRAY) {
++ if (!e || e->type != JSON_VARIANT_ARRAY || e->size == 0) {
+ r = -EBADMSG;
+ goto finish;
+ }
diff --git a/0011-treewide-fix-typos.patch b/0011-treewide-fix-typos.patch
new file mode 100644
index 0000000..1cfb33a
--- /dev/null
+++ b/0011-treewide-fix-typos.patch
@@ -0,0 +1,162 @@
+From 78f397aa143fed6b978e4923e443e99ab7686662 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Torstein=20Huseb=C3=B8?= <torstein at huseboe.net>
+Date: Tue, 26 May 2015 19:17:30 +0200
+Subject: [PATCH] treewide: fix typos
+
+(cherry picked from commit 45afd51974fb6a88c5b1fe0b325b7b20fd7b7449)
+---
+ NEWS | 4 ++--
+ man/journal-remote.conf.xml | 2 +-
+ src/libsystemd/sd-bus/bus-control.c | 2 +-
+ src/libsystemd/sd-bus/bus-creds.c | 6 +++---
+ src/shared/architecture.c | 2 +-
+ src/shared/architecture.h | 2 +-
+ src/shared/capability.h | 2 +-
+ src/shared/fdset.c | 2 +-
+ src/shared/util.c | 2 +-
+ 9 files changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/NEWS b/NEWS
+index f72f502129..ee533b4363 100644
+--- a/NEWS
++++ b/NEWS
+@@ -3997,7 +3997,7 @@ CHANGES WITH 191:
+ * HandleSleepKey= in logind.conf has been split up into
+ HandleSuspendKey= and HandleHibernateKey=. The old setting
+ is not available anymore. X11 and the kernel are
+- distuingishing between these keys and we should too. This
++ distinguishing between these keys and we should too. This
+ also means the inhibition lock for these keys has been split
+ into two.
+
+@@ -4743,7 +4743,7 @@ CHANGES WITH 43:
+
+ * Various functionality updates to libsystemd-login.so
+
+- * Track class of PAM logins to distuingish greeters from
++ * Track class of PAM logins to distinguish greeters from
+ normal user logins.
+
+ Contributions from: Kay Sievers, Lennart Poettering, Michael
+diff --git a/man/journal-remote.conf.xml b/man/journal-remote.conf.xml
+index a7b2227182..fc60258d0b 100644
+--- a/man/journal-remote.conf.xml
++++ b/man/journal-remote.conf.xml
+@@ -83,7 +83,7 @@
+ <varlistentry>
+ <term><varname>ServerKeyFile=</varname></term>
+
+- <listitem><para>SSL key in PEM format</para></listitem>
++ <listitem><para>SSL key in PEM format.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c
+index fa4c28174d..43ddfc651d 100644
+--- a/src/libsystemd/sd-bus/bus-control.c
++++ b/src/libsystemd/sd-bus/bus-control.c
+@@ -429,7 +429,7 @@ static int bus_populate_creds_from_items(
+ c->mask |= SD_BUS_CREDS_PPID;
+ } else if (item->pids.pid == 1) {
+ /* The structure doesn't
+- * really distuingish the case
++ * really distinguish the case
+ * where a process has no
+ * parent and where we don't
+ * know it because it could
+diff --git a/src/libsystemd/sd-bus/bus-creds.c b/src/libsystemd/sd-bus/bus-creds.c
+index fed66823c7..4d67619cf8 100644
+--- a/src/libsystemd/sd-bus/bus-creds.c
++++ b/src/libsystemd/sd-bus/bus-creds.c
+@@ -303,7 +303,7 @@ _public_ int sd_bus_creds_get_ppid(sd_bus_creds *c, pid_t *ppid) {
+ if (!(c->mask & SD_BUS_CREDS_PPID))
+ return -ENODATA;
+
+- /* PID 1 has no parent process. Let's distuingish the case of
++ /* PID 1 has no parent process. Let's distinguish the case of
+ * not knowing and not having a parent process by the returned
+ * error code. */
+ if (c->ppid == 0)
+@@ -989,7 +989,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
+ if (missing & SD_BUS_CREDS_EXE) {
+ r = get_process_exe(pid, &c->exe);
+ if (r == -ESRCH) {
+- /* Unfortunately we cannot really distuingish
++ /* Unfortunately we cannot really distinguish
+ * the case here where the process does not
+ * exist, and /proc/$PID/exe being unreadable
+ * because $PID is a kernel thread. Hence,
+@@ -1101,7 +1101,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
+ }
+
+ /* In case only the exe path was to be read we cannot
+- * distuingish the case where the exe path was unreadable
++ * distinguish the case where the exe path was unreadable
+ * because the process was a kernel thread, or when the
+ * process didn't exist at all. Hence, let's do a final check,
+ * to be sure. */
+diff --git a/src/shared/architecture.c b/src/shared/architecture.c
+index 884abdd3ea..8e72e7a36a 100644
+--- a/src/shared/architecture.c
++++ b/src/shared/architecture.c
+@@ -35,7 +35,7 @@ int uname_architecture(void) {
+ * 1:1. Instead we try to clean it up and break down the
+ * confusion on x86 and arm in particular.
+ *
+- * We do not try to distuingish CPUs not CPU features, but
++ * We do not try to distinguish CPUs not CPU features, but
+ * actual architectures, i.e. that have genuinely different
+ * code. */
+
+diff --git a/src/shared/architecture.h b/src/shared/architecture.h
+index cb82418a5e..f5bbf65a90 100644
+--- a/src/shared/architecture.h
++++ b/src/shared/architecture.h
+@@ -27,7 +27,7 @@
+
+ /* A cleaned up architecture definition. We don't want to get lost in
+ * processor features, models, generations or even ABIs. Hence we
+- * focus on general family, and distuignish word width and
++ * focus on general family, and distinguish word width and
+ * endianness. */
+
+ enum {
+diff --git a/src/shared/capability.h b/src/shared/capability.h
+index 8260ae1a81..4eb5c2a835 100644
+--- a/src/shared/capability.h
++++ b/src/shared/capability.h
+@@ -31,7 +31,7 @@ int have_effective_cap(int value);
+ int capability_bounding_set_drop(uint64_t drop, bool right_now);
+ int capability_bounding_set_drop_usermode(uint64_t drop);
+
+-int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilites);
++int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilities);
+
+ int drop_capability(cap_value_t cv);
+
+diff --git a/src/shared/fdset.c b/src/shared/fdset.c
+index 31849272bd..6101b628ec 100644
+--- a/src/shared/fdset.c
++++ b/src/shared/fdset.c
+@@ -32,7 +32,7 @@
+ #define MAKE_SET(s) ((Set*) s)
+ #define MAKE_FDSET(s) ((FDSet*) s)
+
+-/* Make sure we can distuingish fd 0 and NULL */
++/* Make sure we can distinguish fd 0 and NULL */
+ #define FD_TO_PTR(fd) INT_TO_PTR((fd)+1)
+ #define PTR_TO_FD(p) (PTR_TO_INT(p)-1)
+
+diff --git a/src/shared/util.c b/src/shared/util.c
+index 34024bacc4..74a2190031 100644
+--- a/src/shared/util.c
++++ b/src/shared/util.c
+@@ -5887,7 +5887,7 @@ int same_fd(int a, int b) {
+
+ /* The fds refer to the same inode on disk, let's also check
+ * if they have the same fd flags. This is useful to
+- * distuingish the read and write side of a pipe created with
++ * distinguish the read and write side of a pipe created with
+ * pipe(). */
+ fa = fcntl(a, F_GETFL);
+ if (fa < 0)
diff --git a/0012-logind-unlink-run-nologin-when-shutdown-is-cancelled.patch b/0012-logind-unlink-run-nologin-when-shutdown-is-cancelled.patch
new file mode 100644
index 0000000..76482cd
--- /dev/null
+++ b/0012-logind-unlink-run-nologin-when-shutdown-is-cancelled.patch
@@ -0,0 +1,29 @@
+From 0569c6e3c9d19c04eb2614bd8769e5eb32764371 Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel at zonque.org>
+Date: Tue, 26 May 2015 18:56:40 +0200
+Subject: [PATCH] logind: unlink /run/nologin when shutdown is cancelled
+
+When a scheduled is cancelled, make sure to remove /run/nologin.
+This is a regression from the recent shutdownd removal and logind rework.
+
+(cherry picked from commit fb91034cf5907bbbabba1e8821b01f3b37aa56d5)
+---
+ src/login/logind-dbus.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
+index 1f5cf865b1..3555bcc2f5 100644
+--- a/src/login/logind-dbus.c
++++ b/src/login/logind-dbus.c
+@@ -1964,6 +1964,11 @@ static int method_cancel_scheduled_shutdown(sd_bus_message *message, void *userd
+ m->scheduled_shutdown_type = NULL;
+ m->scheduled_shutdown_timeout = 0;
+
++ if (m->unlink_nologin) {
++ unlink("/run/nologin");
++ m->unlink_nologin = false;
++ }
++
+ if (cancelled) {
+ _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+ const char *tty = NULL;
diff --git a/0013-missing-add-more-IFLA_VXLAN_-defines.patch b/0013-missing-add-more-IFLA_VXLAN_-defines.patch
new file mode 100644
index 0000000..c066251
--- /dev/null
+++ b/0013-missing-add-more-IFLA_VXLAN_-defines.patch
@@ -0,0 +1,55 @@
+From 091acba43685c70d0a38d43167f44fe2622b3c15 Mon Sep 17 00:00:00 2001
+From: Michael Olbrich <m.olbrich at pengutronix.de>
+Date: Tue, 26 May 2015 07:48:48 +0200
+Subject: [PATCH] missing: add more IFLA_VXLAN_* defines
+
+Otherwise building faild with kernel headers < v3.16
+
+(cherry picked from commit 583c14fc04a089e9af70a3fa0b8c0a8c27c06ec0)
+---
+ configure.ac | 2 +-
+ src/shared/missing.h | 11 +++++++++--
+ 2 files changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 48cedb5ab6..0818dd80cf 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -334,7 +334,7 @@ AC_CHECK_DECLS([IFLA_INET6_ADDR_GEN_MODE,
+ IFLA_PHYS_PORT_ID,
+ IFLA_BOND_AD_INFO,
+ IFLA_VLAN_PROTOCOL,
+- IFLA_VXLAN_LOCAL6,
++ IFLA_VXLAN_REMCSUM_NOPARTIAL,
+ IFLA_IPTUN_6RD_RELAY_PREFIXLEN,
+ IFLA_BRIDGE_VLAN_INFO,
+ IFLA_BRPORT_UNICAST_FLOOD,
+diff --git a/src/shared/missing.h b/src/shared/missing.h
+index 8ca6f8edb6..9194009491 100644
+--- a/src/shared/missing.h
++++ b/src/shared/missing.h
+@@ -713,7 +713,7 @@ static inline int setns(int fd, int nstype) {
+ #define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1)
+ #endif
+
+-#if !HAVE_DECL_IFLA_VXLAN_LOCAL6
++#if !HAVE_DECL_IFLA_VXLAN_REMCSUM_NOPARTIAL
+ #define IFLA_VXLAN_UNSPEC 0
+ #define IFLA_VXLAN_ID 1
+ #define IFLA_VXLAN_GROUP 2
+@@ -732,7 +732,14 @@ static inline int setns(int fd, int nstype) {
+ #define IFLA_VXLAN_PORT 15
+ #define IFLA_VXLAN_GROUP6 16
+ #define IFLA_VXLAN_LOCAL6 17
+-#define __IFLA_VXLAN_MAX 18
++#define IFLA_VXLAN_UDP_CSUM 18
++#define IFLA_VXLAN_UDP_ZERO_CSUM6_TX 19
++#define IFLA_VXLAN_UDP_ZERO_CSUM6_RX 20
++#define IFLA_VXLAN_REMCSUM_TX 21
++#define IFLA_VXLAN_REMCSUM_RX 22
++#define IFLA_VXLAN_GBP 23
++#define IFLA_VXLAN_REMCSUM_NOPARTIAL 24
++#define __IFLA_VXLAN_MAX 25
+
+ #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1)
+ #endif
diff --git a/0014-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch b/0014-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch
new file mode 100644
index 0000000..12d6ad2
--- /dev/null
+++ b/0014-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch
@@ -0,0 +1,77 @@
+From 8300a7a170f44490d4e86541fbbad2b90cd52ce0 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Wed, 27 May 2015 18:39:36 +0200
+Subject: [PATCH] udevd: fix SIGCHLD handling in --daemon mode
+
+We were listening for SIGCHLD in the wrong process.
+
+(cherry picked from commit 86c3bece38bcf55da6387d20c6f01da9ad0284dc)
+---
+ src/udev/udevd.c | 33 ++++++++++++++++++++++-----------
+ 1 file changed, 22 insertions(+), 11 deletions(-)
+
+diff --git a/src/udev/udevd.c b/src/udev/udevd.c
+index 2a9a429e66..b5dadbc8e4 100644
+--- a/src/udev/udevd.c
++++ b/src/udev/udevd.c
+@@ -1289,13 +1289,6 @@ static int parse_argv(int argc, char *argv[]) {
+
+ static int manager_new(Manager **ret) {
+ _cleanup_(manager_freep) Manager *manager = NULL;
+- struct epoll_event ep_ctrl = { .events = EPOLLIN };
+- struct epoll_event ep_inotify = { .events = EPOLLIN };
+- struct epoll_event ep_signal = { .events = EPOLLIN };
+- struct epoll_event ep_netlink = { .events = EPOLLIN };
+- struct epoll_event ep_worker = { .events = EPOLLIN };
+- sigset_t mask;
+- int r, one = 1;
+
+ assert(ret);
+
+@@ -1324,6 +1317,23 @@ static int manager_new(Manager **ret) {
+ udev_list_node_init(&manager->events);
+ udev_list_init(manager->udev, &manager->properties, true);
+
++ *ret = manager;
++ manager = NULL;
++
++ return 0;
++}
++
++static int manager_listen(Manager *manager) {
++ struct epoll_event ep_ctrl = { .events = EPOLLIN };
++ struct epoll_event ep_inotify = { .events = EPOLLIN };
++ struct epoll_event ep_signal = { .events = EPOLLIN };
++ struct epoll_event ep_netlink = { .events = EPOLLIN };
++ struct epoll_event ep_worker = { .events = EPOLLIN };
++ sigset_t mask;
++ int r, one = 1;
++
++ assert(manager);
++
+ r = systemd_fds(&manager->fd_ctrl, &manager->fd_uevent);
+ if (r >= 0) {
+ /* get control and netlink socket from systemd */
+@@ -1405,10 +1415,7 @@ static int manager_new(Manager **ret) {
+ epoll_ctl(manager->fd_ep, EPOLL_CTL_ADD, manager->fd_worker, &ep_worker) < 0)
+ return log_error_errno(errno, "fail to add fds to epoll: %m");
+
+- *ret = manager;
+- manager = NULL;
+-
+- return 1;
++ return 0;
+ }
+
+ int main(int argc, char *argv[]) {
+@@ -1519,6 +1526,10 @@ int main(int argc, char *argv[]) {
+ } else
+ sd_notify(1, "READY=1");
+
++ r = manager_listen(manager);
++ if (r < 0)
++ return log_error_errno(r, "failed to set up fds and listen for events: %m");
++
+ for (;;) {
+ static usec_t last_usec;
+ struct epoll_event ev[8];
diff --git a/0015-sd-device-fix-device_get_properties_strv.patch b/0015-sd-device-fix-device_get_properties_strv.patch
new file mode 100644
index 0000000..5946951
--- /dev/null
+++ b/0015-sd-device-fix-device_get_properties_strv.patch
@@ -0,0 +1,33 @@
+From 864dfcd49d764866a9795ea6e3f39c1f7c85b509 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Wed, 27 May 2015 23:26:39 +0200
+Subject: [PATCH] sd-device: fix device_get_properties_strv()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+A NULL pointer was inserted as the first element of the strv.
+
+This had the effect of always passing the empty environment to processes
+spawned by udev.
+
+Reported by Michał Bartoszkiewicz.
+
+(cherry picked from commit 0e3e60561395a8dd0464f9427d7fc9209bf3b007)
+---
+ src/libsystemd/sd-device/device-private.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c
+index 3cadedbf4a..10370af029 100644
+--- a/src/libsystemd/sd-device/device-private.c
++++ b/src/libsystemd/sd-device/device-private.c
+@@ -659,7 +659,7 @@ static int device_update_properties_bufs(sd_device *device) {
+ if (!buf_strv)
+ return -ENOMEM;
+
+- buf_strv[++ strv_size] = (char *)&buf_nulstr[nulstr_len];
++ buf_strv[strv_size ++] = (char *)&buf_nulstr[nulstr_len];
+ strscpyl((char *)buf_nulstr + nulstr_len, len + 1, prop, "=", val, NULL);
+ nulstr_len += len + 1;
+ }
diff --git a/0016-man-fix-systemd.resource-control-5-volume-number.patch b/0016-man-fix-systemd.resource-control-5-volume-number.patch
new file mode 100644
index 0000000..14c0a45
--- /dev/null
+++ b/0016-man-fix-systemd.resource-control-5-volume-number.patch
@@ -0,0 +1,23 @@
+From 6ef870184fd2952802c72cf8782745fc613aa233 Mon Sep 17 00:00:00 2001
+From: Patrick Donnelly <batrick at batbytes.com>
+Date: Wed, 27 May 2015 15:47:02 -0400
+Subject: [PATCH] man: fix systemd.resource-control(5) volume number
+
+(cherry picked from commit c4e87748d5d3f574d335a87e3a6272276814b2fd)
+---
+ man/systemd.slice.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/man/systemd.slice.xml b/man/systemd.slice.xml
+index f0bac41763..a501327335 100644
+--- a/man/systemd.slice.xml
++++ b/man/systemd.slice.xml
+@@ -90,7 +90,7 @@
+ slice specific configuration options are configured in
+ the [Slice] section. Currently, only generic resource control settings
+ as described in
+- <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>7</manvolnum></citerefentry> are allowed.
++ <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry> are allowed.
+ </para>
+
+ <para>Unless <varname>DefaultDependencies=false</varname>
diff --git a/0017-sd-device-enumerator-fix-matching-on-properties-and-.patch b/0017-sd-device-enumerator-fix-matching-on-properties-and-.patch
new file mode 100644
index 0000000..955acd2
--- /dev/null
+++ b/0017-sd-device-enumerator-fix-matching-on-properties-and-.patch
@@ -0,0 +1,44 @@
+From be215abe14beac522e326be14ba44fcf989e4359 Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Thu, 28 May 2015 17:18:33 +0200
+Subject: [PATCH] sd-device: enumerator - fix matching on properties and
+ sysattrs
+
+This was a regression that broke
+
+ $ udevadm trigger -nv --property-match=DEVNAME=/dev/sda1 --attr-match=size=409600
+
+Reported by David Reisner.
+
+(cherry picked from commit 5f529f4c97a141457301477505ae7eb4c28cf610)
+---
+ src/libsystemd/sd-device/device-enumerator.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c
+index ce4862d7f0..3692d46e06 100644
+--- a/src/libsystemd/sd-device/device-enumerator.c
++++ b/src/libsystemd/sd-device/device-enumerator.c
+@@ -367,11 +367,11 @@ static bool match_sysattr(sd_device_enumerator *enumerator, sd_device *device) {
+ assert(enumerator);
+ assert(device);
+
+- HASHMAP_FOREACH_KEY(sysattr, value, enumerator->nomatch_sysattr, i)
++ HASHMAP_FOREACH_KEY(value, sysattr, enumerator->nomatch_sysattr, i)
+ if (match_sysattr_value(device, sysattr, value))
+ return false;
+
+- HASHMAP_FOREACH_KEY(sysattr, value, enumerator->match_sysattr, i)
++ HASHMAP_FOREACH_KEY(value, sysattr, enumerator->match_sysattr, i)
+ if (!match_sysattr_value(device, sysattr, value))
+ return false;
+
+@@ -389,7 +389,7 @@ static bool match_property(sd_device_enumerator *enumerator, sd_device *device)
+ if (hashmap_isempty(enumerator->match_property))
+ return true;
+
+- HASHMAP_FOREACH_KEY(property, value, enumerator->match_property, i) {
++ HASHMAP_FOREACH_KEY(value, property, enumerator->match_property, i) {
+ const char *property_dev, *value_dev;
+
+ FOREACH_DEVICE_PROPERTY(device, property_dev, value_dev) {
diff --git a/0018-build-sys-fix-typo.patch b/0018-build-sys-fix-typo.patch
new file mode 100644
index 0000000..9c7aab8
--- /dev/null
+++ b/0018-build-sys-fix-typo.patch
@@ -0,0 +1,27 @@
+From bb3f5d2012812ff6ce56ca3139e17c488b7ca30b Mon Sep 17 00:00:00 2001
+From: Karel Zak <kzak at redhat.com>
+Date: Fri, 29 May 2015 13:42:35 +0200
+Subject: [PATCH] build-sys: fix typo
+
+There is nothing like systemd_verify_* in Makefile.am. The bug has
+been invisible because automake uses the default CFLAGS when component
+CFLAGS are undefined.
+
+(cherry picked from commit 144b1b4b34b6ae20a690e31c3d14dbb96341448b)
+---
+ Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index dd1e9e4e48..5310a30284 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -2132,7 +2132,7 @@ systemd_analyze_SOURCES = \
+ src/analyze/analyze-verify.c \
+ src/analyze/analyze-verify.h
+
+-systemd_verify_CFLAGS = \
++systemd_analyze_CFLAGS = \
+ $(AM_CFLAGS) \
+ $(SECCOMP_CFLAGS)
+
diff --git a/0019-path-util-Fix-path_is_mount_point-for-files.patch b/0019-path-util-Fix-path_is_mount_point-for-files.patch
new file mode 100644
index 0000000..5eb6f40
--- /dev/null
+++ b/0019-path-util-Fix-path_is_mount_point-for-files.patch
@@ -0,0 +1,270 @@
+From 117a45829a6be1ef728616c3c90fc8c6f9eda318 Mon Sep 17 00:00:00 2001
+From: Martin Pitt <martin.pitt at ubuntu.com>
+Date: Wed, 27 May 2015 09:56:03 +0200
+Subject: [PATCH] path-util: Fix path_is_mount_point for files
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Commits 27cc6f166 and f25afeb broke path_is_mount_point() for files (such as
+/etc/machine-id → /run/machine-id bind mounts) as with the factorization of
+fd_is_mount_point() we lost the parent directory. We cannot determine that from
+an fd only as openat(fd, "..") only works for directory fds.
+
+Change fd_is_mount_point() to behave like openat(): It now takes a file
+descriptor of the containing directory, a file name in it, and flags (which can
+be 0 or AT_SYMLINK_FOLLOW). Unlike name_to_handle_at() or openat(), fstatat()
+only accepts the inverse flag AT_SYMLINK_NOFOLLOW and complains with EINVAL
+about AT_SYMLINK_FOLLOW; so we need to transform the flags for that fallback.
+
+Adjust rm_rf_children() accordingly (only other caller of fd_is_mount_point()
+aside from path_is_mount_point()).
+
+Add test cases for files, links, and file bind mounts (the latter will only
+work when running as root). Split out a new test_path_is_mount_point() test
+case function as it got significantly larger now.
+
+(cherry picked from commit 5d409034017e9f9f8c4392157d95511fc2e05d87)
+---
+ src/shared/path-util.c | 31 +++++++++++++------
+ src/shared/path-util.h | 2 +-
+ src/shared/rm-rf.c | 2 +-
+ src/test/test-path-util.c | 76 +++++++++++++++++++++++++++++++++++++++--------
+ 4 files changed, 87 insertions(+), 24 deletions(-)
+
+diff --git a/src/shared/path-util.c b/src/shared/path-util.c
+index 7090989fcb..8be479cd7f 100644
+--- a/src/shared/path-util.c
++++ b/src/shared/path-util.c
+@@ -509,7 +509,7 @@ static int fd_fdinfo_mnt_id(int fd, const char *filename, int flags, int *mnt_id
+ return safe_atoi(p, mnt_id);
+ }
+
+-int fd_is_mount_point(int fd) {
++int fd_is_mount_point(int fd, const char *filename, int flags) {
+ union file_handle_union h = FILE_HANDLE_INIT, h_parent = FILE_HANDLE_INIT;
+ int mount_id = -1, mount_id_parent = -1;
+ bool nosupp = false, check_st_dev = true;
+@@ -517,6 +517,7 @@ int fd_is_mount_point(int fd) {
+ int r;
+
+ assert(fd >= 0);
++ assert(filename);
+
+ /* First we will try the name_to_handle_at() syscall, which
+ * tells us the mount id and an opaque file "handle". It is
+@@ -541,7 +542,7 @@ int fd_is_mount_point(int fd) {
+ * subvolumes have different st_dev, even though they aren't
+ * real mounts of their own. */
+
+- r = name_to_handle_at(fd, "", &h.handle, &mount_id, AT_EMPTY_PATH);
++ r = name_to_handle_at(fd, filename, &h.handle, &mount_id, flags);
+ if (r < 0) {
+ if (errno == ENOSYS)
+ /* This kernel does not support name_to_handle_at()
+@@ -558,7 +559,7 @@ int fd_is_mount_point(int fd) {
+ return -errno;
+ }
+
+- r = name_to_handle_at(fd, "..", &h_parent.handle, &mount_id_parent, 0);
++ r = name_to_handle_at(fd, "", &h_parent.handle, &mount_id_parent, AT_EMPTY_PATH);
+ if (r < 0) {
+ if (errno == EOPNOTSUPP) {
+ if (nosupp)
+@@ -593,13 +594,13 @@ int fd_is_mount_point(int fd) {
+ return mount_id != mount_id_parent;
+
+ fallback_fdinfo:
+- r = fd_fdinfo_mnt_id(fd, "", AT_EMPTY_PATH, &mount_id);
++ r = fd_fdinfo_mnt_id(fd, filename, flags, &mount_id);
+ if (r == -EOPNOTSUPP)
+ goto fallback_fstat;
+ if (r < 0)
+ return r;
+
+- r = fd_fdinfo_mnt_id(fd, "..", 0, &mount_id_parent);
++ r = fd_fdinfo_mnt_id(fd, "", AT_EMPTY_PATH, &mount_id_parent);
+ if (r < 0)
+ return r;
+
+@@ -615,10 +616,16 @@ fallback_fdinfo:
+ check_st_dev = false;
+
+ fallback_fstat:
+- if (fstatat(fd, "", &a, AT_EMPTY_PATH) < 0)
++ /* yay for fstatat() taking a different set of flags than the other
++ * _at() above */
++ if (flags & AT_SYMLINK_FOLLOW)
++ flags &= ~AT_SYMLINK_FOLLOW;
++ else
++ flags |= AT_SYMLINK_NOFOLLOW;
++ if (fstatat(fd, filename, &a, flags) < 0)
+ return -errno;
+
+- if (fstatat(fd, "..", &b, 0) < 0)
++ if (fstatat(fd, "", &b, AT_EMPTY_PATH) < 0)
+ return -errno;
+
+ /* A directory with same device and inode as its parent? Must
+@@ -632,17 +639,23 @@ fallback_fstat:
+
+ int path_is_mount_point(const char *t, bool allow_symlink) {
+ _cleanup_close_ int fd = -1;
++ _cleanup_free_ char *parent = NULL;
++ int r;
+
+ assert(t);
+
+ if (path_equal(t, "/"))
+ return 1;
+
+- fd = openat(AT_FDCWD, t, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|(allow_symlink ? 0 : O_PATH));
++ r = path_get_parent(t, &parent);
++ if (r < 0)
++ return r;
++
++ fd = openat(AT_FDCWD, parent, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_PATH);
+ if (fd < 0)
+ return -errno;
+
+- return fd_is_mount_point(fd);
++ return fd_is_mount_point(fd, basename(t), (allow_symlink ? AT_SYMLINK_FOLLOW : 0));
+ }
+
+ int path_is_read_only_fs(const char *path) {
+diff --git a/src/shared/path-util.h b/src/shared/path-util.h
+index 4f45cfd2b7..38ad799ba0 100644
+--- a/src/shared/path-util.h
++++ b/src/shared/path-util.h
+@@ -53,7 +53,7 @@ char** path_strv_make_absolute_cwd(char **l);
+ char** path_strv_resolve(char **l, const char *prefix);
+ char** path_strv_resolve_uniq(char **l, const char *prefix);
+
+-int fd_is_mount_point(int fd);
++int fd_is_mount_point(int fd, const char *filename, int flags);
+ int path_is_mount_point(const char *path, bool allow_symlink);
+ int path_is_read_only_fs(const char *path);
+ int path_is_os_tree(const char *path);
+diff --git a/src/shared/rm-rf.c b/src/shared/rm-rf.c
+index a89e8afc2a..bafd483be2 100644
+--- a/src/shared/rm-rf.c
++++ b/src/shared/rm-rf.c
+@@ -103,7 +103,7 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
+ }
+
+ /* Stop at mount points */
+- r = fd_is_mount_point(subdir_fd);
++ r = fd_is_mount_point(fd, de->d_name, 0);
+ if (r < 0) {
+ if (ret == 0 && r != -ENOENT)
+ ret = r;
+diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c
+index 09f0f2f89e..80782ff902 100644
+--- a/src/test/test-path-util.c
++++ b/src/test/test-path-util.c
+@@ -21,6 +21,7 @@
+
+ #include <stdio.h>
+ #include <unistd.h>
++#include <sys/mount.h>
+
+ #include "path-util.h"
+ #include "util.h"
+@@ -88,21 +89,9 @@ static void test_path(void) {
+ test_parent("/aa///file...", "/aa///");
+ test_parent("file.../", NULL);
+
+- assert_se(path_is_mount_point("/", true) > 0);
+- assert_se(path_is_mount_point("/", false) > 0);
+-
+ fd = open("/", O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY);
+ assert_se(fd >= 0);
+- assert_se(fd_is_mount_point(fd) > 0);
+-
+- assert_se(path_is_mount_point("/proc", true) > 0);
+- assert_se(path_is_mount_point("/proc", false) > 0);
+-
+- assert_se(path_is_mount_point("/proc/1", true) == 0);
+- assert_se(path_is_mount_point("/proc/1", false) == 0);
+-
+- assert_se(path_is_mount_point("/sys", true) > 0);
+- assert_se(path_is_mount_point("/sys", false) > 0);
++ assert_se(fd_is_mount_point(fd, "/", 0) > 0);
+
+ {
+ char p1[] = "aaa/bbb////ccc";
+@@ -322,6 +311,66 @@ static void test_prefix_root(void) {
+ test_prefix_root_one("/foo///", "//bar", "/foo/bar");
+ }
+
++static void test_path_is_mount_point(void) {
++ int fd, rt, rf, rlt, rlf;
++ char tmp_dir[] = "/tmp/test-path-is-mount-point-XXXXXX";
++ _cleanup_free_ char *file1 = NULL, *file2 = NULL, *link1 = NULL, *link2 = NULL;
++
++ assert_se(path_is_mount_point("/", true) > 0);
++ assert_se(path_is_mount_point("/", false) > 0);
++
++ assert_se(path_is_mount_point("/proc", true) > 0);
++ assert_se(path_is_mount_point("/proc", false) > 0);
++
++ assert_se(path_is_mount_point("/proc/1", true) == 0);
++ assert_se(path_is_mount_point("/proc/1", false) == 0);
++
++ assert_se(path_is_mount_point("/sys", true) > 0);
++ assert_se(path_is_mount_point("/sys", false) > 0);
++
++ /* file mountpoints */
++ assert_se(mkdtemp(tmp_dir) != NULL);
++ file1 = path_join(NULL, tmp_dir, "file1");
++ assert_se(file1);
++ file2 = path_join(NULL, tmp_dir, "file2");
++ assert_se(file2);
++ fd = open(file1, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
++ assert_se(fd > 0);
++ close(fd);
++ fd = open(file2, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0664);
++ assert_se(fd > 0);
++ close(fd);
++ link1 = path_join(NULL, tmp_dir, "link1");
++ assert_se(link1);
++ assert_se(symlink("file1", link1) == 0);
++ link2 = path_join(NULL, tmp_dir, "link2");
++ assert_se(link1);
++ assert_se(symlink("file2", link2) == 0);
++
++ assert_se(path_is_mount_point(file1, true) == 0);
++ assert_se(path_is_mount_point(file1, false) == 0);
++ assert_se(path_is_mount_point(link1, true) == 0);
++ assert_se(path_is_mount_point(link1, false) == 0);
++
++ /* this test will only work as root */
++ if (mount(file1, file2, NULL, MS_BIND, NULL) >= 0) {
++ rf = path_is_mount_point(file2, false);
++ rt = path_is_mount_point(file2, true);
++ rlf = path_is_mount_point(link2, false);
++ rlt = path_is_mount_point(link2, true);
++
++ assert_se(umount(file2) == 0);
++
++ assert_se(rf == 1);
++ assert_se(rt == 1);
++ assert_se(rlf == 0);
++ assert_se(rlt == 1);
++ } else
++ printf("Skipping bind mount file test: %m\n");
++
++ assert_se(rm_rf(tmp_dir, REMOVE_ROOT|REMOVE_PHYSICAL) == 0);
++}
++
+ int main(int argc, char **argv) {
+ test_path();
+ test_find_binary(argv[0], true);
+@@ -333,6 +382,7 @@ int main(int argc, char **argv) {
+ test_strv_resolve();
+ test_path_startswith();
+ test_prefix_root();
++ test_path_is_mount_point();
+
+ return 0;
+ }
diff --git a/0020-rules-fix-typo-in-block-watch-rule.patch b/0020-rules-fix-typo-in-block-watch-rule.patch
new file mode 100644
index 0000000..d1b2fbd
--- /dev/null
+++ b/0020-rules-fix-typo-in-block-watch-rule.patch
@@ -0,0 +1,23 @@
+From 4fa8d70f0e914346c2a46c05bbb356eaae7d527c Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Fri, 29 May 2015 19:59:24 +0200
+Subject: [PATCH] rules: fix typo in block watch rule
+
+The intention was to turn this rule from using a blacklist to a whitelist, but
+there was a stray '!'.
+
+(cherry picked from commit f07689517e3715d03590e779841647aed0cd2ba7)
+---
+ rules/60-block.rules | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rules/60-block.rules b/rules/60-block.rules
+index de41499cb7..cfd5010bbd 100644
+--- a/rules/60-block.rules
++++ b/rules/60-block.rules
+@@ -8,4 +8,4 @@ ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_
+ ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
+
+ # watch metadata changes, caused by tools closing the device node which was opened for writing
+-ACTION=="add", SUBSYSTEM=="block", KERNEL!="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
++ACTION=="add", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
diff --git a/0021-rules-restore-block-watch-after-CHANGE-events.patch b/0021-rules-restore-block-watch-after-CHANGE-events.patch
new file mode 100644
index 0000000..e58de65
--- /dev/null
+++ b/0021-rules-restore-block-watch-after-CHANGE-events.patch
@@ -0,0 +1,23 @@
+From d854d0f65a7fa84bed1703a36a7f15aff40aa6ca Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Fri, 29 May 2015 20:55:39 +0200
+Subject: [PATCH] rules: restore block watch after CHANGE events
+
+When processing an event, the watch is disabled, make sure it is restorted after
+a CHANGE event has been processed.
+
+(cherry picked from commit b50063512d4be4d29e0ca5d28f66bc1121861e3b)
+---
+ rules/60-block.rules | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rules/60-block.rules b/rules/60-block.rules
+index cfd5010bbd..a69d648023 100644
+--- a/rules/60-block.rules
++++ b/rules/60-block.rules
+@@ -8,4 +8,4 @@ ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_
+ ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
+
+ # watch metadata changes, caused by tools closing the device node which was opened for writing
+-ACTION=="add", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
++ACTION!="remove", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
diff --git a/0022-zsh-completion-update-bootctl.patch b/0022-zsh-completion-update-bootctl.patch
new file mode 100644
index 0000000..93f7ff4
--- /dev/null
+++ b/0022-zsh-completion-update-bootctl.patch
@@ -0,0 +1,33 @@
+From 4ee8c1c46cdb745db3e62dfc8e945dc73427ba04 Mon Sep 17 00:00:00 2001
+From: Ronny Chevalier <chevalier.ronny at gmail.com>
+Date: Sun, 24 May 2015 13:25:52 +0200
+Subject: [PATCH] zsh-completion: update bootctl
+
+(cherry picked from commit da090dfd0b6a86694084ebc27645ead3f25ef0b6)
+---
+ shell-completion/zsh/_bootctl | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/shell-completion/zsh/_bootctl b/shell-completion/zsh/_bootctl
+index 7d2453cc2c..ce776c052f 100644
+--- a/shell-completion/zsh/_bootctl
++++ b/shell-completion/zsh/_bootctl
+@@ -4,7 +4,10 @@
+ {
+ local -a _bootctl_cmds
+ _bootctl_cmds=(
+- "status:Show current firmware and boot settings"
++ "status:Show status of installed systemd-boot and EFI variables"
++ "instal:Install systemd-boot to the ESP and EFI variables"
++ "update:Update systemd-boot in the ESP and EFI variables"
++ "remove:Remove systemd-boot from the ESP and EFI variables"
+ )
+ if (( CURRENT == 1 )); then
+ _describe -t commands 'bootctl command' _bootctl_cmds || compadd "$@"
+@@ -22,4 +25,6 @@
+ _arguments \
+ {-h,--help}'[Prints a short help text and exits.]' \
+ '--version[Prints a short version string and exits.]' \
++ '--path=[Path to the EFI System Partition (ESP)]:path:_directories' \
++ '--no-variables[Do not touch EFI variables]' \
+ '*::bootctl command:_bootctl_command'
diff --git a/0023-README-fix-typo.patch b/0023-README-fix-typo.patch
new file mode 100644
index 0000000..98909b7
--- /dev/null
+++ b/0023-README-fix-typo.patch
@@ -0,0 +1,23 @@
+From ed341dc136505c1919d34d2ef24d48370c2d3368 Mon Sep 17 00:00:00 2001
+From: Ronny Chevalier <chevalier.ronny at gmail.com>
+Date: Sat, 30 May 2015 10:31:41 +0200
+Subject: [PATCH] README: fix typo
+
+(cherry picked from commit 8f42ccd24ba3cbdb994094df4aac69a00c3c7367)
+---
+ README | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/README b/README
+index 039110e880..b909b434db 100644
+--- a/README
++++ b/README
+@@ -239,7 +239,7 @@ WARNINGS:
+ supported anymore by the basic set of Linux OS components.
+
+ systemd requires that the /run mount point exists. systemd also
+- requires that /var/run is a a symlink to /run.
++ requires that /var/run is a symlink to /run.
+
+ For more information on this issue consult
+ http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken
diff --git a/0024-networkctl-fix-uninitialized-variable.patch b/0024-networkctl-fix-uninitialized-variable.patch
new file mode 100644
index 0000000..fa38dc4
--- /dev/null
+++ b/0024-networkctl-fix-uninitialized-variable.patch
@@ -0,0 +1,27 @@
+From fb9a5b5144ab5654197cd9dab7a339976f10450b Mon Sep 17 00:00:00 2001
+From: Ronny Chevalier <chevalier.ronny at gmail.com>
+Date: Sat, 30 May 2015 10:51:41 +0200
+Subject: [PATCH] networkctl: fix uninitialized variable
+
+We ignore the return value of sd_device_get_devtype, then devtype could
+be uninitialized when used with streq_ptr. So we need to initialize it
+first.
+
+(cherry picked from commit 732b7f39a2b3b1a2af90102c6262186ae71197ac)
+---
+ src/network/networkctl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/network/networkctl.c b/src/network/networkctl.c
+index 69b4ab4a5c..3454394977 100644
+--- a/src/network/networkctl.c
++++ b/src/network/networkctl.c
+@@ -62,7 +62,7 @@ static int link_get_type_string(int iftype, sd_device *d, char **ret) {
+ assert(ret);
+
+ if (iftype == ARPHRD_ETHER && d) {
+- const char *devtype, *id = NULL;
++ const char *devtype = NULL, *id = NULL;
+ /* WLANs have iftype ARPHRD_ETHER, but we want
+ * to show a more useful type string for
+ * them */
diff --git a/0025-conf-parser-parsing-error-logs-should-show-a-type-no.patch b/0025-conf-parser-parsing-error-logs-should-show-a-type-no.patch
new file mode 100644
index 0000000..09223f2
--- /dev/null
+++ b/0025-conf-parser-parsing-error-logs-should-show-a-type-no.patch
@@ -0,0 +1,30 @@
+From 4cdc2411e6d31879ac3409ccd8cdd5eebee9ed35 Mon Sep 17 00:00:00 2001
+From: Ronny Chevalier <chevalier.ronny at gmail.com>
+Date: Sat, 30 May 2015 12:21:26 +0200
+Subject: [PATCH] conf-parser: parsing error logs should show a type not a
+ vartype
+
+Instead of this:
+[filename:1] Failed to parse nsec_t value, ignoring: garbage
+
+we show this:
+[filename:1] Failed to parse nsec value, ignoring: garbage
+
+(cherry picked from commit 98d75800461c091e95398936ceb1efc2d5a3f699)
+---
+ src/shared/conf-parser.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
+index 2c855157a9..7370c786f9 100644
+--- a/src/shared/conf-parser.c
++++ b/src/shared/conf-parser.c
+@@ -444,7 +444,7 @@ int config_parse_many(const char *conf_file,
+ if (r < 0) \
+ log_syntax(unit, LOG_ERR, filename, line, -r, \
+ "Failed to parse %s value, ignoring: %s", \
+- #vartype, rvalue); \
++ #type, rvalue); \
+ \
+ return 0; \
+ }
diff --git a/0026-core-namespace-Protect-usr-instead-of-home-with-Prot.patch b/0026-core-namespace-Protect-usr-instead-of-home-with-Prot.patch
new file mode 100644
index 0000000..6319d12
--- /dev/null
+++ b/0026-core-namespace-Protect-usr-instead-of-home-with-Prot.patch
@@ -0,0 +1,27 @@
+From 33d3e88a8015c16b0d8c908b094c0fbc4dfcf2bb Mon Sep 17 00:00:00 2001
+From: Jason Pleau <jason at jpleau.ca>
+Date: Sun, 31 May 2015 12:51:17 -0400
+Subject: [PATCH] core/namespace: Protect /usr instead of /home with
+ ProtectSystem=yes
+
+A small typo in ee818b8 caused /home to be put in read-only instead of
+/usr when ProtectSystem was enabled (ie: not set to "no").
+
+(cherry picked from commit d38e01dc96c5cae1986561c4f3bc7f760560bf2a)
+---
+ src/core/namespace.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/core/namespace.c b/src/core/namespace.c
+index 7d0b7e7e84..01a817bf23 100644
+--- a/src/core/namespace.c
++++ b/src/core/namespace.c
+@@ -499,7 +499,7 @@ int setup_namespace(
+ if (protect_system != PROTECT_SYSTEM_NO) {
+ const char *usr_dir, *boot_dir, *etc_dir;
+
+- usr_dir = prefix_roota(root_directory, "/home");
++ usr_dir = prefix_roota(root_directory, "/usr");
+ boot_dir = prefix_roota(root_directory, "/boot");
+ boot_dir = strjoina("-", boot_dir);
+ etc_dir = prefix_roota(root_directory, "/etc");
diff --git a/0027-udev-Bring-back-persistant-storage-symlinks-for-bcac.patch b/0027-udev-Bring-back-persistant-storage-symlinks-for-bcac.patch
new file mode 100644
index 0000000..f92e526
--- /dev/null
+++ b/0027-udev-Bring-back-persistant-storage-symlinks-for-bcac.patch
@@ -0,0 +1,24 @@
+From 73f05f079d5e319e8296683399a2548a37dadc5a Mon Sep 17 00:00:00 2001
+From: David Mohr <david at mcbf.net>
+Date: Mon, 1 Jun 2015 08:10:28 +0200
+Subject: [PATCH] udev: Bring back persistant storage symlinks for bcache
+
+https://bugs.debian.org/787367
+(cherry picked from commit 19672f1e5fd23ec3ea5b93b8268ae07f2b8e9645)
+---
+ rules/60-persistent-storage.rules | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rules/60-persistent-storage.rules b/rules/60-persistent-storage.rules
+index 3f803ceb9a..2aa15f3411 100644
+--- a/rules/60-persistent-storage.rules
++++ b/rules/60-persistent-storage.rules
+@@ -6,7 +6,7 @@
+ ACTION=="remove", GOTO="persistent_storage_end"
+
+ SUBSYSTEM!="block", GOTO="persistent_storage_end"
+-KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*", GOTO="persistent_storage_end"
++KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|bcache*", GOTO="persistent_storage_end"
+
+ # ignore partitions that span the entire disk
+ TEST=="whole_disk", GOTO="persistent_storage_end"
diff --git a/0028-sd-device-fix-invalid-property-strv-pointers.patch b/0028-sd-device-fix-invalid-property-strv-pointers.patch
new file mode 100644
index 0000000..5c2b063
--- /dev/null
+++ b/0028-sd-device-fix-invalid-property-strv-pointers.patch
@@ -0,0 +1,71 @@
+From d6e771a1936f54ff1693d84625de57b199bd6c6f Mon Sep 17 00:00:00 2001
+From: Martin Pitt <martin.pitt at ubuntu.com>
+Date: Mon, 1 Jun 2015 11:32:39 +0200
+Subject: [PATCH] sd-device: fix invalid property strv pointers
+
+In device_update_properties_bufs(), the strv is built from pointers into the
+single nul-terminated buf_nulstr string, to avoid allocating the key=value
+strings twice. However, we must not do that while building and
+GREEDY_REALLOC0()'ing buf_nulstr, as each time when this actually reallocates
+memory the pointers we wrote into buf_strv so far become invalid.
+
+So change the logic to first completely build the new buf_nulstr, and then
+iterate over it to pick out the pointers to the individual key=value strings
+for properties_strv.
+
+This fixes invalid environment for udev callouts.
+
+(cherry picked from commit d854ba50a82f28b776c670d27156f0e9881fde8a)
+---
+ src/libsystemd/sd-device/device-private.c | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c
+index 10370af029..deb8efd05d 100644
+--- a/src/libsystemd/sd-device/device-private.c
++++ b/src/libsystemd/sd-device/device-private.c
+@@ -636,10 +636,9 @@ int device_new_from_nulstr(sd_device **ret, uint8_t *nulstr, size_t len) {
+
+ static int device_update_properties_bufs(sd_device *device) {
+ const char *val, *prop;
+- char **buf_strv = NULL;
+ uint8_t *buf_nulstr = NULL;
+- size_t allocated_nulstr = 0, allocated_strv = 0;
+- size_t nulstr_len = 0, strv_size = 0;
++ size_t allocated_nulstr = 0;
++ size_t nulstr_len = 0, num = 0, i;
+
+ assert(device);
+
+@@ -655,20 +654,24 @@ static int device_update_properties_bufs(sd_device *device) {
+ if (!buf_nulstr)
+ return -ENOMEM;
+
+- buf_strv = GREEDY_REALLOC0(buf_strv, allocated_strv, strv_size + 2);
+- if (!buf_strv)
+- return -ENOMEM;
+-
+- buf_strv[strv_size ++] = (char *)&buf_nulstr[nulstr_len];
+ strscpyl((char *)buf_nulstr + nulstr_len, len + 1, prop, "=", val, NULL);
+ nulstr_len += len + 1;
++ ++num;
+ }
+
+ free(device->properties_nulstr);
+- free(device->properties_strv);
+ device->properties_nulstr = buf_nulstr;
+ device->properties_nulstr_len = nulstr_len;
+- device->properties_strv = buf_strv;
++
++ /* build strv from buf_nulstr */
++ free(device->properties_strv);
++ device->properties_strv = new0(char *, num + 1);
++ i = 0;
++ NULSTR_FOREACH(val, (char*) buf_nulstr) {
++ device->properties_strv[i] = (char *) val;
++ assert(i < num);
++ i++;
++ }
+
+ device->properties_buf_outdated = false;
+
diff --git a/0029-zsh-completion-fix-typo-in-_bootctl.patch b/0029-zsh-completion-fix-typo-in-_bootctl.patch
new file mode 100644
index 0000000..02363ea
--- /dev/null
+++ b/0029-zsh-completion-fix-typo-in-_bootctl.patch
@@ -0,0 +1,25 @@
+From 3010a30dcc0ac493fcfe485a8ad1ff483fa0a01d Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel at zonque.org>
+Date: Mon, 1 Jun 2015 12:06:07 +0200
+Subject: [PATCH] zsh-completion: fix typo in _bootctl
+
+The command is 'install', not 'instal'. Fix that typo.
+
+(cherry picked from commit c521a430fd6027d55f96516bc2f7570f5997e137)
+---
+ shell-completion/zsh/_bootctl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/shell-completion/zsh/_bootctl b/shell-completion/zsh/_bootctl
+index ce776c052f..0e1b0a5562 100644
+--- a/shell-completion/zsh/_bootctl
++++ b/shell-completion/zsh/_bootctl
+@@ -5,7 +5,7 @@
+ local -a _bootctl_cmds
+ _bootctl_cmds=(
+ "status:Show status of installed systemd-boot and EFI variables"
+- "instal:Install systemd-boot to the ESP and EFI variables"
++ "install:Install systemd-boot to the ESP and EFI variables"
+ "update:Update systemd-boot in the ESP and EFI variables"
+ "remove:Remove systemd-boot from the ESP and EFI variables"
+ )
diff --git a/0030-load-fragment-use-UNESCAPE_RELAX-flag-to-parse-exec-.patch b/0030-load-fragment-use-UNESCAPE_RELAX-flag-to-parse-exec-.patch
new file mode 100644
index 0000000..2994d1a
--- /dev/null
+++ b/0030-load-fragment-use-UNESCAPE_RELAX-flag-to-parse-exec-.patch
@@ -0,0 +1,44 @@
+From df78ada3b4543af43e4059d0185e3cfd007a9899 Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel at zonque.org>
+Date: Mon, 1 Jun 2015 17:49:04 +0200
+Subject: [PATCH] load-fragment: use UNESCAPE_RELAX flag to parse exec
+ directives
+
+The cunescape() helper function used to handle unknown escaping sequences
+gracefully by copying them over verbatim.
+
+Commit 527b7a42 ("util: rework cunescape(), improve error handling") added
+a flag to make that behavior optional, and changed to default to error out
+with -EINVAL otherwise.
+
+However, config_parse_exec(), which is used to parse the
+Exec{Start,Stop}{Post,Pre,} directives of unit files, was not changed along
+with that commit, which means that directives with improperly escaped
+command line strings are no longer parsed.
+
+Relevant bugreports include:
+
+ https://bugs.freedesktop.org/show_bug.cgi?id=90794
+ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=787256
+
+Fix this by passing UNESCAPE_RELAX to config_parse_exec() in order to
+restore the original behavior.
+
+(cherry picked from commit 22874a348fb1540c1a2b7907748fc57c9756a7ed)
+---
+ src/core/load-fragment.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
+index 9415e92c90..b09481a16b 100644
+--- a/src/core/load-fragment.c
++++ b/src/core/load-fragment.c
+@@ -609,7 +609,7 @@ int config_parse_exec(
+ else
+ skip = strneq(word, "\\;", MAX(l, 1U));
+
+- r = cunescape_length(word + skip, l - skip, 0, &c);
++ r = cunescape_length(word + skip, l - skip, UNESCAPE_RELAX, &c);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, r, "Failed to unescape command line, ignoring: %s", rvalue);
+ r = 0;
diff --git a/0031-test-unit-file-add-test-for-improperly-escaped-exec-.patch b/0031-test-unit-file-add-test-for-improperly-escaped-exec-.patch
new file mode 100644
index 0000000..c1c9e46
--- /dev/null
+++ b/0031-test-unit-file-add-test-for-improperly-escaped-exec-.patch
@@ -0,0 +1,54 @@
+From f5fe08ec458eea4308f807ade0cbf9a5af663f30 Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel at zonque.org>
+Date: Mon, 1 Jun 2015 18:05:02 +0200
+Subject: [PATCH] test-unit-file: add test for improperly escaped exec string
+
+Add a regression test for the recent breakage of handling improperly
+escaped exec strings in unit files.
+
+Code contributed by Martin Pitt:
+
+ https://bugs.freedesktop.org/show_bug.cgi?id=90794
+
+(cherry picked from commit 80979f1ce4dadf797a42e85a97dc10960c1f6509)
+---
+ src/test/test-unit-file.c | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
+index a9711ac9f5..31b12d50d7 100644
+--- a/src/test/test-unit-file.c
++++ b/src/test/test-unit-file.c
+@@ -225,6 +225,15 @@ static void test_config_parse_exec(void) {
+ check_execcommand(c1,
+ "/sbin/find", NULL, ";", "x", false);
+
++ log_info("/* encoded semicolon */");
++ r = config_parse_exec(NULL, "fake", 5, "section", 1,
++ "LValue", 0,
++ "/bin/find \\073",
++ &c, NULL);
++ assert_se(r >= 0);
++ c1 = c1->command_next;
++ check_execcommand(c1, "/bin/find", NULL, "\\073", NULL, false);
++
+ log_info("/* spaces in the filename */");
+ r = config_parse_exec(NULL, "fake", 5, "section", 1,
+ "LValue", 0,
+@@ -296,6 +305,16 @@ static void test_config_parse_exec(void) {
+ c1 = c1->command_next;
+ check_execcommand(c1, "/path ", NULL, NULL, NULL, false);
+
++ log_info("/* quoted backslashes */");
++ r = config_parse_exec(NULL, "fake", 5, "section", 1,
++ "LValue", 0,
++ "/bin/grep '\\w+\\K'",
++ &c, NULL);
++ assert_se(r >= 0);
++ c1 = c1->command_next;
++ check_execcommand(c1, "/bin/grep", NULL, "\\w+\\K", NULL, false);
++
++
+ log_info("/* trailing backslash: \\ */");
+ /* backslash is invalid */
+ r = config_parse_exec(NULL, "fake", 4, "section", 1,
diff --git a/0032-Separate-the-sign-from-the-number.patch b/0032-Separate-the-sign-from-the-number.patch
new file mode 100644
index 0000000..e5f2047
--- /dev/null
+++ b/0032-Separate-the-sign-from-the-number.patch
@@ -0,0 +1,30 @@
+From e4cf1e16e72e94f794fb058571acaae9fdbbacd9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Pablo=20Lezaeta=20Reyes=20=5Bp=CB=88a=CE=B2=CC=9Elo=20l?=
+ =?UTF-8?q?=CB=8Ce=CC=9E=CE=B8a=CB=88eta=20r=CB=88ej=C9=9B=5D?=
+ <prflr88 at gmail.com>
+Date: Tue, 31 Mar 2015 02:47:39 -0300
+Subject: [PATCH] Separate the % sign from the number
+
+In spanish the % sign is supposed to be separated from the number [1 and 2 both in spanish] so I separated the %% that draw the percentage sign from the number.
+
+[1] http://www.fundeu.es/recomendacion/el-se-escribe-separado-de-la-cifra-a-la-que-acompana-802/
+[2] http://aplica.rae.es/orweb/cgi-bin/v.cgi?i=QGkHLBzKcEgZrQyD
+
+PD: I know that probably this is not the propper place but I don't know where submit the fix or if I do it right
+(cherry picked from commit 6f54f5373aa681e66278e8e6edaea06e3d0f8958)
+---
+ po/es.po | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/po/es.po b/po/es.po
+index 675f9721bf..811e36e81f 100644
+--- a/po/es.po
++++ b/po/es.po
+@@ -528,5 +528,5 @@ msgstr ""
+ #, c-format
+ msgid "Checking in progress on %d disk (%3.1f%% complete)"
+ msgid_plural "Checking in progress on %d disks (%3.1f%% complete)"
+-msgstr[0] "Comprobando progreso en %d disco (%3.1f%% completado)"
+-msgstr[1] "Comprobando progreso en %d discos (%3.1f%% completado)"
++msgstr[0] "Comprobando progreso en %d disco (%3.1f %% completado)"
++msgstr[1] "Comprobando progreso en %d discos (%3.1f %% completado)"
diff --git a/0033-zsh-completion-fix-completion-of-user-services.patch b/0033-zsh-completion-fix-completion-of-user-services.patch
new file mode 100644
index 0000000..f62f84b
--- /dev/null
+++ b/0033-zsh-completion-fix-completion-of-user-services.patch
@@ -0,0 +1,42 @@
+From a27d1804a1a1d1f522fe7742f42a44ced58dce2e Mon Sep 17 00:00:00 2001
+From: Eric Cook <llua at gmx.com>
+Date: Mon, 18 May 2015 18:45:31 -0400
+Subject: [PATCH] zsh-completion: fix completion of --user services
+
+By the time __systemctl is called, --user/--system are shifted out of
+`words' by _arguments. This patch queries the array sooner.
+
+In the case that both --user and --system are on the line when compsys runs,
+_sys_service_mgr is set to the latter. Which is seemingly how systemctl behaves.
+
+If neither are on the line, --system is set; for system services to be completed.
+
+(cherry picked from commit 68c4f6d406a2bdac6957a67a077f182b0287cc3b)
+---
+ shell-completion/zsh/_systemctl.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/shell-completion/zsh/_systemctl.in b/shell-completion/zsh/_systemctl.in
+index 1dc6406beb..db9bdb60c5 100644
+--- a/shell-completion/zsh/_systemctl.in
++++ b/shell-completion/zsh/_systemctl.in
+@@ -93,9 +93,7 @@
+
+ __systemctl()
+ {
+- local -a _modes
+- _modes=("--user" "--system")
+- systemctl ${words:*_modes} --full --no-legend --no-pager "$@"
++ systemctl $_sys_service_mgr --full --no-legend --no-pager "$@"
+ }
+
+
+@@ -355,6 +353,8 @@ _job_modes() {
+ _values -s , "${_modes[@]}"
+ }
+
++local -a _modes; _modes=("--user" "--system")
++local _sys_service_mgr=${${words:*_modes}[(R)(${(j.|.)_modes})]:---system}
+ _arguments -s \
+ {-h,--help}'[Show help]' \
+ '--version[Show package version]' \
diff --git a/0034-zsh-completion-a-more-style-tag-aware-_systemctl.patch b/0034-zsh-completion-a-more-style-tag-aware-_systemctl.patch
new file mode 100644
index 0000000..39e20c1
--- /dev/null
+++ b/0034-zsh-completion-a-more-style-tag-aware-_systemctl.patch
@@ -0,0 +1,194 @@
+From 50bb352ccad52c5f56a457305f5422b1359cbf42 Mon Sep 17 00:00:00 2001
+From: Eric Cook <llua at gmx.com>
+Date: Fri, 29 May 2015 10:40:11 -0400
+Subject: [PATCH] zsh-completion: a more style/tag aware _systemctl
+
+using _wanted instead of calling compadd directly. this allows the user to customize
+possible matches.
+
+An example being, grouping units by type:
+autoload -Uz compinit; compinit
+zstyle ':completion:*' menu select
+zstyle ':completion:*' group-name ''
+zstyle ':completion:*' format 'Completing %d'
+zstyle -e ':completion:*:*:systemctl-(((re|)en|dis)able|(*re|)start|reload*):*' \
+tag-order 'local type; for type in service template target socket;
+ reply+=( systemd-units:-${type}:${type} ); reply=( "$reply systemd-units:-misc:misc" )'
+zstyle ':completion:*:systemd-units-template' ignored-patterns '^*@'
+zstyle ':completion:*:systemd-units-target' ignored-patterns '^*.target'
+zstyle ':completion:*:systemd-units-socket' ignored-patterns '^*.socket'
+zstyle ':completion:*:systemd-units-service' ignored-patterns '^*.service'
+zstyle ':completion:*:systemd-units-misc' ignored-patterns '*(@|.(service|socket|target))'
+
+also, <poke> http://lists.freedesktop.org/archives/systemd-devel/2015-May/032012.html
+
+(cherry picked from commit d34b7c117bd016cb9ef2c36d474c9a917924abda)
+---
+ shell-completion/zsh/_systemctl.in | 60 +++++++++++++++++++++++---------------
+ 1 file changed, 37 insertions(+), 23 deletions(-)
+
+diff --git a/shell-completion/zsh/_systemctl.in b/shell-completion/zsh/_systemctl.in
+index db9bdb60c5..17736de01c 100644
+--- a/shell-completion/zsh/_systemctl.in
++++ b/shell-completion/zsh/_systemctl.in
+@@ -65,7 +65,7 @@
+ if (( CURRENT == 1 )); then
+ _describe -t commands 'systemctl command' _systemctl_cmds || compadd "$@"
+ else
+- local curcontext="$curcontext"
++ local curcontext="$curcontext" expl
+
+ cmd="${${_systemctl_cmds[(r)$words[1]:*]%%:*}}"
+ # Deal with any aliases
+@@ -172,7 +172,8 @@ for fun in is-active is-failed is-enabled status show cat mask preset help list-
+ (( $+functions[_systemctl_$fun] )) || _systemctl_$fun()
+ {
+ _systemctl_really_all_units
+- compadd "$@" -a - _sys_really_all_units
++ _wanted systemd-units expl unit \
++ compadd "$@" -a - _sys_really_all_units
+ }
+ done
+
+@@ -180,34 +181,39 @@ done
+ (( $+functions[_systemctl_disable] )) || _systemctl_disable()
+ {
+ local _sys_unit_state; _systemctl_unit_state
+- compadd "$@" - ${(k)_sys_unit_state[(R)enabled]}
++ _wanted systemd-units expl 'enabled unit' \
++ compadd "$@" - ${(k)_sys_unit_state[(R)enabled]}
+ }
+
+ (( $+functions[_systemctl_reenable] )) || _systemctl_reenable()
+ {
+ local _sys_unit_state; _systemctl_unit_state
+- compadd "$@" - ${(k)_sys_unit_state[(R)(enabled|disabled)]} $(_systemctl_get_template_names)
++ _wanted systemd-units expl 'enabled/disabled unit' \
++ compadd "$@" - ${(k)_sys_unit_state[(R)(enabled|disabled)]} $(_systemctl_get_template_names)
+ }
+
+ # Completion functions for DISABLED_UNITS
+ (( $+functions[_systemctl_enable] )) || _systemctl_enable()
+ {
+ local _sys_unit_state; _systemctl_unit_state
+- compadd "$@" - ${(k)_sys_unit_state[(R)disabled]} $(_systemctl_get_template_names)
++ _wanted systemd-units expl 'disabled unit' \
++ compadd "$@" - ${(k)_sys_unit_state[(R)disabled]} $(_systemctl_get_template_names)
+ }
+
+ # Completion functions for FAILED_UNITS
+ (( $+functions[_systemctl_reset-failed] )) || _systemctl_reset-failed()
+ {
+ local _sys_failed_units; _systemctl_failed_units
+- compadd "$@" -a - _sys_failed_units || _message "no failed unit found"
++ _wanted systemd-units expl 'failed unit' \
++ compadd "$@" -a - _sys_failed_units || _message "no failed unit found"
+ }
+
+ # Completion functions for STARTABLE_UNITS
+ (( $+functions[_systemctl_start] )) || _systemctl_start()
+ {
+ local _sys_startable_units; _systemctl_startable_units
+- compadd "$@" - ${_sys_startable_units[*]} $(_systemctl_get_template_names)
++ _wanted systemd-units expl 'startable unit' \
++ compadd "$@" - ${_sys_startable_units[*]} $(_systemctl_get_template_names)
+ }
+
+ # Completion functions for STOPPABLE_UNITS
+@@ -215,8 +221,9 @@ for fun in stop kill try-restart condrestart ; do
+ (( $+functions[_systemctl_$fun] )) || _systemctl_$fun()
+ {
+ local _sys_active_units; _systemctl_active_units
+- compadd "$@" - $( _filter_units_by_property CanStop yes \
+- ${_sys_active_units[*]} )
++ _wanted systemd-units expl 'stoppable unit' \
++ compadd "$@" - $( _filter_units_by_property CanStop yes \
++ ${_sys_active_units[*]} )
+ }
+ done
+
+@@ -224,8 +231,9 @@ done
+ (( $+functions[_systemctl_isolate] )) || _systemctl_isolate()
+ {
+ _systemctl_all_units
+- compadd "$@" - $( _filter_units_by_property AllowIsolate yes \
+- ${_sys_all_units[*]} )
++ _wanted systemd-units expl 'isolatable unit' \
++ compadd "$@" - $( _filter_units_by_property AllowIsolate yes \
++ ${_sys_all_units[*]} )
+ }
+
+ # Completion functions for RELOADABLE_UNITS
+@@ -233,8 +241,9 @@ for fun in reload reload-or-try-restart force-reload ; do
+ (( $+functions[_systemctl_$fun] )) || _systemctl_$fun()
+ {
+ local _sys_active_units; _systemctl_active_units
+- compadd "$@" - $( _filter_units_by_property CanReload yes \
+- ${_sys_active_units[*]} )
++ _wanted systemd-units expl 'reloadable unit' \
++ compadd "$@" - $( _filter_units_by_property CanReload yes \
++ ${_sys_active_units[*]} )
+ }
+ done
+
+@@ -243,7 +252,8 @@ for fun in restart reload-or-restart ; do
+ (( $+functions[_systemctl_$fun] )) || _systemctl_$fun()
+ {
+ local _sys_restartable_units; _systemctl_restartable_units
+- compadd "$@" - ${_sys_restartable_units[*]} $(_systemctl_get_template_names)
++ _wanted systemd-units expl 'restartable unit' \
++ compadd "$@" - ${_sys_restartable_units[*]} $(_systemctl_get_template_names)
+ }
+ done
+
+@@ -251,28 +261,32 @@ done
+ (( $+functions[_systemctl_unmask] )) || _systemctl_unmask()
+ {
+ local _sys_unit_state; _systemctl_unit_state
+- compadd "$@" - ${(k)_sys_unit_state[(R)masked]} || _message "no masked units found"
++ _wanted systemd-units expl 'masked unit' \
++ compadd "$@" - ${(k)_sys_unit_state[(R)masked]} || _message "no masked units found"
+ }
+
+ # Completion functions for JOBS
+ (( $+functions[_systemctl_cancel] )) || _systemctl_cancel()
+ {
+- compadd "$@" - ${${(f)"$(__systemctl list-jobs)"}%% *} ||
+- _message "no jobs found"
++ _wanted systemd-jobs expl job \
++ compadd "$@" - ${${(f)"$(__systemctl list-jobs)"}%% *} ||
++ _message "no jobs found"
+ }
+
+ # Completion functions for SNAPSHOTS
+ (( $+functions[_systemctl_delete] )) || _systemctl_delete()
+ {
+- compadd "$@" - ${${(f)"$(__systemctl list-units --type snapshot --all)"}%% *} ||
+- _message "no snapshots found"
++ _wanted systemd-snapshots expl snapshot \
++ compadd "$@" - ${${(f)"$(__systemctl list-units --type snapshot --all)"}%% *} ||
++ _message "no snapshots found"
+ }
+
+ # Completion functions for TARGETS
+ (( $+functions[_systemctl_set-default] )) || _systemctl_set-default()
+ {
+- compadd "$@" - ${${(f)"$(__systemctl list-unit-files --type target --all)"}%% *} ||
+- _message "no targets found"
++ _wanted systemd-targets expl target \
++ compadd "$@" - ${${(f)"$(__systemctl list-unit-files --type target --all)"}%% *} ||
++ _message "no targets found"
+ }
+
+ # Completion functions for ENVS
+@@ -284,8 +298,8 @@ for fun in set-environment unset-environment ; do
+ if [[ "${fun}" = "set-environment" ]]; then
+ suf='-S='
+ fi
+-
+- compadd "$@" ${suf} - ${${(f)"$(systemctl show-environment)"}%%=*}
++ _wanted systemd-environment expl 'environment variable' \
++ compadd "$@" ${suf} - ${${(f)"$(systemctl show-environment)"}%%=*}
+ }
+ done
+
diff --git a/0035-missing-add-more-btrfs-defines.patch b/0035-missing-add-more-btrfs-defines.patch
new file mode 100644
index 0000000..ed9f4c9
--- /dev/null
+++ b/0035-missing-add-more-btrfs-defines.patch
@@ -0,0 +1,70 @@
+From 4ef997dc5832f652d30eefcf67547ca029d190db Mon Sep 17 00:00:00 2001
+From: Michael Olbrich <m.olbrich at pengutronix.de>
+Date: Tue, 2 Jun 2015 11:08:24 +0200
+Subject: [PATCH] missing: add more btrfs defines
+
+(cherry picked from commit d97fb4083704ce88d96fcc65ab744801909dd0b0)
+---
+ src/shared/missing.h | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+diff --git a/src/shared/missing.h b/src/shared/missing.h
+index 9194009491..be7f6186fc 100644
+--- a/src/shared/missing.h
++++ b/src/shared/missing.h
+@@ -269,6 +269,11 @@ struct btrfs_qgroup_inherit {
+ __u64 qgroups[0];
+ };
+
++struct btrfs_ioctl_qgroup_limit_args {
++ __u64 qgroupid;
++ struct btrfs_qgroup_limit lim;
++};
++
+ struct btrfs_ioctl_vol_args_v2 {
+ __s64 fd;
+ __u64 transid;
+@@ -360,6 +365,14 @@ struct btrfs_ioctl_clone_range_args {
+ __u64 src_offset, src_length;
+ __u64 dest_offset;
+ };
++
++#define BTRFS_QUOTA_CTL_ENABLE 1
++#define BTRFS_QUOTA_CTL_DISABLE 2
++#define BTRFS_QUOTA_CTL_RESCAN__NOTUSED 3
++struct btrfs_ioctl_quota_ctl_args {
++ __u64 cmd;
++ __u64 status;
++};
+ #endif
+
+ #ifndef BTRFS_IOC_DEFRAG
+@@ -367,6 +380,11 @@ struct btrfs_ioctl_clone_range_args {
+ struct btrfs_ioctl_vol_args)
+ #endif
+
++#ifndef BTRFS_IOC_RESIZE
++#define BTRFS_IOC_RESIZE _IOW(BTRFS_IOCTL_MAGIC, 3, \
++ struct btrfs_ioctl_vol_args)
++#endif
++
+ #ifndef BTRFS_IOC_CLONE
+ #define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
+ #endif
+@@ -424,6 +442,16 @@ struct btrfs_ioctl_clone_range_args {
+ struct btrfs_ioctl_vol_args)
+ #endif
+
++#ifndef BTRFS_IOC_QUOTA_CTL
++#define BTRFS_IOC_QUOTA_CTL _IOWR(BTRFS_IOCTL_MAGIC, 40, \
++ struct btrfs_ioctl_quota_ctl_args)
++#endif
++
++#ifndef BTRFS_IOC_QGROUP_LIMIT
++#define BTRFS_IOC_QGROUP_LIMIT _IOR(BTRFS_IOCTL_MAGIC, 43, \
++ struct btrfs_ioctl_qgroup_limit_args)
++#endif
++
+ #ifndef BTRFS_FIRST_FREE_OBJECTID
+ #define BTRFS_FIRST_FREE_OBJECTID 256
+ #endif
diff --git a/0036-hwdb-Update-database-of-Bluetooth-company-identifier.patch b/0036-hwdb-Update-database-of-Bluetooth-company-identifier.patch
new file mode 100644
index 0000000..1dc9eb7
--- /dev/null
+++ b/0036-hwdb-Update-database-of-Bluetooth-company-identifier.patch
@@ -0,0 +1,186 @@
+From 502fcfa0c7a24caac76c41ebbeb3cf807aa3d5db Mon Sep 17 00:00:00 2001
+From: Marcel Holtmann <marcel at holtmann.org>
+Date: Mon, 1 Jun 2015 21:11:40 +0200
+Subject: [PATCH] hwdb: Update database of Bluetooth company identifiers
+
+(cherry picked from commit 2fd51106ee0d685ca1512a01e6680142382586a7)
+---
+ hwdb/20-bluetooth-vendor-product.hwdb | 161 +++++++++++++++++++++++++++++++++-
+ 1 file changed, 160 insertions(+), 1 deletion(-)
+
+diff --git a/hwdb/20-bluetooth-vendor-product.hwdb b/hwdb/20-bluetooth-vendor-product.hwdb
+index ff8862b9ea..93241ca490 100644
+--- a/hwdb/20-bluetooth-vendor-product.hwdb
++++ b/hwdb/20-bluetooth-vendor-product.hwdb
+@@ -1237,7 +1237,7 @@ bluetooth:v0199*
+ ID_VENDOR_FROM_DATABASE=SALTO SYSTEMS S.L.
+
+ bluetooth:v019A*
+- ID_VENDOR_FROM_DATABASE=T-Engine Forum
++ ID_VENDOR_FROM_DATABASE=TRON Forum (formerly T-Engine Forum)
+
+ bluetooth:v019B*
+ ID_VENDOR_FROM_DATABASE=CUBETECH s.r.o.
+@@ -1508,3 +1508,162 @@ bluetooth:v01F3*
+
+ bluetooth:v01F4*
+ ID_VENDOR_FROM_DATABASE=UTC Fire and Security
++
++bluetooth:v01F5*
++ ID_VENDOR_FROM_DATABASE=Cool Webthings Limited
++
++bluetooth:v01F6*
++ ID_VENDOR_FROM_DATABASE=DJO Global
++
++bluetooth:v01F7*
++ ID_VENDOR_FROM_DATABASE=Gelliner Limited
++
++bluetooth:v01F8*
++ ID_VENDOR_FROM_DATABASE=Anyka (Guangzhou) Microelectronics Technology Co, LTD
++
++bluetooth:v01F9*
++ ID_VENDOR_FROM_DATABASE=Medtronic, Inc.
++
++bluetooth:v01FA*
++ ID_VENDOR_FROM_DATABASE=Gozio, Inc.
++
++bluetooth:v01FB*
++ ID_VENDOR_FROM_DATABASE=Form Lifting, LLC
++
++bluetooth:v01FC*
++ ID_VENDOR_FROM_DATABASE=Wahoo Fitness, LLC
++
++bluetooth:v01FD*
++ ID_VENDOR_FROM_DATABASE=Kontakt Micro-Location Sp. z o.o.
++
++bluetooth:v01FE*
++ ID_VENDOR_FROM_DATABASE=Radio System Corporation
++
++bluetooth:v01FF*
++ ID_VENDOR_FROM_DATABASE=Freescale Semiconductor, Inc.
++
++bluetooth:v0200*
++ ID_VENDOR_FROM_DATABASE=Verifone Systems PTe Ltd. Taiwan Branch
++
++bluetooth:v0201*
++ ID_VENDOR_FROM_DATABASE=AR Timing
++
++bluetooth:v0202*
++ ID_VENDOR_FROM_DATABASE=Rigado LLC
++
++bluetooth:v0203*
++ ID_VENDOR_FROM_DATABASE=Kemppi Oy
++
++bluetooth:v0204*
++ ID_VENDOR_FROM_DATABASE=Tapcentive Inc.
++
++bluetooth:v0205*
++ ID_VENDOR_FROM_DATABASE=Smartbotics Inc.
++
++bluetooth:v0206*
++ ID_VENDOR_FROM_DATABASE=Otter Products, LLC
++
++bluetooth:v0207*
++ ID_VENDOR_FROM_DATABASE=STEMP Inc.
++
++bluetooth:v0208*
++ ID_VENDOR_FROM_DATABASE=LumiGeek LLC
++
++bluetooth:v0209*
++ ID_VENDOR_FROM_DATABASE=InvisionHeart Inc.
++
++bluetooth:v020A*
++ ID_VENDOR_FROM_DATABASE=Macnica Inc.
++
++bluetooth:v020B*
++ ID_VENDOR_FROM_DATABASE=Jaguar Land Rover Limited
++
++bluetooth:v020C*
++ ID_VENDOR_FROM_DATABASE=CoroWare Technologies, Inc
++
++bluetooth:v020D*
++ ID_VENDOR_FROM_DATABASE=Simplo Technology Co., LTD
++
++bluetooth:v020E*
++ ID_VENDOR_FROM_DATABASE=Omron Healthcare Co., LTD
++
++bluetooth:v020F*
++ ID_VENDOR_FROM_DATABASE=Comodule GMBH
++
++bluetooth:v0210*
++ ID_VENDOR_FROM_DATABASE=ikeGPS
++
++bluetooth:v0211*
++ ID_VENDOR_FROM_DATABASE=Telink Semiconductor Co. Ltd
++
++bluetooth:v0212*
++ ID_VENDOR_FROM_DATABASE=Interplan Co., Ltd
++
++bluetooth:v0213*
++ ID_VENDOR_FROM_DATABASE=Wyler AG
++
++bluetooth:v0214*
++ ID_VENDOR_FROM_DATABASE=IK Multimedia Production srl
++
++bluetooth:v0215*
++ ID_VENDOR_FROM_DATABASE=Lukoton Experience Oy
++
++bluetooth:v0216*
++ ID_VENDOR_FROM_DATABASE=MTI Ltd
++
++bluetooth:v0217*
++ ID_VENDOR_FROM_DATABASE=Tech4home, Lda
++
++bluetooth:v0218*
++ ID_VENDOR_FROM_DATABASE=Hiotech AB
++
++bluetooth:v0219*
++ ID_VENDOR_FROM_DATABASE=DOTT Limited
++
++bluetooth:v021A*
++ ID_VENDOR_FROM_DATABASE=Blue Speck Labs, LLC
++
++bluetooth:v021B*
++ ID_VENDOR_FROM_DATABASE=Cisco Systems Inc
++
++bluetooth:v021C*
++ ID_VENDOR_FROM_DATABASE=Mobicomm Inc
++
++bluetooth:v021D*
++ ID_VENDOR_FROM_DATABASE=Edamic
++
++bluetooth:v021E*
++ ID_VENDOR_FROM_DATABASE=Goodnet Ltd
++
++bluetooth:v021F*
++ ID_VENDOR_FROM_DATABASE=Luster Leaf Products Inc
++
++bluetooth:v0220*
++ ID_VENDOR_FROM_DATABASE=Manus Machina BV
++
++bluetooth:v0221*
++ ID_VENDOR_FROM_DATABASE=Mobiquity Networks Inc
++
++bluetooth:v0222*
++ ID_VENDOR_FROM_DATABASE=Praxis Dynamics
++
++bluetooth:v0223*
++ ID_VENDOR_FROM_DATABASE=Philip Morris Products S.A.
++
++bluetooth:v0224*
++ ID_VENDOR_FROM_DATABASE=Comarch SA
++
++bluetooth:v0225*
++ ID_VENDOR_FROM_DATABASE=Nestl Nespresso S.A.
++
++bluetooth:v0226*
++ ID_VENDOR_FROM_DATABASE=Merlinia A/S
++
++bluetooth:v0227*
++ ID_VENDOR_FROM_DATABASE=LifeBEAM Technologies
++
++bluetooth:v0228*
++ ID_VENDOR_FROM_DATABASE=Twocanoes Labs, LLC
++
++bluetooth:v0229*
++ ID_VENDOR_FROM_DATABASE=Muoverti Limited
diff --git a/0037-hwdb-update.patch b/0037-hwdb-update.patch
new file mode 100644
index 0000000..a02a53a
--- /dev/null
+++ b/0037-hwdb-update.patch
@@ -0,0 +1,1052 @@
+From ec5eaae67e005bcfca37dc62e79305f6e3ac8f0a Mon Sep 17 00:00:00 2001
+From: Kay Sievers <kay at vrfy.org>
+Date: Tue, 2 Jun 2015 20:19:31 +0200
+Subject: [PATCH] hwdb: update
+
+(cherry picked from commit b30e7a269d1ee289d29282e93f41559ace9d4775)
+---
+ hwdb/20-OUI.hwdb | 153 ++++++++++++++++++++++++++++++
+ hwdb/20-pci-vendor-model.hwdb | 216 ++++++++++++++++++++++++++----------------
+ 2 files changed, 285 insertions(+), 84 deletions(-)
+
+diff --git a/hwdb/20-OUI.hwdb b/hwdb/20-OUI.hwdb
+index b7823d884f..fa4633dc16 100644
+--- a/hwdb/20-OUI.hwdb
++++ b/hwdb/20-OUI.hwdb
+@@ -44305,6 +44305,9 @@ OUI:00336C*
+ OUI:0034F1*
+ ID_OUI_FROM_DATABASE=Radicom Research, Inc.
+
++OUI:0034FE*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:003532*
+ ID_OUI_FROM_DATABASE=Electro-Metrics Corporation
+
+@@ -51670,6 +51673,9 @@ OUI:00F4B9*
+ OUI:00F76F*
+ ID_OUI_FROM_DATABASE=Apple
+
++OUI:00F81C*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:00F860*
+ ID_OUI_FROM_DATABASE=PT. Panggung Electric Citrabuana
+
+@@ -51727,6 +51733,9 @@ OUI:02CF1C*
+ OUI:02E6D3*
+ ID_OUI_FROM_DATABASE=NIXDORF COMPUTER CORPORATION
+
++OUI:04021F*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:040A83*
+ ID_OUI_FROM_DATABASE=Alcatel-Lucent
+
+@@ -51763,6 +51772,9 @@ OUI:041D10*
+ OUI:041E64*
+ ID_OUI_FROM_DATABASE=Apple
+
++OUI:041E7A*
++ ID_OUI_FROM_DATABASE=DSPWorks
++
+ OUI:04209A*
+ ID_OUI_FROM_DATABASE=Panasonic AVC Networks Company
+
+@@ -53170,6 +53182,9 @@ OUI:0CD502*
+ OUI:0CD696*
+ ID_OUI_FROM_DATABASE=Amimon Ltd
+
++OUI:0CD6BD*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:0CD7C2*
+ ID_OUI_FROM_DATABASE=Axium Technologies, Inc.
+
+@@ -54481,6 +54496,9 @@ OUI:1C4840*
+ OUI:1C48F9*
+ ID_OUI_FROM_DATABASE=GN Netcom A/S
+
++OUI:1C497B*
++ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
++
+ OUI:1C4AF7*
+ ID_OUI_FROM_DATABASE=AMON INC
+
+@@ -55156,6 +55174,9 @@ OUI:241C04*
+ OUI:241F2C*
+ ID_OUI_FROM_DATABASE=Calsys, Inc.
+
++OUI:241FA0*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:2421AB*
+ ID_OUI_FROM_DATABASE=Sony Ericsson Mobile Communications
+
+@@ -56110,6 +56131,9 @@ OUI:2CCD43*
+ OUI:2CCD69*
+ ID_OUI_FROM_DATABASE=Aqavi.com
+
++OUI:2CCF58*
++ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
++
+ OUI:2CD05A*
+ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
+
+@@ -56473,6 +56497,9 @@ OUI:30F42F*
+ OUI:30F70D*
+ ID_OUI_FROM_DATABASE=Cisco Systems
+
++OUI:30F772*
++ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
++
+ OUI:30F7C5*
+ ID_OUI_FROM_DATABASE=Apple
+
+@@ -56932,6 +56959,9 @@ OUI:380A0A*
+ OUI:380A94*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
++OUI:380AAB*
++ ID_OUI_FROM_DATABASE=Formlabs
++
+ OUI:380B40*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+@@ -57964,6 +57994,9 @@ OUI:40D559*
+ OUI:40E230*
+ ID_OUI_FROM_DATABASE=AzureWave Technologies, Inc.
+
++OUI:40E3D6*
++ ID_OUI_FROM_DATABASE=Aruba Networks
++
+ OUI:40E730*
+ ID_OUI_FROM_DATABASE=DEY Storage Systems, Inc.
+
+@@ -58024,6 +58057,9 @@ OUI:44184F*
+ OUI:4419B6*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
++OUI:441CA8*
++ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
++
+ OUI:441E91*
+ ID_OUI_FROM_DATABASE=ARVIDA Intelligent Electronics Technology Co.,Ltd.
+
+@@ -59275,6 +59311,9 @@ OUI:50A6E3*
+ OUI:50A715*
+ ID_OUI_FROM_DATABASE=Aboundi, Inc.
+
++OUI:50A72B*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:50A733*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+@@ -59335,6 +59374,9 @@ OUI:50D274*
+ OUI:50D6D7*
+ ID_OUI_FROM_DATABASE=Takahata Precision
+
++OUI:50DF95*
++ ID_OUI_FROM_DATABASE=Lytx
++
+ OUI:50E0C7*
+ ID_OUI_FROM_DATABASE=TurControlSystme AG
+
+@@ -59413,6 +59455,9 @@ OUI:541B5D*
+ OUI:541DFB*
+ ID_OUI_FROM_DATABASE=Freestyle Energy Ltd
+
++OUI:541E56*
++ ID_OUI_FROM_DATABASE=juniper networks
++
+ OUI:541FD5*
+ ID_OUI_FROM_DATABASE=Advantage Electronics
+
+@@ -59599,6 +59644,9 @@ OUI:54A274*
+ OUI:54A31B*
+ ID_OUI_FROM_DATABASE=Shenzhen Linkworld Technology Co,.LTD
+
++OUI:54A3FA*
++ ID_OUI_FROM_DATABASE=BQT Solutions (Australia)Pty Ltd
++
+ OUI:54A51B*
+ ID_OUI_FROM_DATABASE=Shenzhen Huawei Communication Technologies Co., Ltd
+
+@@ -59710,6 +59758,9 @@ OUI:54FB58*
+ OUI:54FDBF*
+ ID_OUI_FROM_DATABASE=Scheidt & Bachmann GmbH
+
++OUI:54FF82*
++ ID_OUI_FROM_DATABASE=Davit Solution co.
++
+ OUI:54FFCF*
+ ID_OUI_FROM_DATABASE=Mopria Alliance
+
+@@ -59809,6 +59860,9 @@ OUI:584822*
+ OUI:5848C0*
+ ID_OUI_FROM_DATABASE=COFLEC
+
++OUI:584925*
++ ID_OUI_FROM_DATABASE=E3 Enterprise
++
+ OUI:58493B*
+ ID_OUI_FROM_DATABASE=Palo Alto Networks
+
+@@ -59935,6 +59989,9 @@ OUI:5894CF*
+ OUI:58971E*
+ ID_OUI_FROM_DATABASE=Cisco
+
++OUI:5897BD*
++ ID_OUI_FROM_DATABASE=Cisco Systems
++
+ OUI:589835*
+ ID_OUI_FROM_DATABASE=Technicolor
+
+@@ -59962,6 +60019,9 @@ OUI:58B035*
+ OUI:58B0D4*
+ ID_OUI_FROM_DATABASE=ZuniData Systems Inc.
+
++OUI:58B633*
++ ID_OUI_FROM_DATABASE=Ruckus Wireless
++
+ OUI:58B961*
+ ID_OUI_FROM_DATABASE=SOLEM Electronique
+
+@@ -61099,6 +61159,9 @@ OUI:64A341*
+ OUI:64A3CB*
+ ID_OUI_FROM_DATABASE=Apple
+
++OUI:64A651*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:64A769*
+ ID_OUI_FROM_DATABASE=HTC Corporation
+
+@@ -61141,6 +61204,9 @@ OUI:64BABD*
+ OUI:64BC11*
+ ID_OUI_FROM_DATABASE=CombiQ AB
+
++OUI:64C354*
++ ID_OUI_FROM_DATABASE=Avaya, Inc
++
+ OUI:64C5AA*
+ ID_OUI_FROM_DATABASE=South African Broadcasting Corporation
+
+@@ -61600,6 +61666,9 @@ OUI:68F728*
+ OUI:68F895*
+ ID_OUI_FROM_DATABASE=Redflow Limited
+
++OUI:68F956*
++ ID_OUI_FROM_DATABASE=Objetivos y Servicio de Valor Añadido
++
+ OUI:68FB95*
+ ID_OUI_FROM_DATABASE=Generalplus Technology Inc.
+
+@@ -63883,6 +63952,9 @@ OUI:809FAB*
+ OUI:80A1D7*
+ ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd
+
++OUI:80A589*
++ ID_OUI_FROM_DATABASE=AzureWave Technologies, Inc.
++
+ OUI:80A85D*
+ ID_OUI_FROM_DATABASE=Osterhout Design Group
+
+@@ -63973,6 +64045,9 @@ OUI:80E4DA*
+ OUI:80E650*
+ ID_OUI_FROM_DATABASE=Apple
+
++OUI:80E86F*
++ ID_OUI_FROM_DATABASE=Cisco Systems
++
+ OUI:80EA23*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corp.
+
+@@ -64282,6 +64357,9 @@ OUI:84A6C8*
+ OUI:84A783*
+ ID_OUI_FROM_DATABASE=Alcatel Lucent
+
++OUI:84A788*
++ ID_OUI_FROM_DATABASE=Perples
++
+ OUI:84A8E4*
+ ID_OUI_FROM_DATABASE=Shenzhen Huawei Communication Technologies Co., Ltd
+
+@@ -65149,6 +65227,9 @@ OUI:902155*
+ OUI:902181*
+ ID_OUI_FROM_DATABASE=Shanghai Huaqin Telecom Technology Co.,Ltd
+
++OUI:9023EC*
++ ID_OUI_FROM_DATABASE=Availink, Inc.
++
+ OUI:9027E4*
+ ID_OUI_FROM_DATABASE=Apple
+
+@@ -65272,6 +65353,9 @@ OUI:906DC8*
+ OUI:906EBB*
+ ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
+
++OUI:906FA9*
++ ID_OUI_FROM_DATABASE=NANJING PUTIAN TELECOMMUNICATIONS TECHNOLOGY CO.,LTD.
++
+ OUI:907025*
+ ID_OUI_FROM_DATABASE=Garea Microsys Co.,Ltd.
+
+@@ -65839,6 +65923,9 @@ OUI:94EBCD*
+ OUI:94F19E*
+ ID_OUI_FROM_DATABASE=HUIZHOU MAORONG INTELLIGENT TECHNOLOGY CO.,LTD
+
++OUI:94F278*
++ ID_OUI_FROM_DATABASE=Elma Electronic
++
+ OUI:94F665*
+ ID_OUI_FROM_DATABASE=Ruckus Wireless
+
+@@ -67354,6 +67441,9 @@ OUI:A81374*
+ OUI:A8154D*
+ ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+
++OUI:A815D6*
++ ID_OUI_FROM_DATABASE=Shenzhen Meione Technology CO., LTD
++
+ OUI:A816B2*
+ ID_OUI_FROM_DATABASE=LG Electronics
+
+@@ -67792,6 +67882,9 @@ OUI:AC5D10*
+ OUI:AC5E8C*
+ ID_OUI_FROM_DATABASE=Utillink
+
++OUI:AC60B6*
++ ID_OUI_FROM_DATABASE=Ericsson AB
++
+ OUI:AC6123*
+ ID_OUI_FROM_DATABASE=Drivven, Inc.
+
+@@ -68323,6 +68416,9 @@ OUI:B0C554*
+ OUI:B0C559*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
++OUI:B0C5CA*
++ ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information.
++
+ OUI:B0C69A*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
+@@ -68461,6 +68557,9 @@ OUI:B424E7*
+ OUI:B428F1*
+ ID_OUI_FROM_DATABASE=E-Prime Co., Ltd.
+
++OUI:B4293D*
++ ID_OUI_FROM_DATABASE=Shenzhen Urovo Technology Co.,Ltd.
++
+ OUI:B42A39*
+ ID_OUI_FROM_DATABASE=ORBIT MERRET, spol. s r. o.
+
+@@ -68926,6 +69025,9 @@ OUI:B87AC9*
+ OUI:B87CF2*
+ ID_OUI_FROM_DATABASE=Aerohive Networks Inc.
+
++OUI:B88687*
++ ID_OUI_FROM_DATABASE=Liteon Technology Corporation
++
+ OUI:B8871E*
+ ID_OUI_FROM_DATABASE=Good Mind Industries Co., Ltd.
+
+@@ -69700,6 +69802,9 @@ OUI:C07009*
+ OUI:C07BBC*
+ ID_OUI_FROM_DATABASE=Cisco
+
++OUI:C07CD1*
++ ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
++
+ OUI:C07E40*
+ ID_OUI_FROM_DATABASE=SHENZHEN XDK COMMUNICATION EQUIPMENT CO.,LTD
+
+@@ -69892,6 +69997,9 @@ OUI:C401CE*
+ OUI:C40415*
+ ID_OUI_FROM_DATABASE=NETGEAR INC.,
+
++OUI:C4047B*
++ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
++
+ OUI:C40528*
+ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
+
+@@ -70378,6 +70486,9 @@ OUI:C848F5*
+ OUI:C84C75*
+ ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC.
+
++OUI:C85195*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:C85645*
+ ID_OUI_FROM_DATABASE=Intermas France
+
+@@ -70486,6 +70597,9 @@ OUI:C8A729*
+ OUI:C8A823*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
++OUI:C8A9FC*
++ ID_OUI_FROM_DATABASE=Goyoo Networks Inc.
++
+ OUI:C8AA21*
+ ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+
+@@ -71260,6 +71374,9 @@ OUI:D08CFF*
+ OUI:D0929E*
+ ID_OUI_FROM_DATABASE=Microsoft Corporation
+
++OUI:D09380*
++ ID_OUI_FROM_DATABASE=Ducere Technologies Pvt. Ltd.
++
+ OUI:D093F8*
+ ID_OUI_FROM_DATABASE=Stonestreet One LLC
+
+@@ -71521,6 +71638,9 @@ OUI:D43D67*
+ OUI:D43D7E*
+ ID_OUI_FROM_DATABASE=Micro-Star Int'l Co, Ltd
+
++OUI:D440F0*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:D443A8*
+ ID_OUI_FROM_DATABASE=Changzhou Haojie Electric Co., Ltd.
+
+@@ -71812,6 +71932,9 @@ OUI:D4F143*
+ OUI:D4F46F*
+ ID_OUI_FROM_DATABASE=Apple
+
++OUI:D4F4BE*
++ ID_OUI_FROM_DATABASE=Palo Alto Networks
++
+ OUI:D4F513*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
+@@ -72022,6 +72145,9 @@ OUI:D881CE*
+ OUI:D88466*
+ ID_OUI_FROM_DATABASE=Extreme Networks
+
++OUI:D888CE*
++ ID_OUI_FROM_DATABASE=RF Technology Pty Ltd
++
+ OUI:D88A3B*
+ ID_OUI_FROM_DATABASE=UNIT-EM
+
+@@ -72319,6 +72445,9 @@ OUI:DC3C2E*
+ OUI:DC3C84*
+ ID_OUI_FROM_DATABASE=Ticom Geomatics, Inc.
+
++OUI:DC3CF6*
++ ID_OUI_FROM_DATABASE=Atomic Rules LLC
++
+ OUI:DC3E51*
+ ID_OUI_FROM_DATABASE=Solberg & Andersen AS
+
+@@ -72940,6 +73069,9 @@ OUI:E4121D*
+ OUI:E41289*
+ ID_OUI_FROM_DATABASE=topsystem Systemhaus GmbH
+
++OUI:E41A2C*
++ ID_OUI_FROM_DATABASE=ZPE Systems, Inc.
++
+ OUI:E41C4B*
+ ID_OUI_FROM_DATABASE=V2 TECHNOLOGY, INC.
+
+@@ -73120,6 +73252,9 @@ OUI:E496AE*
+ OUI:E497F0*
+ ID_OUI_FROM_DATABASE=Shanghai VLC Technologies Ltd. Co.
+
++OUI:E498D1*
++ ID_OUI_FROM_DATABASE=Microsoft Mobile Oy
++
+ OUI:E498D6*
+ ID_OUI_FROM_DATABASE=Apple, Inc
+
+@@ -73507,6 +73642,9 @@ OUI:E8BB3D*
+ OUI:E8BBA8*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD.
+
++OUI:E8BDD1*
++ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
++
+ OUI:E8BE81*
+ ID_OUI_FROM_DATABASE=SAGEMCOM
+
+@@ -74011,6 +74149,9 @@ OUI:F02624*
+ OUI:F0264C*
+ ID_OUI_FROM_DATABASE=Dr. Sigrist AG
+
++OUI:F0272D*
++ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
++
+ OUI:F02765*
+ ID_OUI_FROM_DATABASE=Murata Manufactuaring Co.,Ltd.
+
+@@ -74368,6 +74509,9 @@ OUI:F40F1B*
+ OUI:F40F9B*
+ ID_OUI_FROM_DATABASE=WAVELINK
+
++OUI:F41535*
++ ID_OUI_FROM_DATABASE=SPON Communication Technology Co.,Ltd
++
+ OUI:F41563*
+ ID_OUI_FROM_DATABASE=F5 Networks, Inc.
+
+@@ -74527,9 +74671,15 @@ OUI:F48139*
+ OUI:F48771*
+ ID_OUI_FROM_DATABASE=Infoblox
+
++OUI:F48B32*
++ ID_OUI_FROM_DATABASE=XIAOMI INC
++
+ OUI:F48E09*
+ ID_OUI_FROM_DATABASE=Nokia Corporation
+
++OUI:F48E92*
++ ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd
++
+ OUI:F490CA*
+ ID_OUI_FROM_DATABASE=Tensorcom
+
+@@ -75460,6 +75610,9 @@ OUI:FCE998*
+ OUI:FCEDB9*
+ ID_OUI_FROM_DATABASE=Arrayent
+
++OUI:FCF136*
++ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
++
+ OUI:FCF152*
+ ID_OUI_FROM_DATABASE=Sony Corporation
+
+diff --git a/hwdb/20-pci-vendor-model.hwdb b/hwdb/20-pci-vendor-model.hwdb
+index b27a5c7902..4cc7cfd65c 100644
+--- a/hwdb/20-pci-vendor-model.hwdb
++++ b/hwdb/20-pci-vendor-model.hwdb
+@@ -998,6 +998,9 @@ pci:v00001000d0000005Fsv00001028sd00001F4C*
+ pci:v00001000d0000005Fsv00001028sd00001F4D*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3008 [Fury] (PERC H330 Embedded (for monolithic))
+
++pci:v00001000d0000005Fsv00001054sd0000306A*
++ ID_MODEL_FROM_DATABASE=MegaRAID SAS-3 3008 [Fury] (SAS 3004 iMR ROMB)
++
+ pci:v00001000d00000060*
+ ID_MODEL_FROM_DATABASE=MegaRAID SAS 1078
+
+@@ -6171,28 +6174,28 @@ pci:v00001002d00006819sv0000174Bsd0000E221*
+ ID_MODEL_FROM_DATABASE=Pitcairn PRO [Radeon HD 7850] (Radeon HD 7850 2GB GDDR5 DVI-I/DVI-D/HDMI/DP)
+
+ pci:v00001002d00006820*
+- ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X]
++ ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X/M375X]
+
+ pci:v00001002d00006820sv0000103Csd00001851*
+- ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X] (Radeon HD 7750M)
++ ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X/M375X] (Radeon HD 7750M)
+
+ pci:v00001002d00006820sv000017AAsd00003643*
+- ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X] (Radeon R9 A375)
++ ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X/M375X] (Radeon R9 A375)
+
+ pci:v00001002d00006820sv000017AAsd00003801*
+- ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X] (Radeon R9 M275)
++ ID_MODEL_FROM_DATABASE=Venus XTX [Radeon HD 8890M / R9 M275X/M375X] (Radeon R9 M275)
+
+ pci:v00001002d00006821*
+- ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X]
++ ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X/M370X]
+
+ pci:v00001002d00006821sv00001002sd0000031E*
+- ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X] (FirePro SX4000)
++ ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X/M370X] (FirePro SX4000)
+
+ pci:v00001002d00006821sv00001028sd000005CC*
+- ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X] (FirePro M5100)
++ ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X/M370X] (FirePro M5100)
+
+ pci:v00001002d00006821sv00001028sd000015CC*
+- ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X] (FirePro M5100)
++ ID_MODEL_FROM_DATABASE=Venus XT [Radeon HD 8870M / R9 M270X/M370X] (FirePro M5100)
+
+ pci:v00001002d00006822*
+ ID_MODEL_FROM_DATABASE=Venus PRO [Radeon E8860]
+@@ -12116,6 +12119,9 @@ pci:v0000102Bd0000051E*
+ pci:v0000102Bd0000051F*
+ ID_MODEL_FROM_DATABASE=MGA 2164W [Millennium II] AGP
+
++pci:v0000102Bd0000051Fsv0000102Bsd00002100*
++ ID_MODEL_FROM_DATABASE=MGA 2164W [Millennium II] AGP (MGA-2164WA [Millennium II A])
++
+ pci:v0000102Bd00000520*
+ ID_MODEL_FROM_DATABASE=MGA G200
+
+@@ -12237,7 +12243,7 @@ pci:v0000102Bd00000521sv0000102Bsd0000FF02*
+ ID_MODEL_FROM_DATABASE=MGA G200 AGP (Mystique G200 AGP)
+
+ pci:v0000102Bd00000521sv0000102Bsd0000FF03*
+- ID_MODEL_FROM_DATABASE=MGA G200 AGP (Millennium G200 AGP)
++ ID_MODEL_FROM_DATABASE=MGA G200 AGP (Millennium G200A AGP)
+
+ pci:v0000102Bd00000521sv0000102Bsd0000FF04*
+ ID_MODEL_FROM_DATABASE=MGA G200 AGP (Marvel G200 AGP)
+@@ -26115,16 +26121,16 @@ pci:v000010DEd0000056Asv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 [nForce 630i] USB 2.0 Controller (EHCI) (I-N73V motherboard)
+
+ pci:v000010DEd0000056C*
+- ID_MODEL_FROM_DATABASE=MCP73 IDE
++ ID_MODEL_FROM_DATABASE=MCP73 IDE Controller
+
+ pci:v000010DEd0000056Csv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=MCP73 IDE (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=MCP73 IDE Controller (MCP73PVT-SM)
+
+ pci:v000010DEd0000056Csv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=MCP73 IDE (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=MCP73 IDE Controller (I-N73V motherboard)
+
+ pci:v000010DEd0000056Csv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=MCP73 IDE (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=MCP73 IDE Controller (JW-IN7150-HD)
+
+ pci:v000010DEd0000056D*
+ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge
+@@ -26133,7 +26139,7 @@ pci:v000010DEd0000056Dsv00001019sd0000297A*
+ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge (MCP73PVT-SM)
+
+ pci:v000010DEd0000056Dsv000010DEsd0000CB73*
+- ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge (MCP73 PCIe x16 port)
++ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge (MCP73 PCIe x1 port)
+
+ pci:v000010DEd0000056E*
+ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge
+@@ -26141,6 +26147,9 @@ pci:v000010DEd0000056E*
+ pci:v000010DEd0000056Esv00001019sd0000297A*
+ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge (MCP73PVT-SM)
+
++pci:v000010DEd0000056Esv000010DEsd00000000*
++ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge (MCP73 PCIe x16 port)
++
+ pci:v000010DEd0000056F*
+ ID_MODEL_FROM_DATABASE=MCP73 PCI Express bridge
+
+@@ -26976,112 +26985,112 @@ pci:v000010DEd000007C8sv00001AFAsd00007150*
+ ID_MODEL_FROM_DATABASE=MCP73 Memory Controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007CB*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007CBsv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007CBsv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007CBsv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007CD*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007CDsv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007CDsv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007CDsv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007CE*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007CEsv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007CEsv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007CEsv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007CF*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007CFsv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007CFsv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007CFsv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007D0*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007D0sv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007D0sv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007D0sv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007D1*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007D1sv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007D1sv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007D1sv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007D2*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007D2sv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007D2sv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007D2sv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007D3*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007D3sv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007D3sv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007D3sv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007D6*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller
+
+ pci:v000010DEd000007D6sv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007D6sv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (I-N73V motherboard)
+
+ pci:v000010DEd000007D6sv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=nForce 630i memory controller (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=nForce 610i/630i memory controller (JW-IN7150-HD)
+
+ pci:v000010DEd000007D7*
+ ID_MODEL_FROM_DATABASE=MCP73 LPC Bridge
+@@ -27165,10 +27174,10 @@ pci:v000010DEd000007E5*
+ ID_MODEL_FROM_DATABASE=C73 [GeForce 7100 / nForce 620i]
+
+ pci:v000010DEd000007F0*
+- ID_MODEL_FROM_DATABASE=MCP73 IDE
++ ID_MODEL_FROM_DATABASE=MCP73 SATA Controller (IDE mode)
+
+ pci:v000010DEd000007F0sv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=MCP73 IDE (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=MCP73 SATA Controller (IDE mode) (I-N73V motherboard)
+
+ pci:v000010DEd000007F4*
+ ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i SATA
+@@ -27176,9 +27185,15 @@ pci:v000010DEd000007F4*
+ pci:v000010DEd000007F4sv00001019sd0000297A*
+ ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i SATA (MCP73PVT-SM)
+
++pci:v000010DEd000007F4sv0000147Bsd00001C3E*
++ ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i SATA (I-N73V motherboard)
++
+ pci:v000010DEd000007F8*
+ ID_MODEL_FROM_DATABASE=MCP73 SATA RAID Controller
+
++pci:v000010DEd000007F8sv0000147Bsd00001C3E*
++ ID_MODEL_FROM_DATABASE=MCP73 SATA RAID Controller (I-N73V motherboard)
++
+ pci:v000010DEd000007FC*
+ ID_MODEL_FROM_DATABASE=MCP73 High Definition Audio
+
+@@ -27192,16 +27207,16 @@ pci:v000010DEd000007FCsv0000147Bsd00001C3E*
+ ID_MODEL_FROM_DATABASE=MCP73 High Definition Audio (I-N73V motherboard)
+
+ pci:v000010DEd000007FE*
+- ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB
++ ID_MODEL_FROM_DATABASE=MCP73 OHCI USB 1.1 Controller
+
+ pci:v000010DEd000007FEsv00001019sd0000297A*
+- ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB (MCP73PVT-SM)
++ ID_MODEL_FROM_DATABASE=MCP73 OHCI USB 1.1 Controller (MCP73PVT-SM)
+
+ pci:v000010DEd000007FEsv0000147Bsd00001C3E*
+- ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB (I-N73V motherboard)
++ ID_MODEL_FROM_DATABASE=MCP73 OHCI USB 1.1 Controller (I-N73V motherboard)
+
+ pci:v000010DEd000007FEsv00001AFAsd00007150*
+- ID_MODEL_FROM_DATABASE=GeForce 7100/nForce 630i USB (JW-IN7150-HD)
++ ID_MODEL_FROM_DATABASE=MCP73 OHCI USB 1.1 Controller (JW-IN7150-HD)
+
+ pci:v000010DEd00000840*
+ ID_MODEL_FROM_DATABASE=C77 [GeForce 8200M]
+@@ -30269,12 +30284,18 @@ pci:v000010DEd000013D8*
+ pci:v000010DEd000013D9*
+ ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 965M]
+
++pci:v000010DEd000013F2*
++ ID_MODEL_FROM_DATABASE=GM204GL [Tesla M60]
++
+ pci:v000010DEd00001401*
+ ID_MODEL_FROM_DATABASE=GM206 [GeForce GTX 960]
+
+ pci:v000010DEd000017C2*
+ ID_MODEL_FROM_DATABASE=GM200 [GeForce GTX TITAN X]
+
++pci:v000010DEd000017C8*
++ ID_MODEL_FROM_DATABASE=GM200 [GeForce GTX 980 Ti]
++
+ pci:v000010DEd000017F0*
+ ID_MODEL_FROM_DATABASE=GM200GL [Quadro M6000]
+
+@@ -31673,12 +31694,21 @@ pci:v00001103d00000622*
+ pci:v00001103d00000640*
+ ID_MODEL_FROM_DATABASE=RocketRAID 640 4 Port SATA-III Controller
+
++pci:v00001103d00000641*
++ ID_MODEL_FROM_DATABASE=RocketRAID 640L 4 Port SATA-III Controller
++
++pci:v00001103d00000642*
++ ID_MODEL_FROM_DATABASE=RocketRAID 642L 2 Port SATA-III Controller (eSATA)
++
+ pci:v00001103d00000644*
+ ID_MODEL_FROM_DATABASE=RocketRAID 644 4 Port SATA-III Controller (eSATA)
+
+ pci:v00001103d00000645*
+ ID_MODEL_FROM_DATABASE=RocketRAID 644L 4 Port SATA-III Controller (eSATA)
+
++pci:v00001103d00000646*
++ ID_MODEL_FROM_DATABASE=RocketRAID 644LS SATA-III Controller (4 eSATA devices connected by 1 SAS cable)
++
+ pci:v00001103d00001720*
+ ID_MODEL_FROM_DATABASE=RocketRAID 1720 (2x SATA II RAID Controller)
+
+@@ -32441,6 +32471,9 @@ pci:v00001106d00003058sv00001462sd00003092*
+ pci:v00001106d00003058sv00001462sd00003300*
+ ID_MODEL_FROM_DATABASE=VT82C686 AC97 Audio Controller (MS-6330 Onboard Audio)
+
++pci:v00001106d00003058sv00001462sd00003400*
++ ID_MODEL_FROM_DATABASE=VT82C686 AC97 Audio Controller (MS-6340 (VT8363) motherboard)
++
+ pci:v00001106d00003058sv000015DDsd00007609*
+ ID_MODEL_FROM_DATABASE=VT82C686 AC97 Audio Controller (Onboard Audio)
+
+@@ -46559,9 +46592,6 @@ pci:v0000148E*
+ pci:v0000148F*
+ ID_VENDOR_FROM_DATABASE=Plant Equipment, Inc.
+
+-pci:v0000148Fd00005370*
+- ID_MODEL_FROM_DATABASE=Dexlink AUWL15I1
+-
+ pci:v00001490*
+ ID_VENDOR_FROM_DATABASE=Stone Microsystems PTY Ltd.
+
+@@ -63881,6 +63911,9 @@ pci:v00008086d00001A30*
+ pci:v00008086d00001A30sv00001028sd0000010E*
+ ID_MODEL_FROM_DATABASE=82845 845 [Brookdale] Chipset Host Bridge (Optiplex GX240)
+
++pci:v00008086d00001A30sv0000147Bsd00000505*
++ ID_MODEL_FROM_DATABASE=82845 845 [Brookdale] Chipset Host Bridge (BL7 motherboard)
++
+ pci:v00008086d00001A30sv000015D9sd00003280*
+ ID_MODEL_FROM_DATABASE=82845 845 [Brookdale] Chipset Host Bridge (Supermicro P4SBE Mainboard)
+
+@@ -65304,43 +65337,46 @@ pci:v00008086d00002440sv00008086sd00005744*
+ ID_MODEL_FROM_DATABASE=82801BA ISA Bridge (LPC) (S845WD1-E)
+
+ pci:v00008086d00002442*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1
+
+ pci:v00008086d00002442sv00001014sd000001C6*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Netvista A40/A40p)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (Netvista A40/A40p)
+
+ pci:v00008086d00002442sv00001025sd00001016*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Travelmate 612 TX)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (Travelmate 612 TX)
+
+ pci:v00008086d00002442sv00001028sd000000C7*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Dimension 8100)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (Dimension 8100)
+
+ pci:v00008086d00002442sv00001028sd000000D8*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Precision 530)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (Precision 530)
+
+ pci:v00008086d00002442sv00001028sd0000010E*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Optiplex GX240)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (Optiplex GX240)
+
+ pci:v00008086d00002442sv0000103Csd0000126F*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (e-pc 40)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (e-pc 40)
+
+ pci:v00008086d00002442sv00001043sd00008027*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (TUSL2-C Mainboard)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (TUSL2-C Mainboard)
+
+ pci:v00008086d00002442sv0000104Dsd000080DF*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Vaio PCG-FX403)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (Vaio PCG-FX403)
++
++pci:v00008086d00002442sv0000147Bsd00000505*
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (BL7 motherboard)
+
+ pci:v00008086d00002442sv0000147Bsd00000507*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (TH7II-RAID)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (TH7II-RAID)
+
+ pci:v00008086d00002442sv00008086sd00004532*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (D815EEA2 mainboard)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (D815EEA2 mainboard)
+
+ pci:v00008086d00002442sv00008086sd00004557*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (D815EGEW Mainboard)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (D815EGEW Mainboard)
+
+ pci:v00008086d00002442sv00008086sd00005744*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (S845WD1-E mainboard)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #1 (S845WD1-E mainboard)
+
+ pci:v00008086d00002443*
+ ID_MODEL_FROM_DATABASE=82801BA/BAM SMBus Controller
+@@ -65369,6 +65405,9 @@ pci:v00008086d00002443sv00001043sd00008027*
+ pci:v00008086d00002443sv0000104Dsd000080DF*
+ ID_MODEL_FROM_DATABASE=82801BA/BAM SMBus Controller (Vaio PCG-FX403)
+
++pci:v00008086d00002443sv0000147Bsd00000505*
++ ID_MODEL_FROM_DATABASE=82801BA/BAM SMBus Controller (BL7 motherboard)
++
+ pci:v00008086d00002443sv0000147Bsd00000507*
+ ID_MODEL_FROM_DATABASE=82801BA/BAM SMBus Controller (TH7II-RAID)
+
+@@ -65385,37 +65424,40 @@ pci:v00008086d00002443sv00008086sd00005744*
+ ID_MODEL_FROM_DATABASE=82801BA/BAM SMBus Controller (S845WD1-E mainboard)
+
+ pci:v00008086d00002444*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2
+
+ pci:v00008086d00002444sv00001025sd00001016*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Travelmate 612 TX)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (Travelmate 612 TX)
+
+ pci:v00008086d00002444sv00001028sd000000C7*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Dimension 8100)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (Dimension 8100)
+
+ pci:v00008086d00002444sv00001028sd000000D8*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Precision 530)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (Precision 530)
+
+ pci:v00008086d00002444sv00001028sd0000010E*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Optiplex GX240)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (Optiplex GX240)
+
+ pci:v00008086d00002444sv0000103Csd0000126F*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (e-pc 40)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (e-pc 40)
+
+ pci:v00008086d00002444sv00001043sd00008027*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (TUSL2-C Mainboard)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (TUSL2-C Mainboard)
+
+ pci:v00008086d00002444sv0000104Dsd000080DF*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (Vaio PCG-FX403)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (Vaio PCG-FX403)
++
++pci:v00008086d00002444sv0000147Bsd00000505*
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (BL7 motherboard)
+
+ pci:v00008086d00002444sv0000147Bsd00000507*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (TH7II-RAID)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (TH7II-RAID)
+
+ pci:v00008086d00002444sv00008086sd00004532*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (D815EEA2 mainboard)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (D815EEA2 mainboard)
+
+ pci:v00008086d00002444sv00008086sd00005744*
+- ID_MODEL_FROM_DATABASE=82801BA/BAM USB Controller #1 (S845WD1-E mainboard)
++ ID_MODEL_FROM_DATABASE=82801BA/BAM UHCI USB 1.1 Controller #2 (S845WD1-E mainboard)
+
+ pci:v00008086d00002445*
+ ID_MODEL_FROM_DATABASE=82801BA/BAM AC'97 Audio Controller
+@@ -65444,6 +65486,9 @@ pci:v00008086d00002445sv0000104Dsd000080DF*
+ pci:v00008086d00002445sv00001462sd00003370*
+ ID_MODEL_FROM_DATABASE=82801BA/BAM AC'97 Audio Controller (STAC9721 AC)
+
++pci:v00008086d00002445sv0000147Bsd00000505*
++ ID_MODEL_FROM_DATABASE=82801BA/BAM AC'97 Audio Controller (BL7 motherboard)
++
+ pci:v00008086d00002445sv0000147Bsd00000507*
+ ID_MODEL_FROM_DATABASE=82801BA/BAM AC'97 Audio Controller (TH7II-RAID)
+
+@@ -65645,6 +65690,9 @@ pci:v00008086d0000244Bsv0000103Csd0000126F*
+ pci:v00008086d0000244Bsv00001043sd00008027*
+ ID_MODEL_FROM_DATABASE=82801BA IDE U100 Controller (TUSL2-C Mainboard)
+
++pci:v00008086d0000244Bsv0000147Bsd00000505*
++ ID_MODEL_FROM_DATABASE=82801BA IDE U100 Controller (BL7 motherboard)
++
+ pci:v00008086d0000244Bsv0000147Bsd00000507*
+ ID_MODEL_FROM_DATABASE=82801BA IDE U100 Controller (TH7II-RAID)
+
+@@ -79125,7 +79173,7 @@ pci:v0000DEAFd00009052*
+ ID_MODEL_FROM_DATABASE=PC Weasel Watchdog Timer
+
+ pci:v0000DEDA*
+- ID_VENDOR_FROM_DATABASE=SoftHard Technology Ltd.
++ ID_VENDOR_FROM_DATABASE=XIMEA
+
+ pci:v0000E000*
+ ID_VENDOR_FROM_DATABASE=Winbond
diff --git a/0038-README-update-links-to-reference-new-home-GitHub.patch b/0038-README-update-links-to-reference-new-home-GitHub.patch
new file mode 100644
index 0000000..e4e3bcd
--- /dev/null
+++ b/0038-README-update-links-to-reference-new-home-GitHub.patch
@@ -0,0 +1,37 @@
+From 6f0c06705a671ae53942f52bd7c66eea986150fa Mon Sep 17 00:00:00 2001
+From: Jonathan Boulle <jonathanboulle at gmail.com>
+Date: Tue, 2 Jun 2015 15:57:50 -0700
+Subject: [PATCH] README: update links to reference new home (GitHub)
+
+(cherry picked from commit eb0914fc85812570538c37287dd3cfa377289418)
+---
+ README | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/README b/README
+index b909b434db..528f957714 100644
+--- a/README
++++ b/README
+@@ -7,11 +7,11 @@ WEB SITE:
+ http://www.freedesktop.org/wiki/Software/systemd
+
+ GIT:
+- git://anongit.freedesktop.org/systemd/systemd
+- ssh://git.freedesktop.org/git/systemd/systemd
++ git at github.com:systemd/systemd.git
++ https://github.com/systemd/systemd.git
+
+ GITWEB:
+- http://cgit.freedesktop.org/systemd/systemd
++ https://github.com/systemd/systemd
+
+ MAILING LIST:
+ http://lists.freedesktop.org/mailman/listinfo/systemd-devel
+@@ -22,6 +22,7 @@ IRC:
+
+ BUG REPORTS:
+ https://bugs.freedesktop.org/enter_bug.cgi?product=systemd
++ https://github.com/systemd/systemd/issues
+
+ AUTHOR:
+ Lennart Poettering
diff --git a/0039-point-to-github-issues-instead-of-freedesktop-bugzil.patch b/0039-point-to-github-issues-instead-of-freedesktop-bugzil.patch
new file mode 100644
index 0000000..1788d67
--- /dev/null
+++ b/0039-point-to-github-issues-instead-of-freedesktop-bugzil.patch
@@ -0,0 +1,36 @@
+From 182abe6e6881a696fc456a1aadaa90bcebd51ea4 Mon Sep 17 00:00:00 2001
+From: Kay Sievers <kay at vrfy.org>
+Date: Wed, 3 Jun 2015 14:48:55 +0200
+Subject: [PATCH] point to github issues instead of freedesktop bugzilla
+
+(cherry picked from commit 29d01b70640878f63e74ce20cb45fd747311fa18)
+---
+ README | 1 -
+ configure.ac | 2 +-
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/README b/README
+index 528f957714..c19beffa20 100644
+--- a/README
++++ b/README
+@@ -21,7 +21,6 @@ IRC:
+ #systemd on irc.freenode.org
+
+ BUG REPORTS:
+- https://bugs.freedesktop.org/enter_bug.cgi?product=systemd
+ https://github.com/systemd/systemd/issues
+
+ AUTHOR:
+diff --git a/configure.ac b/configure.ac
+index 0818dd80cf..fa3232e3c1 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -21,7 +21,7 @@ AC_PREREQ([2.64])
+
+ AC_INIT([systemd],
+ [220],
+- [http://bugs.freedesktop.org/enter_bug.cgi?product=systemd],
++ [http://github.com/systemd/systemd/issues]
+ [systemd],
+ [http://www.freedesktop.org/wiki/Software/systemd])
+
diff --git a/0040-configure.ac-add-missing-komma.patch b/0040-configure.ac-add-missing-komma.patch
new file mode 100644
index 0000000..d4f7c31
--- /dev/null
+++ b/0040-configure.ac-add-missing-komma.patch
@@ -0,0 +1,23 @@
+From d203089834c735b422f48cafe917aab1134591b3 Mon Sep 17 00:00:00 2001
+From: Kay Sievers <kay at vrfy.org>
+Date: Wed, 3 Jun 2015 14:50:58 +0200
+Subject: [PATCH] configure.ac: add missing komma
+
+(cherry picked from commit 1a435084b7f55bc24042f9bc47c18e4e2381f667)
+---
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index fa3232e3c1..ffde0a667b 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -21,7 +21,7 @@ AC_PREREQ([2.64])
+
+ AC_INIT([systemd],
+ [220],
+- [http://github.com/systemd/systemd/issues]
++ [http://github.com/systemd/systemd/issues],
+ [systemd],
+ [http://www.freedesktop.org/wiki/Software/systemd])
+
diff --git a/0041-util-fix-another-cunescape-regression.patch b/0041-util-fix-another-cunescape-regression.patch
new file mode 100644
index 0000000..0d17cbf
--- /dev/null
+++ b/0041-util-fix-another-cunescape-regression.patch
@@ -0,0 +1,48 @@
+From c47edbd3bfaf64ad8fa3d105029bed8667baf275 Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel at zonque.org>
+Date: Wed, 3 Jun 2015 13:33:26 +0200
+Subject: [PATCH] util: fix another cunescape() regression
+
+Fix a regression caused by 4034a06d ("util: rework word parsing and c
+unescaping code") which broke octal escape sequences.
+
+The reason for this breakage is that cunescape_one() expects 4 characters
+in an octal encoding, which is a stray left-over from the old code which
+operated on different variables to make the length check.
+
+While at it, add a test case to prevent the same thing from happening
+again.
+
+(cherry picked from commit 3b51f8ddd5408eaae06e774e40144c7788748000)
+---
+ src/shared/util.c | 2 +-
+ src/test/test-util.c | 3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/shared/util.c b/src/shared/util.c
+index 74a2190031..57782ba687 100644
+--- a/src/shared/util.c
++++ b/src/shared/util.c
+@@ -1186,7 +1186,7 @@ static int cunescape_one(const char *p, size_t length, char *ret, uint32_t *ret_
+ int a, b, c;
+ uint32_t m;
+
+- if (length != (size_t) -1 && length < 4)
++ if (length != (size_t) -1 && length < 3)
+ return -EINVAL;
+
+ a = unoctchar(p[0]);
+diff --git a/src/test/test-util.c b/src/test/test-util.c
+index 36773c109d..fab485fa14 100644
+--- a/src/test/test-util.c
++++ b/src/test/test-util.c
+@@ -459,6 +459,9 @@ static void test_cunescape(void) {
+ assert_se(cunescape("\\u0000", 0, &unescaped) < 0);
+ assert_se(cunescape("\\u00DF\\U000000df\\u03a0\\U00000041", UNESCAPE_RELAX, &unescaped) >= 0);
+ assert_se(streq_ptr(unescaped, "ßßΠA"));
++
++ assert_se(cunescape("\\073", 0, &unescaped) >= 0);
++ assert_se(streq_ptr(unescaped, ";"));
+ }
+
+ static void test_foreach_word(void) {
diff --git a/0042-test-unit-file.c-fixup-the-test-for-commit-3b51f8ddd.patch b/0042-test-unit-file.c-fixup-the-test-for-commit-3b51f8ddd.patch
new file mode 100644
index 0000000..59c5eb3
--- /dev/null
+++ b/0042-test-unit-file.c-fixup-the-test-for-commit-3b51f8ddd.patch
@@ -0,0 +1,23 @@
+From 2f07442729010a010c88b34a0d5fc51d30e622ea Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Wed, 3 Jun 2015 16:36:20 +0200
+Subject: [PATCH] test-unit-file.c: fixup the test for commit 3b51f8ddd5
+
+(cherry picked from commit ce54255fa599d32738a311c77331fa611e6cfa5e)
+---
+ src/test/test-unit-file.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
+index 31b12d50d7..a8025c825b 100644
+--- a/src/test/test-unit-file.c
++++ b/src/test/test-unit-file.c
+@@ -232,7 +232,7 @@ static void test_config_parse_exec(void) {
+ &c, NULL);
+ assert_se(r >= 0);
+ c1 = c1->command_next;
+- check_execcommand(c1, "/bin/find", NULL, "\\073", NULL, false);
++ check_execcommand(c1, "/bin/find", NULL, ";", NULL, false);
+
+ log_info("/* spaces in the filename */");
+ r = config_parse_exec(NULL, "fake", 5, "section", 1,
diff --git a/0043-systemctl-Use-usr-bin-editor-if-available.patch b/0043-systemctl-Use-usr-bin-editor-if-available.patch
new file mode 100644
index 0000000..225c373
--- /dev/null
+++ b/0043-systemctl-Use-usr-bin-editor-if-available.patch
@@ -0,0 +1,47 @@
+From 1e534b8a0da393c90b6dedeb5fdd1abd08293ae7 Mon Sep 17 00:00:00 2001
+From: Michael Biebl <biebl at debian.org>
+Date: Wed, 3 Jun 2015 14:00:59 +0200
+Subject: [PATCH] systemctl: Use /usr/bin/editor if available
+
+If the EDITOR environment variable is not set, the Debian policy
+recommends to use the /usr/bin/editor program as default editor.
+This file is managed via the dpkg alternatives mechanism and typically
+used in Debian/Ubuntu and derivatives to configure the default editor.
+
+See section 11.4 of the Debian policy [1].
+
+Therefor prefer /usr/bin/editor over specific editors if available.
+
+[1] https://www.debian.org/doc/debian-policy/ch-customized-programs.html
+
+(cherry picked from commit 9391a1c3d6c94c478b0016a81df3f874fd99260e)
+---
+ man/systemctl.xml | 1 +
+ src/systemctl/systemctl.c | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/man/systemctl.xml b/man/systemctl.xml
+index 94a77bce0c..9b79c2df0f 100644
+--- a/man/systemctl.xml
++++ b/man/systemctl.xml
+@@ -1730,6 +1730,7 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
+ <varname>$VISUAL</varname> are present or if it is set to an empty
+ string or if their execution failed, systemctl will try to execute well
+ known editors in this order:
++ <citerefentry project='die-net'><refentrytitle>editor</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+ <citerefentry project='die-net'><refentrytitle>nano</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+ <citerefentry project='die-net'><refentrytitle>vim</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
+ <citerefentry project='die-net'><refentrytitle>vi</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
+diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
+index f8e10a4710..cf5aa07ac6 100644
+--- a/src/systemctl/systemctl.c
++++ b/src/systemctl/systemctl.c
+@@ -5870,7 +5870,7 @@ static int run_editor(char **paths) {
+ execvp(editor, (char* const*) args);
+ }
+
+- FOREACH_STRING(p, "nano", "vim", "vi") {
++ FOREACH_STRING(p, "editor", "nano", "vim", "vi") {
+ args[0] = p;
+ execvp(p, (char* const*) args);
+ /* We do not fail if the editor doesn't exist
diff --git a/0044-libudev-enumerate-accept-NULL-parameters-in-add_matc.patch b/0044-libudev-enumerate-accept-NULL-parameters-in-add_matc.patch
new file mode 100644
index 0000000..5dcd375
--- /dev/null
+++ b/0044-libudev-enumerate-accept-NULL-parameters-in-add_matc.patch
@@ -0,0 +1,137 @@
+From 929227823d61ecc408d85b328ab04604e7f540cf Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Wed, 3 Jun 2015 22:08:46 +0200
+Subject: [PATCH] libudev: enumerate - accept NULL parameters in add_match()
+
+This was a regression introduced when moving to sd-device.
+
+(cherry picked from commit 54f0b4d9a3e3e1b955d0b0021d9678571d91a5ef)
+---
+ src/libsystemd/sd-device/device-enumerator.c | 18 ++++++++++--------
+ src/libudev/libudev-enumerate.c | 21 +++++++++++++++++++++
+ 2 files changed, 31 insertions(+), 8 deletions(-)
+
+diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c
+index 3692d46e06..7fd77e9480 100644
+--- a/src/libsystemd/sd-device/device-enumerator.c
++++ b/src/libsystemd/sd-device/device-enumerator.c
+@@ -137,7 +137,6 @@ _public_ int sd_device_enumerator_add_match_sysattr(sd_device_enumerator *enumer
+
+ assert_return(enumerator, -EINVAL);
+ assert_return(_sysattr, -EINVAL);
+- assert_return(_value, -EINVAL);
+
+ if (match)
+ hashmap = &enumerator->match_sysattr;
+@@ -152,9 +151,11 @@ _public_ int sd_device_enumerator_add_match_sysattr(sd_device_enumerator *enumer
+ if (!sysattr)
+ return -ENOMEM;
+
+- value = strdup(_value);
+- if (!value)
+- return -ENOMEM;
++ if (_value) {
++ value = strdup(_value);
++ if (!value)
++ return -ENOMEM;
++ }
+
+ r = hashmap_put(*hashmap, sysattr, value);
+ if (r < 0)
+@@ -174,7 +175,6 @@ _public_ int sd_device_enumerator_add_match_property(sd_device_enumerator *enume
+
+ assert_return(enumerator, -EINVAL);
+ assert_return(_property, -EINVAL);
+- assert_return(_value, -EINVAL);
+
+ r = hashmap_ensure_allocated(&enumerator->match_property, NULL);
+ if (r < 0)
+@@ -184,9 +184,11 @@ _public_ int sd_device_enumerator_add_match_property(sd_device_enumerator *enume
+ if (!property)
+ return -ENOMEM;
+
+- value = strdup(_value);
+- if (!value)
+- return -ENOMEM;
++ if (_value) {
++ value = strdup(_value);
++ if (!value)
++ return -ENOMEM;
++ }
+
+ r = hashmap_put(enumerator->match_property, property, value);
+ if (r < 0)
+diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
+index 255fbe808d..df088946df 100644
+--- a/src/libudev/libudev-enumerate.c
++++ b/src/libudev/libudev-enumerate.c
+@@ -196,6 +196,9 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume
+ _public_ int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem) {
+ assert_return(udev_enumerate, -EINVAL);
+
++ if (!subsystem)
++ return 0;
++
+ return sd_device_enumerator_add_match_subsystem(udev_enumerate->enumerator, subsystem, true);
+ }
+
+@@ -211,6 +214,9 @@ _public_ int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enum
+ _public_ int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem) {
+ assert_return(udev_enumerate, -EINVAL);
+
++ if (!subsystem)
++ return 0;
++
+ return sd_device_enumerator_add_match_subsystem(udev_enumerate->enumerator, subsystem, false);
+ }
+
+@@ -227,6 +233,9 @@ _public_ int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_en
+ _public_ int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value) {
+ assert_return(udev_enumerate, -EINVAL);
+
++ if (!sysattr)
++ return 0;
++
+ return sd_device_enumerator_add_match_sysattr(udev_enumerate->enumerator, sysattr, value, true);
+ }
+
+@@ -243,6 +252,9 @@ _public_ int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumer
+ _public_ int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value) {
+ assert_return(udev_enumerate, -EINVAL);
+
++ if (!sysattr)
++ return 0;
++
+ return sd_device_enumerator_add_match_sysattr(udev_enumerate->enumerator, sysattr, value, false);
+ }
+
+@@ -259,6 +271,9 @@ _public_ int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enum
+ _public_ int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value) {
+ assert_return(udev_enumerate, -EINVAL);
+
++ if (!property)
++ return 0;
++
+ return sd_device_enumerator_add_match_property(udev_enumerate->enumerator, property, value);
+ }
+
+@@ -274,6 +289,9 @@ _public_ int udev_enumerate_add_match_property(struct udev_enumerate *udev_enume
+ _public_ int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag) {
+ assert_return(udev_enumerate, -EINVAL);
+
++ if (!tag)
++ return 0;
++
+ return sd_device_enumerator_add_match_tag(udev_enumerate->enumerator, tag);
+ }
+
+@@ -335,6 +353,9 @@ _public_ int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev
+ _public_ int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname) {
+ assert_return(udev_enumerate, -EINVAL);
+
++ if (!sysname)
++ return 0;
++
+ return sd_device_enumerator_add_match_sysname(udev_enumerate->enumerator, sysname);
+ }
+
diff --git a/0045-Add-dev-xvd-to-60-persistent-storage-whitelist.patch b/0045-Add-dev-xvd-to-60-persistent-storage-whitelist.patch
new file mode 100644
index 0000000..f0c2e6a
--- /dev/null
+++ b/0045-Add-dev-xvd-to-60-persistent-storage-whitelist.patch
@@ -0,0 +1,25 @@
+From fa7f0bc082bbcfaa997f949b8b4a035fd8a01eda Mon Sep 17 00:00:00 2001
+From: Ed Swierk <eswierk at skyportsystems.com>
+Date: Wed, 3 Jun 2015 08:08:37 -0700
+Subject: [PATCH] Add /dev/xvd* to 60-persistent-storage whitelist Without
+ this, systemd-udevd does not create persistent storage symlinks for xen block
+ devices.
+
+(cherry picked from commit ff2aa01e61f8aff149b63231365f1cef008296a2)
+---
+ rules/60-persistent-storage.rules | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rules/60-persistent-storage.rules b/rules/60-persistent-storage.rules
+index 2aa15f3411..64c5f1cfdd 100644
+--- a/rules/60-persistent-storage.rules
++++ b/rules/60-persistent-storage.rules
+@@ -6,7 +6,7 @@
+ ACTION=="remove", GOTO="persistent_storage_end"
+
+ SUBSYSTEM!="block", GOTO="persistent_storage_end"
+-KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|bcache*", GOTO="persistent_storage_end"
++KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|bcache*|xvd*", GOTO="persistent_storage_end"
+
+ # ignore partitions that span the entire disk
+ TEST=="whole_disk", GOTO="persistent_storage_end"
diff --git a/0046-hwdb-add-Apple-MagicMouse-entry.patch b/0046-hwdb-add-Apple-MagicMouse-entry.patch
new file mode 100644
index 0000000..ef9c7db
--- /dev/null
+++ b/0046-hwdb-add-Apple-MagicMouse-entry.patch
@@ -0,0 +1,31 @@
+From 78ec5ea630547d9ec60c4e6afd6abf054681dbd6 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at who-t.net>
+Date: Thu, 4 Jun 2015 16:05:08 +1000
+Subject: [PATCH] hwdb: add Apple MagicMouse entry
+
+(cherry picked from commit 68a6ac91a1b8454a5f21846ffef3e1f024707b27)
+---
+ hwdb/70-mouse.hwdb | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/hwdb/70-mouse.hwdb b/hwdb/70-mouse.hwdb
+index 8174f2762e..2784b941a1 100644
+--- a/hwdb/70-mouse.hwdb
++++ b/hwdb/70-mouse.hwdb
+@@ -102,6 +102,16 @@
+ # For mice with switchable resolution, sort by the starred entry.
+
+ ##########################################
++# Apple
++##########################################
++
++# Apple MagicMouse
++# Note: this device changes name once connected to a mac, the name ends up
++# as $username`s mouse
++mouse:bluetooth:v05acp030d:name:*:
++ MOUSE_DPI=1300 at 1000
++
++##########################################
+ # Chicony
+ ##########################################
+
diff --git a/0047-logind-Add-a-udev-rule-to-tag-all-DRM-cards-with-mas.patch b/0047-logind-Add-a-udev-rule-to-tag-all-DRM-cards-with-mas.patch
new file mode 100644
index 0000000..e6d0f69
--- /dev/null
+++ b/0047-logind-Add-a-udev-rule-to-tag-all-DRM-cards-with-mas.patch
@@ -0,0 +1,56 @@
+From 2259b85e4722ec81a11229e3f2d8abb1b3e93a8b Mon Sep 17 00:00:00 2001
+From: Philip Withnall <philip.withnall at collabora.co.uk>
+Date: Tue, 2 Jun 2015 15:24:48 +0100
+Subject: [PATCH] logind: Add a udev rule to tag all DRM cards with
+ master-of-seat
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This is needed for generic DRM devices like the VirtualBox vboxvideo
+driver, which exposes itself as a generic, ID-less DRM device at
+/dev/dri/card0 (after applying this commit):
+ $ udevadm info --query=all --path \
+ /sys/devices/pci0000:00/0000:00:02.0/drm/card0
+ P: /devices/pci0000:00/0000:00:02.0/drm/card0
+ N: dri/card0
+ E: DEVNAME=/dev/dri/card0
+ E: DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
+ E: DEVTYPE=drm_minor
+ E: ID_FOR_SEAT=drm-pci-0000_00_02_0
+ E: ID_PATH=pci-0000:00:02.0
+ E: ID_PATH_TAG=pci-0000_00_02_0
+ E: MAJOR=226
+ E: MINOR=0
+ E: SUBSYSTEM=drm
+ E: TAGS=:master-of-seat:seat:uaccess:
+ E: USEC_INITIALIZED=59893
+
+Without this patch, the capabilities for a seat on a VirtualBox
+installation of systemd v219 incorrectly show it as non-graphical, even
+though I can type these commands from an xterm:
+ $ loginctl show-seat seat0
+ Id=seat0
+ CanMultiSession=yes
+ CanTTY=yes
+ CanGraphical=no
+ …
+
+https://bugs.freedesktop.org/show_bug.cgi?id=90822
+(cherry picked from commit ed817cd4e58c5f5c868d5d9e59a1d7e66b1da165)
+---
+ src/login/71-seat.rules.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/login/71-seat.rules.in b/src/login/71-seat.rules.in
+index ad26acbbb3..ab7b66f651 100644
+--- a/src/login/71-seat.rules.in
++++ b/src/login/71-seat.rules.in
+@@ -11,6 +11,7 @@ TAG=="uaccess", SUBSYSTEM!="sound", TAG+="seat"
+ SUBSYSTEM=="sound", KERNEL=="card*", TAG+="seat"
+ SUBSYSTEM=="input", KERNEL=="input*", TAG+="seat"
+ SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", TAG+="seat", TAG+="master-of-seat"
++SUBSYSTEM=="drm", KERNEL=="card[0-9]*", TAG+="seat", TAG+="master-of-seat"
+ SUBSYSTEM=="usb", ATTR{bDeviceClass}=="09", TAG+="seat"
+
+ # 'Plugable' USB hub, sound, network, graphics adapter
diff --git a/0048-logind-Save-the-user-s-state-when-a-session-enters-S.patch b/0048-logind-Save-the-user-s-state-when-a-session-enters-S.patch
new file mode 100644
index 0000000..8c2db73
--- /dev/null
+++ b/0048-logind-Save-the-user-s-state-when-a-session-enters-S.patch
@@ -0,0 +1,44 @@
+From a3f788f9a2f5263fd91b5fbd2fce87af9dceca68 Mon Sep 17 00:00:00 2001
+From: Philip Withnall <philip.withnall at collabora.co.uk>
+Date: Tue, 2 Jun 2015 14:17:10 +0100
+Subject: [PATCH] =?UTF-8?q?logind:=20Save=20the=20user=E2=80=99s=20state?=
+ =?UTF-8?q?=20when=20a=20session=20enters=20SESSION=5FACTIVE?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+When (for example) switching from X11 to a new VT and logging in there,
+creating a new session, the user state file (/run/systemd/users/$uid) is
+not updated after the session becomes active. The latest time it is
+saved is when the session is in SESSION_OPENING.
+
+This results in a /run/systemd/users/$uid file which contains
+STATE=online for the current user on the current active VT, which is
+obviously wrong.
+
+As functions like sd_uid_get_state() use this file to get the user’s
+state, this could result in things like PolicyKit making incorrect
+decisions about the user’s state. (See
+https://bugs.freedesktop.org/show_bug.cgi?id=76358.)
+
+Fix this by re-saving the state for a session’s user after completing
+the state_job for that session.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=90818
+(cherry picked from commit 41dfeaa194c18de49706b5cecf4e53accd12b7f6)
+---
+ src/login/logind-dbus.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
+index 3555bcc2f5..47646a81bb 100644
+--- a/src/login/logind-dbus.c
++++ b/src/login/logind-dbus.c
+@@ -2522,6 +2522,7 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
+ session_jobs_reply(session, unit, result);
+
+ session_save(session);
++ user_save(session->user);
+ session_add_to_gc_queue(session);
+ }
+
diff --git a/0049-small-fix-ru-translation.patch b/0049-small-fix-ru-translation.patch
new file mode 100644
index 0000000..ebe962a
--- /dev/null
+++ b/0049-small-fix-ru-translation.patch
@@ -0,0 +1,41 @@
+From f6c1eee14b2c568008f8f43f6c4ee0aebbf2acff Mon Sep 17 00:00:00 2001
+From: kloun <andrey0bolkonsky at gmail.com>
+Date: Thu, 4 Jun 2015 17:56:59 +0300
+Subject: [PATCH] small fix ru translation (cherry picked from commit
+ fcf3f5958e0441c9cc00f035ef6c86c278442366)
+
+---
+ catalog/systemd.ru.catalog | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/catalog/systemd.ru.catalog b/catalog/systemd.ru.catalog
+index f99532469a..03eea04c9f 100644
+--- a/catalog/systemd.ru.catalog
++++ b/catalog/systemd.ru.catalog
+@@ -81,7 +81,7 @@ Documentation: man:core(5)
+ Записан дамп памяти.
+
+ Вероятно, это произошло из-за ошибки, допущенной в коде программы.
+-Рекомендуется сообщить ее разработчикам о возникшей проблеме.
++Рекомендуется сообщить её разработчикам о возникшей проблеме.
+
+ # Subject: A new session @SESSION_ID@ has been created for user @USER_ID@
+ -- 8d45620c1a4348dbb17410da57c60c66
+@@ -146,7 +146,7 @@ Defined-By: systemd
+ Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
+
+ Все системные службы, запуск которых предписан настройками, были запущены.
+-Впрочем, это еще не означает, что система в данный момент ничем не занята,
++Впрочем, это ещё не означает, что система в данный момент ничем не занята,
+ так как некоторые службы могут продолжать инициализацию даже после того, как
+ отчитались о своем запуске.
+
+@@ -274,7 +274,7 @@ Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
+ столбце файла /etc/fstab, либо в параметре Where= файла конфигурации юнита),
+ не является пустым. Это никак не мешает монтированию, однако ранее находившиеся
+ в нем файлы будут недоступны. Чтобы получить к ним доступ, вы можете вручную
+-перемонтировать нижележащую файловую систему в другую точку.
++перемонтировать эту файловую систему в другую точку.
+
+ # Subject: A virtual machine or container has been started
+ -- 24d8d4452573402496068381a6312df2
diff --git a/0050-core-mount-skip-incomplete-mountinfo-entries.patch b/0050-core-mount-skip-incomplete-mountinfo-entries.patch
new file mode 100644
index 0000000..3de48c3
--- /dev/null
+++ b/0050-core-mount-skip-incomplete-mountinfo-entries.patch
@@ -0,0 +1,28 @@
+From 424873fd1c78edd597a02cbf4a402450369b0905 Mon Sep 17 00:00:00 2001
+From: Daniel Mack <daniel at zonque.org>
+Date: Thu, 4 Jun 2015 15:39:49 +0200
+Subject: [PATCH] core/mount: skip incomplete mountinfo entries
+
+Skip /proc/mountinfo entries for which libmount returns a NULL pointer
+for 'source' or 'target'. This happened on Semaphore CI's build servers
+when the test suite is run.
+
+(cherry picked from commit c0a7f8d3cb757cf750fc6788df0d215f6457c09d)
+---
+ src/core/mount.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/core/mount.c b/src/core/mount.c
+index ba1dcf1e85..851b41351e 100644
+--- a/src/core/mount.c
++++ b/src/core/mount.c
+@@ -1522,6 +1522,9 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
+ options = mnt_fs_get_options(fs);
+ fstype = mnt_fs_get_fstype(fs);
+
++ if (!device || !path)
++ continue;
++
+ if (cunescape(device, UNESCAPE_RELAX, &d) < 0)
+ return log_oom();
+
diff --git a/0051-fstab-generator-cescape-device-name-in-root-fsck-ser.patch b/0051-fstab-generator-cescape-device-name-in-root-fsck-ser.patch
new file mode 100644
index 0000000..3ce91d2
--- /dev/null
+++ b/0051-fstab-generator-cescape-device-name-in-root-fsck-ser.patch
@@ -0,0 +1,49 @@
+From 413b9df4a84291dfeb28133f4b30790b7ad9f903 Mon Sep 17 00:00:00 2001
+From: Andrei Borzenkov <arvidjaar at gmail.com>
+Date: Wed, 3 Jun 2015 20:50:59 +0300
+Subject: [PATCH] fstab-generator: cescape device name in root-fsck service
+
+We unescape ExecStart line when parsing it, so escape device name
+before adding it to unit file.
+
+fixes #50
+
+(cherry picked from commit fa05e97257fc54b05e4c272dfc19cea46511b823)
+---
+ src/shared/generator.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/src/shared/generator.c b/src/shared/generator.c
+index 807569a1b8..e58bbea77c 100644
+--- a/src/shared/generator.c
++++ b/src/shared/generator.c
+@@ -34,9 +34,14 @@
+ static int write_fsck_sysroot_service(const char *dir, const char *what) {
+ const char *unit;
+ _cleanup_free_ char *device = NULL;
++ _cleanup_free_ char *escaped;
+ _cleanup_fclose_ FILE *f = NULL;
+ int r;
+
++ escaped = cescape(what);
++ if (!escaped)
++ return log_oom();
++
+ unit = strjoina(dir, "/systemd-fsck-root.service");
+ log_debug("Creating %s", unit);
+
+@@ -61,11 +66,12 @@ static int write_fsck_sysroot_service(const char *dir, const char *what) {
+ "[Service]\n"
+ "Type=oneshot\n"
+ "RemainAfterExit=yes\n"
+- "ExecStart=" SYSTEMD_FSCK_PATH " %2$s\n"
++ "ExecStart=" SYSTEMD_FSCK_PATH " %4$s\n"
+ "TimeoutSec=0\n",
+ program_invocation_short_name,
+ what,
+- device);
++ device,
++ escaped);
+
+ r = fflush_and_check(f);
+ if (r < 0)
diff --git a/0052-logind-Fix-user_elect_display-to-be-more-stable.patch b/0052-logind-Fix-user_elect_display-to-be-more-stable.patch
new file mode 100644
index 0000000..bcc851f
--- /dev/null
+++ b/0052-logind-Fix-user_elect_display-to-be-more-stable.patch
@@ -0,0 +1,150 @@
+From 75aad3b101548151905d528269ffd2a388955193 Mon Sep 17 00:00:00 2001
+From: Philip Withnall <philip.withnall at collabora.co.uk>
+Date: Fri, 29 May 2015 10:49:21 +0100
+Subject: [PATCH] logind: Fix user_elect_display() to be more stable
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The previous implementation of user_elect_display() could easily end up
+overwriting the user’s valid graphical session with a new TTY session.
+For example, consider the situation where there is one session:
+ c1, type = SESSION_X11, !stopping, class = SESSION_USER
+it is initially elected as the user’s display (i.e. u->display = c1).
+
+If another session is started, on a different VT, the sessions_by_user
+list becomes:
+ c1, type = SESSION_X11, !stopping, class = SESSION_USER
+ c2, type = SESSION_TTY, !stopping, class = SESSION_USER
+
+In the previous code, graphical = c1 and text = c2, as expected.
+However, neither graphical nor text fulfil the conditions for setting
+u->display = graphical (because neither is better than u->display), so
+the code falls through to check the text variable. The conditions for
+this match, as u->display->type != SESSION_TTY (it’s actually
+SESSION_X11). Hence u->display is set to c2, which is incorrect, because
+session c1 is still valid.
+
+Refactor user_elect_display() to use a more explicit filter and
+pre-order comparison over the sessions. This can be demonstrated to be
+stable and only ever ‘upgrade’ the session to a more graphical one.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=90769
+(cherry picked from commit 7ffeb45cc63e1326690fd9461b7a4719a3d4f85c)
+---
+ src/login/logind-user.c | 90 +++++++++++++++++++++++++++++--------------------
+ 1 file changed, 54 insertions(+), 36 deletions(-)
+
+diff --git a/src/login/logind-user.c b/src/login/logind-user.c
+index 71bff96728..2f62e34f63 100644
+--- a/src/login/logind-user.c
++++ b/src/login/logind-user.c
+@@ -738,54 +738,72 @@ int user_kill(User *u, int signo) {
+ return manager_kill_unit(u->manager, u->slice, KILL_ALL, signo, NULL);
+ }
+
++static bool
++elect_display_filter(Session *s) {
++ /* Return true if the session is a candidate for the user’s ‘primary
++ * session’ or ‘display’. */
++ assert(s);
++
++ return (s->class == SESSION_USER && !s->stopping);
++}
++
++static int
++elect_display_compare(Session *s1, Session *s2) {
++ /* Indexed by SessionType. Lower numbers mean more preferred. */
++ const int type_ranks[_SESSION_TYPE_MAX] = {
++ [SESSION_UNSPECIFIED] = 0,
++ [SESSION_TTY] = -2,
++ [SESSION_X11] = -3,
++ [SESSION_WAYLAND] = -3,
++ [SESSION_MIR] = -3,
++ [SESSION_WEB] = -1,
++ };
++
++ /* Calculate the partial order relationship between s1 and s2,
++ * returning < 0 if s1 is preferred as the user’s ‘primary session’,
++ * 0 if s1 and s2 are equally preferred or incomparable, or > 0 if s2
++ * is preferred.
++ *
++ * s1 or s2 may be NULL. */
++ if ((s1 == NULL) != (s2 == NULL))
++ return (s1 == NULL) - (s2 == NULL);
++
++ if (s1->stopping != s2->stopping)
++ return s1->stopping - s2->stopping;
++
++ if ((s1->class != SESSION_USER) != (s2->class != SESSION_USER))
++ return (s1->class != SESSION_USER) - (s2->class != SESSION_USER);
++
++ if ((s1->type == _SESSION_TYPE_INVALID) != (s2->type == _SESSION_TYPE_INVALID))
++ return (s1->type == _SESSION_TYPE_INVALID) - (s2->type == _SESSION_TYPE_INVALID);
++
++ if (s1->type != s2->type)
++ return type_ranks[s1->type] - type_ranks[s2->type];
++
++ return 0;
++}
++
+ void user_elect_display(User *u) {
+- Session *graphical = NULL, *text = NULL, *other = NULL, *s;
++ Session *s;
+
+ assert(u);
+
+ /* This elects a primary session for each user, which we call
+ * the "display". We try to keep the assignment stable, but we
+ * "upgrade" to better choices. */
++ log_debug("Electing new display for user %s", u->name);
+
+ LIST_FOREACH(sessions_by_user, s, u->sessions) {
+-
+- if (s->class != SESSION_USER)
+- continue;
+-
+- if (s->stopping)
++ if (!elect_display_filter(s)) {
++ log_debug("Ignoring session %s", s->id);
+ continue;
++ }
+
+- if (SESSION_TYPE_IS_GRAPHICAL(s->type))
+- graphical = s;
+- else if (s->type == SESSION_TTY)
+- text = s;
+- else
+- other = s;
+- }
+-
+- if (graphical &&
+- (!u->display ||
+- u->display->class != SESSION_USER ||
+- u->display->stopping ||
+- !SESSION_TYPE_IS_GRAPHICAL(u->display->type))) {
+- u->display = graphical;
+- return;
+- }
+-
+- if (text &&
+- (!u->display ||
+- u->display->class != SESSION_USER ||
+- u->display->stopping ||
+- u->display->type != SESSION_TTY)) {
+- u->display = text;
+- return;
++ if (elect_display_compare(s, u->display) < 0) {
++ log_debug("Choosing session %s in preference to %s", s->id, u->display ? u->display->id : "-");
++ u->display = s;
++ }
+ }
+-
+- if (other &&
+- (!u->display ||
+- u->display->class != SESSION_USER ||
+- u->display->stopping))
+- u->display = other;
+ }
+
+ static const char* const user_state_table[_USER_STATE_MAX] = {
diff --git a/0053-systemd-bootchart-Trivial-typo-fix-in-warning.patch b/0053-systemd-bootchart-Trivial-typo-fix-in-warning.patch
new file mode 100644
index 0000000..3dd6685
--- /dev/null
+++ b/0053-systemd-bootchart-Trivial-typo-fix-in-warning.patch
@@ -0,0 +1,24 @@
+From dde6312a37a8560dbb923ddf450a101b6ebe4966 Mon Sep 17 00:00:00 2001
+From: Gianpaolo Macario <gmacario at gmail.com>
+Date: Fri, 5 Jun 2015 18:42:36 +0200
+Subject: [PATCH] systemd-bootchart: Trivial typo fix in warning
+
+Signed-off-by: Gianpaolo Macario <gmacario at gmail.com>
+(cherry picked from commit 6aec8359b04ca4aac18f73184cc6a3daec9a3271)
+---
+ src/bootchart/bootchart.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
+index 45fab92598..3360bc85be 100644
+--- a/src/bootchart/bootchart.c
++++ b/src/bootchart/bootchart.c
+@@ -531,7 +531,7 @@ int main(int argc, char *argv[]) {
+
+ /* don't complain when overrun once, happens most commonly on 1st sample */
+ if (overrun > 1)
+- log_warning("systemd-boochart: sample time overrun %i times\n", overrun);
++ log_warning("systemd-bootchart: sample time overrun %i times\n", overrun);
+
+ return 0;
+ }
diff --git a/0054-man-systemd.link-explain-random-MAC-addresses.patch b/0054-man-systemd.link-explain-random-MAC-addresses.patch
new file mode 100644
index 0000000..a00a1fc
--- /dev/null
+++ b/0054-man-systemd.link-explain-random-MAC-addresses.patch
@@ -0,0 +1,28 @@
+From 928b84917139e42611ea1b71ab8b35bf20d2627b Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Mon, 8 Jun 2015 22:30:59 +0200
+Subject: [PATCH] man: systemd.link - explain random MAC addresses
+
+Two of the bits in the MAC address are set unconditioanlly, and the rest is randomized,
+make this clear in the documentation (as it currently read as if it was all random).
+
+(cherry picked from commit 2e229e0c4c29e8a827be9ffe361741cf5e9aa7af)
+---
+ man/systemd.link.xml | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/man/systemd.link.xml b/man/systemd.link.xml
+index 3fac760b01..d9b1879c59 100644
+--- a/man/systemd.link.xml
++++ b/man/systemd.link.xml
+@@ -229,7 +229,9 @@
+ <para>If the kernel is using a random MAC address,
+ nothing is done. Otherwise, a new address is randomly
+ generated each time the device appears, typically at
+- boot.</para>
++ boot. Either way the random address will have the
++ <literal>unicast</literal> and
++ <literal>locally administered</literal> bits set.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
diff --git a/0055-rules-whitelist-xvd-devices.patch b/0055-rules-whitelist-xvd-devices.patch
new file mode 100644
index 0000000..d8b0534
--- /dev/null
+++ b/0055-rules-whitelist-xvd-devices.patch
@@ -0,0 +1,36 @@
+From 1499fac10a20159ec9f57734fa3f9e72a25cb19c Mon Sep 17 00:00:00 2001
+From: Alex Crawford <alex.crawford at coreos.com>
+Date: Thu, 4 Jun 2015 15:54:35 -0700
+Subject: [PATCH] rules: whitelist xvd* devices
+
+Xen disks need to be whitelisted as well.
+
+(cherry picked from commit bb5c512de22eeb7464f120a01fd1d59e7a4bbb7b)
+---
+ rules/60-block.rules | 2 +-
+ rules/60-persistent-storage.rules | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/rules/60-block.rules b/rules/60-block.rules
+index a69d648023..c74caca49f 100644
+--- a/rules/60-block.rules
++++ b/rules/60-block.rules
+@@ -8,4 +8,4 @@ ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_
+ ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
+
+ # watch metadata changes, caused by tools closing the device node which was opened for writing
+-ACTION!="remove", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*", OPTIONS+="watch"
++ACTION!="remove", SUBSYSTEM=="block", KERNEL=="loop*|nvme*|sd*|vd*|xvd*", OPTIONS+="watch"
+diff --git a/rules/60-persistent-storage.rules b/rules/60-persistent-storage.rules
+index 64c5f1cfdd..2daeb6db42 100644
+--- a/rules/60-persistent-storage.rules
++++ b/rules/60-persistent-storage.rules
+@@ -6,7 +6,7 @@
+ ACTION=="remove", GOTO="persistent_storage_end"
+
+ SUBSYSTEM!="block", GOTO="persistent_storage_end"
+-KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|bcache*|xvd*", GOTO="persistent_storage_end"
++KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|xvd*|bcache*", GOTO="persistent_storage_end"
+
+ # ignore partitions that span the entire disk
+ TEST=="whole_disk", GOTO="persistent_storage_end"
diff --git a/0056-cryptsetup-craft-a-unique-ID-with-the-source-device.patch b/0056-cryptsetup-craft-a-unique-ID-with-the-source-device.patch
new file mode 100644
index 0000000..972b7bb
--- /dev/null
+++ b/0056-cryptsetup-craft-a-unique-ID-with-the-source-device.patch
@@ -0,0 +1,165 @@
+From 3357627f3380e680cbaaaddb9ecf4cd2872d46dd Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Mon, 1 Jun 2015 17:26:27 +0200
+Subject: [PATCH] cryptsetup: craft a unique ID with the source device
+
+If cryptsetup is called with a source device as argv[3], then craft the
+ID for the password agent with a unique device path.
+
+If possible "/dev/block/<maj>:<min>" is used, otherwise the original
+argv[3] is used.
+
+This enables password agents like petera [1] to provide a password
+according to the source device. The original ID did not carry enough
+information and was more targeted for a human readable string, which
+is specified in the "Message" field anyway.
+
+With this patch the ID of the ask.XXX ini file looks like this:
+ID=cryptsetup:/dev/block/<maj>:<min>
+
+[1] https://github.com/npmccallum/petera
+
+(cherry picked from commit e51b9486d1b59e72c293028fed1384f4e4ef09aa)
+---
+ src/cryptsetup/cryptsetup.c | 90 +++++++++++++++++++++++++++++----------------
+ 1 file changed, 58 insertions(+), 32 deletions(-)
+
+diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c
+index a5018f13ed..5c6c7c0ed8 100644
+--- a/src/cryptsetup/cryptsetup.c
++++ b/src/cryptsetup/cryptsetup.c
+@@ -238,6 +238,23 @@ static void log_glue(int level, const char *msg, void *usrptr) {
+ log_debug("%s", msg);
+ }
+
++static int disk_major_minor(const char *path, char **ret) {
++ struct stat st;
++
++ assert(path);
++
++ if (stat(path, &st) < 0)
++ return -errno;
++
++ if (!S_ISBLK(st.st_mode))
++ return -EINVAL;
++
++ if (asprintf(ret, "/dev/block/%d:%d", major(st.st_rdev), minor(st.st_rdev)) < 0)
++ return -errno;
++
++ return 0;
++}
++
+ static char* disk_description(const char *path) {
+
+ static const char name_fields[] =
+@@ -295,20 +312,55 @@ static char *disk_mount_point(const char *label) {
+ return NULL;
+ }
+
+-static int get_password(const char *name, usec_t until, bool accept_cached, char ***passwords) {
+- int r;
++static int get_password(const char *vol, const char *src, usec_t until, bool accept_cached, char ***passwords) {
++ int r = 0;
+ char **p;
+ _cleanup_free_ char *text = NULL;
+ _cleanup_free_ char *escaped_name = NULL;
+ char *id;
++ const char *name = NULL;
++ _cleanup_free_ char *description = NULL, *name_buffer = NULL,
++ *mount_point = NULL, *maj_min = NULL;
+
+- assert(name);
++ assert(vol);
++ assert(src);
+ assert(passwords);
+
++ description = disk_description(src);
++ mount_point = disk_mount_point(vol);
++
++ if (description && streq(vol, description)) {
++ /* If the description string is simply the
++ * volume name, then let's not show this
++ * twice */
++ free(description);
++ description = NULL;
++ }
++
++ if (mount_point && description)
++ r = asprintf(&name_buffer, "%s (%s) on %s", description, vol, mount_point);
++ else if (mount_point)
++ r = asprintf(&name_buffer, "%s on %s", vol, mount_point);
++ else if (description)
++ r = asprintf(&name_buffer, "%s (%s)", description, vol);
++
++ if (r < 0)
++ return log_oom();
++
++ name = name_buffer ? name_buffer : vol;
++
+ if (asprintf(&text, "Please enter passphrase for disk %s!", name) < 0)
+ return log_oom();
+
+- escaped_name = cescape(name);
++ if (src)
++ (void) disk_major_minor(src, &maj_min);
++
++ if (maj_min) {
++ escaped_name = maj_min;
++ maj_min = NULL;
++ } else
++ escaped_name = cescape(name);
++
+ if (!escaped_name)
+ return log_oom();
+
+@@ -552,8 +604,7 @@ int main(int argc, char *argv[]) {
+ unsigned tries;
+ usec_t until;
+ crypt_status_info status;
+- const char *key_file = NULL, *name = NULL;
+- _cleanup_free_ char *description = NULL, *name_buffer = NULL, *mount_point = NULL;
++ const char *key_file = NULL;
+
+ /* Arguments: systemd-cryptsetup attach VOLUME SOURCE-DEVICE [PASSWORD] [OPTIONS] */
+
+@@ -581,31 +632,6 @@ int main(int argc, char *argv[]) {
+ /* A delicious drop of snake oil */
+ mlockall(MCL_FUTURE);
+
+- description = disk_description(argv[3]);
+- mount_point = disk_mount_point(argv[2]);
+-
+- if (description && streq(argv[2], description)) {
+- /* If the description string is simply the
+- * volume name, then let's not show this
+- * twice */
+- free(description);
+- description = NULL;
+- }
+-
+- k = 0;
+- if (mount_point && description)
+- k = asprintf(&name_buffer, "%s (%s) on %s", description, argv[2], mount_point);
+- else if (mount_point)
+- k = asprintf(&name_buffer, "%s on %s", argv[2], mount_point);
+- else if (description)
+- k = asprintf(&name_buffer, "%s (%s)", description, argv[2]);
+-
+- if (k < 0) {
+- log_oom();
+- goto finish;
+- }
+- name = name_buffer ? name_buffer : argv[2];
+-
+ if (arg_header) {
+ log_debug("LUKS header: %s", arg_header);
+ k = crypt_init(&cd, arg_header);
+@@ -652,7 +678,7 @@ int main(int argc, char *argv[]) {
+ _cleanup_strv_free_ char **passwords = NULL;
+
+ if (!key_file) {
+- k = get_password(name, until, tries == 0 && !arg_verify, &passwords);
++ k = get_password(argv[2], argv[3], until, tries == 0 && !arg_verify, &passwords);
+ if (k == -EAGAIN)
+ continue;
+ else if (k < 0)
diff --git a/0057-util-bind_remount_recursive-handle-return-0-of-set_c.patch b/0057-util-bind_remount_recursive-handle-return-0-of-set_c.patch
new file mode 100644
index 0000000..2c1f846
--- /dev/null
+++ b/0057-util-bind_remount_recursive-handle-return-0-of-set_c.patch
@@ -0,0 +1,27 @@
+From 6b63caf7d6bdded413985906276d023cfb623905 Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Tue, 9 Jun 2015 10:32:28 +0200
+Subject: [PATCH] util:bind_remount_recursive(): handle return 0 of
+ set_consume()
+
+set_consume() does not return -EEXIST, but 0, in case the key is already
+in the Set.
+
+(cherry picked from commit 85d834ae8e7d9e2c28ef8c1388e2913ed8fd0e3b)
+---
+ src/shared/util.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/shared/util.c b/src/shared/util.c
+index 57782ba687..26eec38ea6 100644
+--- a/src/shared/util.c
++++ b/src/shared/util.c
+@@ -5135,7 +5135,7 @@ int bind_remount_recursive(const char *prefix, bool ro) {
+ while ((x = set_steal_first(todo))) {
+
+ r = set_consume(done, x);
+- if (r == -EEXIST)
++ if (r == -EEXIST || r == 0)
+ continue;
+ if (r < 0)
+ return r;
diff --git a/0058-hwdb-add-Logitech-TrackMan-Marble-Wheel-USB.patch b/0058-hwdb-add-Logitech-TrackMan-Marble-Wheel-USB.patch
new file mode 100644
index 0000000..37bddad
--- /dev/null
+++ b/0058-hwdb-add-Logitech-TrackMan-Marble-Wheel-USB.patch
@@ -0,0 +1,26 @@
+From f66d0986462f8d3fe321dc20f6bd9904fc1e6a99 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at who-t.net>
+Date: Tue, 9 Jun 2015 14:32:19 +1000
+Subject: [PATCH] hwdb: add Logitech TrackMan Marble Wheel USB
+
+DPI is guesswork, no specs found on the web and calculating DPIs on a
+trackball is tedious.
+
+(cherry picked from commit 5967bda0bc9849bceeda393e3cd2ab04f2f25a03)
+---
+ hwdb/70-mouse.hwdb | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/hwdb/70-mouse.hwdb b/hwdb/70-mouse.hwdb
+index 2784b941a1..cfe3579fcd 100644
+--- a/hwdb/70-mouse.hwdb
++++ b/hwdb/70-mouse.hwdb
+@@ -169,6 +169,8 @@ mouse:usb:v046dpc00e:name:Logitech USB-PS/2 Optical Mouse:
+ mouse:usb:v046dpc01b:name:Logitech USB-PS/2 Optical Mouse:
+ # Logitech USB-PS/2 M-BT58
+ mouse:usb:v046dpc03e:name:Logitech USB-PS/2 Optical Mouse:
++# Logitech TrackMan Marble Wheel USB
++mouse:usb:v046dpc401:name:Logitech USB-PS/2 Trackball:
+ MOUSE_DPI=400 at 125
+
+ # Lenovo USB mouse model MO28UOL
diff --git a/0059-hwdb-update-Logitech-s-unifying-receiver-devices.patch b/0059-hwdb-update-Logitech-s-unifying-receiver-devices.patch
new file mode 100644
index 0000000..d5c037b
--- /dev/null
+++ b/0059-hwdb-update-Logitech-s-unifying-receiver-devices.patch
@@ -0,0 +1,59 @@
+From 47211575a9ee7ed50e184bccbf8f3e0ed3c1075f Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at who-t.net>
+Date: Wed, 10 Jun 2015 13:53:51 +1000
+Subject: [PATCH] hwdb: update Logitech's unifying receiver devices
+
+Since 3.19, the devices have the proper vid/pid and the model number in the
+name.
+
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+(cherry picked from commit 7a37956eac10c727f562ddcce00d1179d22a67f9)
+---
+ hwdb/70-mouse.hwdb | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/hwdb/70-mouse.hwdb b/hwdb/70-mouse.hwdb
+index cfe3579fcd..6c77b74e53 100644
+--- a/hwdb/70-mouse.hwdb
++++ b/hwdb/70-mouse.hwdb
+@@ -182,6 +182,7 @@ mouse:usb:v046dpc045:name:Logitech USB-PS/2 Optical Mouse:
+ MOUSE_DPI=600 at 125
+
+ # Logitech Wireless Mouse M325
++mouse:usb:v046dp400a:name:Logitech M325:
+ mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:400a:
+ MOUSE_DPI=600 at 166
+ MOUSE_WHEEL_CLICK_ANGLE=20
+@@ -215,8 +216,10 @@ mouse:usb:v046dp1028:name:Logitech M570:
+ MOUSE_DPI=540 at 167
+
+ # Logitech Wireless Mouse M185
++mouse:usb:v046dp4008:name:Logitech M185:
+ mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4008:
+ # Logitech M705 (marathon mouse)
++mouse:usb:v046dp101b:name:Logitech M705:
+ mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:101b:
+ MOUSE_DPI=800 at 166
+
+@@ -227,6 +230,8 @@ mouse:usb:v046dpc24e:name:Logitech G500s Laser Gaming Mouse:
+ MOUSE_DPI=400 at 500 *800 at 500 2000 at 500
+
+ # Logitech B605 Wireless Mouse (also M505)
++mouse:usb:v046dp101d:name:Logitech B605:
++mouse:usb:v046dp101d:name:Logitech M505:
+ mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:101d:
+ MOUSE_DPI=900 at 166
+
+@@ -255,10 +260,12 @@ mouse:usb:v046dpc069:name:Logitech USB Laser Mouse:
+ MOUSE_DPI=1200 at 125
+
+ # Logitech T620 (or, the soap)
++mouse:usb:v046dp4027:name:Logitech T620:
+ mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4027:
+ MOUSE_DPI=1200 at 250
+
+ # Logitech ZoneTouch Mouse T400
++mouse:usb:v046dp4026:name:Logitech T400:
+ mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4026:
+ MOUSE_DPI=1300 at 166
+
diff --git a/0060-keymap-Add-Samsung-NP350V-and-NP670Z.patch b/0060-keymap-Add-Samsung-NP350V-and-NP670Z.patch
new file mode 100644
index 0000000..7ecdd3c
--- /dev/null
+++ b/0060-keymap-Add-Samsung-NP350V-and-NP670Z.patch
@@ -0,0 +1,26 @@
+From d9b766a4343cf07a0b4e4ab13401f4aec6e2eece Mon Sep 17 00:00:00 2001
+From: dslul <laudanidaniele at gmail.com>
+Date: Wed, 10 Jun 2015 12:18:22 +0200
+Subject: [PATCH] keymap: Add Samsung NP350V and NP670Z
+
+typo
+
+keymap: Add Samsung NP350V and NP670Z
+(cherry picked from commit ff48c774236967273732a7ee154b4b8e834b4409)
+---
+ hwdb/60-keyboard.hwdb | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/hwdb/60-keyboard.hwdb b/hwdb/60-keyboard.hwdb
+index 9c7e553a41..007c6a809e 100644
+--- a/hwdb/60-keyboard.hwdb
++++ b/hwdb/60-keyboard.hwdb
+@@ -980,6 +980,8 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*550P*:pvr*
+ KEYBOARD_KEY_a9=! # Fn Lock - Function lock off
+
+ # Series 7 / 9
++evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*350V*:pvr*
++evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*670Z*:pvr*
+ evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*700Z*:pvr*
+ evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*700G*:pvr*
+ evdev:atkbd:dmi:bvn*:bvr*:bd*:svn[sS][aA][mM][sS][uU][nN][gG]*:pn*900X[34]*:pvr*
diff --git a/0061-sd-bus-fix-early-exit-when-we-lack-all-data-in-bus_g.patch b/0061-sd-bus-fix-early-exit-when-we-lack-all-data-in-bus_g.patch
new file mode 100644
index 0000000..a3303dc
--- /dev/null
+++ b/0061-sd-bus-fix-early-exit-when-we-lack-all-data-in-bus_g.patch
@@ -0,0 +1,24 @@
+From 643f845bf882489eeddeeb4d9115b07b39198693 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 10 Jun 2015 15:51:40 +0200
+Subject: [PATCH] sd-bus: fix early exit when we lack all data in
+ bus_get_owner_creds_dbus1()
+
+(cherry picked from commit 3c42e8b281b092b4d10f24c80e21d69b0f232b96)
+---
+ src/libsystemd/sd-bus/bus-control.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c
+index 43ddfc651d..b4ca177f76 100644
+--- a/src/libsystemd/sd-bus/bus-control.c
++++ b/src/libsystemd/sd-bus/bus-control.c
+@@ -980,7 +980,7 @@ static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds **
+ pid_t pid = 0;
+ int r;
+
+- if (!bus->ucred_valid && !isempty(bus->label))
++ if (!bus->ucred_valid && isempty(bus->label))
+ return -ENODATA;
+
+ c = bus_creds_new();
diff --git a/0062-sd-bus-remove-ucred-parameter-from-bus_message_from_.patch b/0062-sd-bus-remove-ucred-parameter-from-bus_message_from_.patch
new file mode 100644
index 0000000..f89a851
--- /dev/null
+++ b/0062-sd-bus-remove-ucred-parameter-from-bus_message_from_.patch
@@ -0,0 +1,139 @@
+From 467d26a957ddb9d493a443618edc1ecd78eef15c Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 10 Jun 2015 15:52:14 +0200
+Subject: [PATCH] sd-bus: remove ucred parameter from bus_message_from_header()
+ since we don't use it anymore
+
+(cherry picked from commit aa0d0ed6b87d41367fd6c4401472df7d45dd1b13)
+---
+ src/libsystemd/sd-bus/bus-kernel.c | 1 -
+ src/libsystemd/sd-bus/bus-message.c | 21 +--------------------
+ src/libsystemd/sd-bus/bus-message.h | 2 --
+ src/libsystemd/sd-bus/bus-socket.c | 1 -
+ src/libsystemd/sd-bus/test-bus-gvariant.c | 2 +-
+ src/libsystemd/sd-bus/test-bus-marshal.c | 2 +-
+ 6 files changed, 3 insertions(+), 26 deletions(-)
+
+diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c
+index d5cc8100ce..b87dba7c43 100644
+--- a/src/libsystemd/sd-bus/bus-kernel.c
++++ b/src/libsystemd/sd-bus/bus-kernel.c
+@@ -498,7 +498,6 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
+ footer, footer_size,
+ n_bytes,
+ fds, n_fds,
+- NULL,
+ seclabel, 0, &m);
+ if (r < 0)
+ return r;
+diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c
+index 6ee209dd1b..c38b2a5fa5 100644
+--- a/src/libsystemd/sd-bus/bus-message.c
++++ b/src/libsystemd/sd-bus/bus-message.c
+@@ -435,7 +435,6 @@ int bus_message_from_header(
+ size_t message_size,
+ int *fds,
+ unsigned n_fds,
+- const struct ucred *ucred,
+ const char *label,
+ size_t extra,
+ sd_bus_message **ret) {
+@@ -528,23 +527,6 @@ int bus_message_from_header(
+ m->fds = fds;
+ m->n_fds = n_fds;
+
+- if (ucred) {
+- m->creds.pid = ucred->pid;
+- m->creds.euid = ucred->uid;
+- m->creds.egid = ucred->gid;
+-
+- /* Due to namespace translations some data might be
+- * missing from this ucred record. */
+- if (m->creds.pid > 0)
+- m->creds.mask |= SD_BUS_CREDS_PID;
+-
+- if (m->creds.euid != UID_INVALID)
+- m->creds.mask |= SD_BUS_CREDS_EUID;
+-
+- if (m->creds.egid != GID_INVALID)
+- m->creds.mask |= SD_BUS_CREDS_EGID;
+- }
+-
+ if (label) {
+ m->creds.label = (char*) m + ALIGN(sizeof(sd_bus_message)) + ALIGN(extra);
+ memcpy(m->creds.label, label, label_sz + 1);
+@@ -565,7 +547,6 @@ int bus_message_from_malloc(
+ size_t length,
+ int *fds,
+ unsigned n_fds,
+- const struct ucred *ucred,
+ const char *label,
+ sd_bus_message **ret) {
+
+@@ -579,7 +560,7 @@ int bus_message_from_malloc(
+ buffer, length,
+ length,
+ fds, n_fds,
+- ucred, label,
++ label,
+ 0, &m);
+ if (r < 0)
+ return r;
+diff --git a/src/libsystemd/sd-bus/bus-message.h b/src/libsystemd/sd-bus/bus-message.h
+index d784e603dd..088d5b1109 100644
+--- a/src/libsystemd/sd-bus/bus-message.h
++++ b/src/libsystemd/sd-bus/bus-message.h
+@@ -205,7 +205,6 @@ int bus_message_from_header(
+ size_t message_size,
+ int *fds,
+ unsigned n_fds,
+- const struct ucred *ucred,
+ const char *label,
+ size_t extra,
+ sd_bus_message **ret);
+@@ -216,7 +215,6 @@ int bus_message_from_malloc(
+ size_t length,
+ int *fds,
+ unsigned n_fds,
+- const struct ucred *ucred,
+ const char *label,
+ sd_bus_message **ret);
+
+diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
+index 881efb176a..e00bd3fc55 100644
+--- a/src/libsystemd/sd-bus/bus-socket.c
++++ b/src/libsystemd/sd-bus/bus-socket.c
+@@ -913,7 +913,6 @@ static int bus_socket_make_message(sd_bus *bus, size_t size) {
+ bus->rbuffer, size,
+ bus->fds, bus->n_fds,
+ NULL,
+- NULL,
+ &t);
+ if (r < 0) {
+ free(b);
+diff --git a/src/libsystemd/sd-bus/test-bus-gvariant.c b/src/libsystemd/sd-bus/test-bus-gvariant.c
+index 992edacb28..22ea00c2fb 100644
+--- a/src/libsystemd/sd-bus/test-bus-gvariant.c
++++ b/src/libsystemd/sd-bus/test-bus-gvariant.c
+@@ -198,7 +198,7 @@ static void test_marshal(void) {
+ }
+ #endif
+
+- assert_se(bus_message_from_malloc(bus, blob, sz, NULL, 0, NULL, NULL, &n) >= 0);
++ assert_se(bus_message_from_malloc(bus, blob, sz, NULL, 0, NULL, &n) >= 0);
+ blob = NULL;
+
+ assert_se(bus_message_dump(n, NULL, BUS_MESSAGE_DUMP_WITH_HEADER) >= 0);
+diff --git a/src/libsystemd/sd-bus/test-bus-marshal.c b/src/libsystemd/sd-bus/test-bus-marshal.c
+index f8ecadf499..a866a56179 100644
+--- a/src/libsystemd/sd-bus/test-bus-marshal.c
++++ b/src/libsystemd/sd-bus/test-bus-marshal.c
+@@ -212,7 +212,7 @@ int main(int argc, char *argv[]) {
+
+ m = sd_bus_message_unref(m);
+
+- r = bus_message_from_malloc(bus, buffer, sz, NULL, 0, NULL, NULL, &m);
++ r = bus_message_from_malloc(bus, buffer, sz, NULL, 0, NULL, &m);
+ assert_se(r >= 0);
+
+ bus_message_dump(m, stdout, BUS_MESSAGE_DUMP_WITH_HEADER);
diff --git a/0063-bus-creds-always-set-SD_BUS_CREDS_PID-when-we-set-pi.patch b/0063-bus-creds-always-set-SD_BUS_CREDS_PID-when-we-set-pi.patch
new file mode 100644
index 0000000..ff1746f
--- /dev/null
+++ b/0063-bus-creds-always-set-SD_BUS_CREDS_PID-when-we-set-pi.patch
@@ -0,0 +1,59 @@
+From 5e6a495495972f748e69d6ec1a8ba2b78aaa7f5a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Sun, 24 May 2015 20:20:06 -0400
+Subject: [PATCH] bus-creds: always set SD_BUS_CREDS_PID when we set pid in the
+ mask
+
+Also reorder the code a bit to be easier to parse.
+
+(cherry picked from commit 236f83afa935d6e07fcd5c17b5db7b1cf424267a)
+---
+ src/core/selinux-access.c | 2 +-
+ src/libsystemd/sd-bus/bus-creds.c | 13 ++++++-------
+ 2 files changed, 7 insertions(+), 8 deletions(-)
+
+diff --git a/src/core/selinux-access.c b/src/core/selinux-access.c
+index 5e9a4a5e02..decd42f95a 100644
+--- a/src/core/selinux-access.c
++++ b/src/core/selinux-access.c
+@@ -261,7 +261,7 @@ int mac_selinux_generic_access_check(
+ audit_info.path = path;
+ audit_info.cmdline = cl;
+
+- r = selinux_check_access((security_context_t) scon, fcon, tclass, permission, &audit_info);
++ r = selinux_check_access(scon, fcon, tclass, permission, &audit_info);
+ if (r < 0)
+ r = sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "SELinux policy denies access.");
+
+diff --git a/src/libsystemd/sd-bus/bus-creds.c b/src/libsystemd/sd-bus/bus-creds.c
+index 4d67619cf8..1c365b7fcd 100644
+--- a/src/libsystemd/sd-bus/bus-creds.c
++++ b/src/libsystemd/sd-bus/bus-creds.c
+@@ -773,11 +773,13 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
+ return 0;
+
+ /* Try to retrieve PID from creds if it wasn't passed to us */
+- if (pid <= 0 && (c->mask & SD_BUS_CREDS_PID))
++ if (pid > 0) {
++ c->pid = pid;
++ c->mask |= SD_BUS_CREDS_PID;
++ } else if (c->mask & SD_BUS_CREDS_PID)
+ pid = c->pid;
+-
+- /* Without pid we cannot do much... */
+- if (pid <= 0)
++ else
++ /* Without pid we cannot do much... */
+ return 0;
+
+ /* Try to retrieve TID from creds if it wasn't passed to us */
+@@ -789,9 +791,6 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
+ if (missing == 0)
+ return 0;
+
+- c->pid = pid;
+- c->mask |= SD_BUS_CREDS_PID;
+-
+ if (tid > 0) {
+ c->tid = tid;
+ c->mask |= SD_BUS_CREDS_TID;
diff --git a/0064-sd-bus-do-not-use-per-datagram-auxiliary-information.patch b/0064-sd-bus-do-not-use-per-datagram-auxiliary-information.patch
new file mode 100644
index 0000000..9c3e715
--- /dev/null
+++ b/0064-sd-bus-do-not-use-per-datagram-auxiliary-information.patch
@@ -0,0 +1,155 @@
+From 81eb1e9e46b569992b265e826ffc0218ee3d99dd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Sat, 6 Jun 2015 18:59:27 -0400
+Subject: [PATCH] sd-bus: do not use per-datagram auxiliary information
+
+SELinux information cannot be retrieved this way, since we are
+using stream unix sockets and SCM_SECURITY does not work for
+them.
+
+SCM_CREDENTIALS use dropped to be consistent. We also should
+get this information at connection time.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1224211
+"SCM_SECURITY was only added for datagram sockets."
+
+(cherry picked from commit d868f2a3a1cc97b1e081b7692e80a1182efccda4)
+---
+ src/libsystemd/sd-bus/bus-socket.c | 80 ++++++--------------------------------
+ 1 file changed, 12 insertions(+), 68 deletions(-)
+
+diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
+index e00bd3fc55..ec4fcfbcd3 100644
+--- a/src/libsystemd/sd-bus/bus-socket.c
++++ b/src/libsystemd/sd-bus/bus-socket.c
+@@ -499,9 +499,7 @@ static int bus_socket_read_auth(sd_bus *b) {
+ void *p;
+ union {
+ struct cmsghdr cmsghdr;
+- uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
+- CMSG_SPACE(sizeof(struct ucred)) +
+- CMSG_SPACE(NAME_MAX)]; /*selinux label */
++ uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
+ } control;
+ struct cmsghdr *cmsg;
+ bool handle_cmsg = false;
+@@ -553,8 +551,8 @@ static int bus_socket_read_auth(sd_bus *b) {
+
+ b->rbuffer_size += k;
+
+- if (handle_cmsg) {
+- for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
++ if (handle_cmsg)
++ for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
+ if (cmsg->cmsg_level == SOL_SOCKET &&
+ cmsg->cmsg_type == SCM_RIGHTS) {
+ int j;
+@@ -565,31 +563,9 @@ static int bus_socket_read_auth(sd_bus *b) {
+ j = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
+ close_many((int*) CMSG_DATA(cmsg), j);
+ return -EIO;
+-
+- } else if (cmsg->cmsg_level == SOL_SOCKET &&
+- cmsg->cmsg_type == SCM_CREDENTIALS &&
+- cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
+-
+- /* Ignore bogus data, which we might
+- * get on socketpair() sockets */
+- if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
+- memcpy(&b->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
+- b->ucred_valid = true;
+- }
+-
+- } else if (cmsg->cmsg_level == SOL_SOCKET &&
+- cmsg->cmsg_type == SCM_SECURITY) {
+-
+- size_t l;
+-
+- l = cmsg->cmsg_len - CMSG_LEN(0);
+- if (l > 0) {
+- memcpy(&b->label, CMSG_DATA(cmsg), l);
+- b->label[l] = 0;
+- }
+- }
+- }
+- }
++ } else
++ log_debug("Got unexpected auxiliary data with level=%d and type=%d",
++ cmsg->cmsg_level, cmsg->cmsg_type);
+
+ r = bus_socket_auth_verify(b);
+ if (r != 0)
+@@ -599,18 +575,8 @@ static int bus_socket_read_auth(sd_bus *b) {
+ }
+
+ void bus_socket_setup(sd_bus *b) {
+- int enable;
+-
+ assert(b);
+
+- /* Enable SO_PASSCRED + SO_PASSEC. We try this on any
+- * socket, just in case. */
+- enable = !b->bus_client;
+- (void) setsockopt(b->input_fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable));
+-
+- enable = !b->bus_client && (b->attach_flags & KDBUS_ATTACH_SECLABEL);
+- (void) setsockopt(b->input_fd, SOL_SOCKET, SO_PASSSEC, &enable, sizeof(enable));
+-
+ /* Increase the buffers to 8 MB */
+ fd_inc_rcvbuf(b->input_fd, SNDBUF_SIZE);
+ fd_inc_sndbuf(b->output_fd, SNDBUF_SIZE);
+@@ -939,9 +905,7 @@ int bus_socket_read_message(sd_bus *bus) {
+ void *b;
+ union {
+ struct cmsghdr cmsghdr;
+- uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
+- CMSG_SPACE(sizeof(struct ucred)) +
+- CMSG_SPACE(NAME_MAX)]; /*selinux label */
++ uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
+ } control;
+ struct cmsghdr *cmsg;
+ bool handle_cmsg = false;
+@@ -988,8 +952,8 @@ int bus_socket_read_message(sd_bus *bus) {
+
+ bus->rbuffer_size += k;
+
+- if (handle_cmsg) {
+- for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
++ if (handle_cmsg)
++ for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
+ if (cmsg->cmsg_level == SOL_SOCKET &&
+ cmsg->cmsg_type == SCM_RIGHTS) {
+ int n, *f;
+@@ -1014,29 +978,9 @@ int bus_socket_read_message(sd_bus *bus) {
+ memcpy(f + bus->n_fds, CMSG_DATA(cmsg), n * sizeof(int));
+ bus->fds = f;
+ bus->n_fds += n;
+- } else if (cmsg->cmsg_level == SOL_SOCKET &&
+- cmsg->cmsg_type == SCM_CREDENTIALS &&
+- cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
+-
+- /* Ignore bogus data, which we might
+- * get on socketpair() sockets */
+- if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
+- memcpy(&bus->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
+- bus->ucred_valid = true;
+- }
+-
+- } else if (cmsg->cmsg_level == SOL_SOCKET &&
+- cmsg->cmsg_type == SCM_SECURITY) {
+-
+- size_t l;
+- l = cmsg->cmsg_len - CMSG_LEN(0);
+- if (l > 0) {
+- memcpy(&bus->label, CMSG_DATA(cmsg), l);
+- bus->label[l] = 0;
+- }
+- }
+- }
+- }
++ } else
++ log_debug("Got unexpected auxiliary data with level=%d and type=%d",
++ cmsg->cmsg_level, cmsg->cmsg_type);
+
+ r = bus_socket_read_message_need(bus, &need);
+ if (r < 0)
diff --git a/0065-sd-bus-store-selinux-context-at-connection-time.patch b/0065-sd-bus-store-selinux-context-at-connection-time.patch
new file mode 100644
index 0000000..e79c88a
--- /dev/null
+++ b/0065-sd-bus-store-selinux-context-at-connection-time.patch
@@ -0,0 +1,95 @@
+From 6829b6250d10c3a6a773374bffc58ec8cc98bc36 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Sat, 6 Jun 2015 21:24:45 -0400
+Subject: [PATCH] sd-bus: store selinux context at connection time
+
+This appears to be the right time to do it for SOCK_STREAM
+unix sockets.
+
+Also: condition bus_get_owner_creds_dbus1 was reversed. Split
+it out to a separate variable for clarity and fix.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1224211
+(cherry picked from commit c4e6556c46cea1b7195cfb81c8cfab8342ebd852)
+
+Conflicts:
+ src/libsystemd/sd-bus/bus-control.c
+---
+ src/libsystemd/sd-bus/bus-control.c | 6 ++++--
+ src/libsystemd/sd-bus/bus-internal.h | 2 +-
+ src/libsystemd/sd-bus/bus-socket.c | 7 +++++++
+ src/libsystemd/sd-bus/sd-bus.c | 1 +
+ 4 files changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c
+index b4ca177f76..1103903358 100644
+--- a/src/libsystemd/sd-bus/bus-control.c
++++ b/src/libsystemd/sd-bus/bus-control.c
+@@ -979,8 +979,10 @@ static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds **
+ _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
+ pid_t pid = 0;
+ int r;
++ bool do_label = bus->label && (mask & SD_BUS_CREDS_SELINUX_CONTEXT);
+
+- if (!bus->ucred_valid && isempty(bus->label))
++ /* Avoid allocating anything if we have no chance of returning useful data */
++ if (!bus->ucred_valid && !do_label)
+ return -ENODATA;
+
+ c = bus_creds_new();
+@@ -1004,7 +1006,7 @@ static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds **
+ }
+ }
+
+- if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
++ if (do_label) {
+ c->label = strdup(bus->label);
+ if (!c->label)
+ return -ENOMEM;
+diff --git a/src/libsystemd/sd-bus/bus-internal.h b/src/libsystemd/sd-bus/bus-internal.h
+index 1351938c80..2ee0eabc02 100644
+--- a/src/libsystemd/sd-bus/bus-internal.h
++++ b/src/libsystemd/sd-bus/bus-internal.h
+@@ -261,7 +261,7 @@ struct sd_bus {
+ usec_t auth_timeout;
+
+ struct ucred ucred;
+- char label[NAME_MAX];
++ char *label;
+
+ uint64_t creds_mask;
+
+diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
+index ec4fcfbcd3..1fde95d2e8 100644
+--- a/src/libsystemd/sd-bus/bus-socket.c
++++ b/src/libsystemd/sd-bus/bus-socket.c
+@@ -587,10 +587,17 @@ void bus_socket_setup(sd_bus *b) {
+ }
+
+ static void bus_get_peercred(sd_bus *b) {
++ int r;
++
+ assert(b);
+
+ /* Get the peer for socketpair() sockets */
+ b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
++
++ /* Get the SELinux context of the peer */
++ r = getpeersec(b->input_fd, &b->label);
++ if (r < 0 && r != -EOPNOTSUPP)
++ log_debug_errno(r, "Failed to determine peer security context: %m");
+ }
+
+ static int bus_socket_start_auth_client(sd_bus *b) {
+diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
+index 214b3d04df..ef0f51be53 100644
+--- a/src/libsystemd/sd-bus/sd-bus.c
++++ b/src/libsystemd/sd-bus/sd-bus.c
+@@ -116,6 +116,7 @@ static void bus_free(sd_bus *b) {
+ if (b->kdbus_buffer)
+ munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
+
++ free(b->label);
+ free(b->rbuffer);
+ free(b->unique_name);
+ free(b->auth_buffer);
diff --git a/0066-journald-simplify-context-handling.patch b/0066-journald-simplify-context-handling.patch
new file mode 100644
index 0000000..1daecd6
--- /dev/null
+++ b/0066-journald-simplify-context-handling.patch
@@ -0,0 +1,85 @@
+From 87bfffb29b2379dfffc799f0b148369b49c0c269 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Sat, 6 Jun 2015 21:36:52 -0400
+Subject: [PATCH] journald: simplify context handling
+
+By using our homegrown function we can dispense with all the iffdefery.
+
+(cherry picked from commit 2de56f70941eaf91a4520bf33de47a87ebd8b2cb)
+---
+ src/journal/journald-stream.c | 32 ++++++++------------------------
+ 1 file changed, 8 insertions(+), 24 deletions(-)
+
+diff --git a/src/journal/journald-stream.c b/src/journal/journald-stream.c
+index b572147a56..db2f581972 100644
+--- a/src/journal/journald-stream.c
++++ b/src/journal/journald-stream.c
+@@ -59,10 +59,7 @@ struct StdoutStream {
+ int fd;
+
+ struct ucred ucred;
+-#ifdef HAVE_SELINUX
+- security_context_t security_context;
+-#endif
+-
++ char *label;
+ char *identifier;
+ char *unit_id;
+ int priority;
+@@ -99,12 +96,7 @@ void stdout_stream_free(StdoutStream *s) {
+ }
+
+ safe_close(s->fd);
+-
+-#ifdef HAVE_SELINUX
+- if (s->security_context)
+- freecon(s->security_context);
+-#endif
+-
++ free(s->label);
+ free(s->identifier);
+ free(s->unit_id);
+ free(s->state_file);
+@@ -225,8 +217,7 @@ static int stdout_stream_log(StdoutStream *s, const char *p) {
+ char syslog_facility[sizeof("SYSLOG_FACILITY=")-1 + DECIMAL_STR_MAX(int) + 1];
+ _cleanup_free_ char *message = NULL, *syslog_identifier = NULL;
+ unsigned n = 0;
+- char *label = NULL;
+- size_t label_len = 0;
++ size_t label_len;
+
+ assert(s);
+ assert(p);
+@@ -271,14 +262,8 @@ static int stdout_stream_log(StdoutStream *s, const char *p) {
+ if (message)
+ IOVEC_SET_STRING(iovec[n++], message);
+
+-#ifdef HAVE_SELINUX
+- if (s->security_context) {
+- label = (char*) s->security_context;
+- label_len = strlen((char*) s->security_context);
+- }
+-#endif
+-
+- server_dispatch_message(s->server, iovec, n, ELEMENTSOF(iovec), &s->ucred, NULL, label, label_len, s->unit_id, priority, 0);
++ label_len = s->label ? strlen(s->label) : 0;
++ server_dispatch_message(s->server, iovec, n, ELEMENTSOF(iovec), &s->ucred, NULL, s->label, label_len, s->unit_id, priority, 0);
+ return 0;
+ }
+
+@@ -489,12 +474,11 @@ static int stdout_stream_install(Server *s, int fd, StdoutStream **ret) {
+ if (r < 0)
+ return log_error_errno(r, "Failed to determine peer credentials: %m");
+
+-#ifdef HAVE_SELINUX
+ if (mac_selinux_use()) {
+- if (getpeercon(fd, &stream->security_context) < 0 && errno != ENOPROTOOPT)
+- log_error_errno(errno, "Failed to determine peer security context: %m");
++ r = getpeersec(fd, &stream->label);
++ if (r < 0 && r != -EOPNOTSUPP)
++ (void) log_warning_errno(r, "Failed to determine peer security context: %m");
+ }
+-#endif
+
+ (void) shutdown(fd, SHUT_WR);
+
diff --git a/0067-Fix-typo.patch b/0067-Fix-typo.patch
new file mode 100644
index 0000000..70be1e0
--- /dev/null
+++ b/0067-Fix-typo.patch
@@ -0,0 +1,25 @@
+From 84dcb29829e6b4ee85682ded36a727b1b3f11918 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Wed, 10 Jun 2015 11:06:00 -0400
+Subject: [PATCH] Fix typo
+
+Follow up for 7c918141ed.
+
+(cherry picked from commit 2fb1105c2bb91c12dd4e66117626da3546afff84)
+---
+ src/run/run.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/run/run.c b/src/run/run.c
+index fcd6b06f7d..d7b1c58455 100644
+--- a/src/run/run.c
++++ b/src/run/run.c
+@@ -67,7 +67,7 @@ static void help(void) {
+ printf("%s [OPTIONS...] {COMMAND} [ARGS...]\n\n"
+ "Run the specified command in a transient scope or service or timer\n"
+ "unit. If timer option is specified and unit is exist which is\n"
+- "specified with --unit option then command can be ommited.\n\n"
++ "specified with --unit option then command can be omited.\n\n"
+ " -h --help Show this help\n"
+ " --version Show package version\n"
+ " --user Run as user unit\n"
diff --git a/systemd.spec b/systemd.spec
index 54f0e9a..43df504 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -38,28 +38,77 @@ Source8: systemd-journal-gatewayd.xml
# Patch series is available from http://cgit.freedesktop.org/systemd/systemd-stable/log/?h=v220-stable
# GIT_DIR=~/src/systemd/.git git format-patch-ab -M -N --no-signature v220..v220-stable
# i=1; for p in 0*patch;do printf "Patch%04d: %s\n" $i $p; ((i++));done
+Patch0001: 0001-NEWS-fix-date.patch
+Patch0002: 0002-udev-net_id-Only-read-the-first-64-bytes-of-PCI-conf.patch
+Patch0003: 0003-bootctl-ferror-must-be-called-before-FILE-is-closed.patch
+Patch0004: 0004-fix-typos-in-systemd-nspawn-man-page.patch
+Patch0005: 0005-bootctl-fix-an-error-check.patch
+Patch0006: 0006-udevd-event-fix-event-queue-in-daemenozied-mode.patch
+Patch0007: 0007-nspawn-be-verbose-about-interface-names.patch
+Patch0008: 0008-shared-generator-correct-path-to-systemd-fsck.patch
+Patch0009: 0009-networkd-fix-IFF_UP-when-ipv6-support-is-disabled.patch
+Patch0010: 0010-import-dkr-avoid-NULL-pointer-dereference.patch
+Patch0011: 0011-treewide-fix-typos.patch
+Patch0012: 0012-logind-unlink-run-nologin-when-shutdown-is-cancelled.patch
+Patch0013: 0013-missing-add-more-IFLA_VXLAN_-defines.patch
+Patch0014: 0014-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch
+Patch0015: 0015-sd-device-fix-device_get_properties_strv.patch
+Patch0016: 0016-man-fix-systemd.resource-control-5-volume-number.patch
+Patch0017: 0017-sd-device-enumerator-fix-matching-on-properties-and-.patch
+Patch0018: 0018-build-sys-fix-typo.patch
+Patch0019: 0019-path-util-Fix-path_is_mount_point-for-files.patch
+Patch0020: 0020-rules-fix-typo-in-block-watch-rule.patch
+Patch0021: 0021-rules-restore-block-watch-after-CHANGE-events.patch
+Patch0022: 0022-zsh-completion-update-bootctl.patch
+Patch0023: 0023-README-fix-typo.patch
+Patch0024: 0024-networkctl-fix-uninitialized-variable.patch
+Patch0025: 0025-conf-parser-parsing-error-logs-should-show-a-type-no.patch
+Patch0026: 0026-core-namespace-Protect-usr-instead-of-home-with-Prot.patch
+Patch0027: 0027-udev-Bring-back-persistant-storage-symlinks-for-bcac.patch
+Patch0028: 0028-sd-device-fix-invalid-property-strv-pointers.patch
+Patch0029: 0029-zsh-completion-fix-typo-in-_bootctl.patch
+Patch0030: 0030-load-fragment-use-UNESCAPE_RELAX-flag-to-parse-exec-.patch
+Patch0031: 0031-test-unit-file-add-test-for-improperly-escaped-exec-.patch
+Patch0032: 0032-Separate-the-sign-from-the-number.patch
+Patch0033: 0033-zsh-completion-fix-completion-of-user-services.patch
+Patch0034: 0034-zsh-completion-a-more-style-tag-aware-_systemctl.patch
+Patch0035: 0035-missing-add-more-btrfs-defines.patch
+Patch0036: 0036-hwdb-Update-database-of-Bluetooth-company-identifier.patch
+Patch0037: 0037-hwdb-update.patch
+Patch0038: 0038-README-update-links-to-reference-new-home-GitHub.patch
+Patch0039: 0039-point-to-github-issues-instead-of-freedesktop-bugzil.patch
+Patch0040: 0040-configure.ac-add-missing-komma.patch
+Patch0041: 0041-util-fix-another-cunescape-regression.patch
+Patch0042: 0042-test-unit-file.c-fixup-the-test-for-commit-3b51f8ddd.patch
+Patch0043: 0043-systemctl-Use-usr-bin-editor-if-available.patch
+Patch0044: 0044-libudev-enumerate-accept-NULL-parameters-in-add_matc.patch
+Patch0045: 0045-Add-dev-xvd-to-60-persistent-storage-whitelist.patch
+Patch0046: 0046-hwdb-add-Apple-MagicMouse-entry.patch
+Patch0047: 0047-logind-Add-a-udev-rule-to-tag-all-DRM-cards-with-mas.patch
+Patch0048: 0048-logind-Save-the-user-s-state-when-a-session-enters-S.patch
+Patch0049: 0049-small-fix-ru-translation.patch
+Patch0050: 0050-core-mount-skip-incomplete-mountinfo-entries.patch
+Patch0051: 0051-fstab-generator-cescape-device-name-in-root-fsck-ser.patch
+Patch0052: 0052-logind-Fix-user_elect_display-to-be-more-stable.patch
+Patch0053: 0053-systemd-bootchart-Trivial-typo-fix-in-warning.patch
+Patch0054: 0054-man-systemd.link-explain-random-MAC-addresses.patch
+Patch0055: 0055-rules-whitelist-xvd-devices.patch
+Patch0056: 0056-cryptsetup-craft-a-unique-ID-with-the-source-device.patch
+Patch0057: 0057-util-bind_remount_recursive-handle-return-0-of-set_c.patch
+Patch0058: 0058-hwdb-add-Logitech-TrackMan-Marble-Wheel-USB.patch
+Patch0059: 0059-hwdb-update-Logitech-s-unifying-receiver-devices.patch
+Patch0060: 0060-keymap-Add-Samsung-NP350V-and-NP670Z.patch
+Patch0061: 0061-sd-bus-fix-early-exit-when-we-lack-all-data-in-bus_g.patch
+Patch0062: 0062-sd-bus-remove-ucred-parameter-from-bus_message_from_.patch
+Patch0063: 0063-bus-creds-always-set-SD_BUS_CREDS_PID-when-we-set-pi.patch
+Patch0064: 0064-sd-bus-do-not-use-per-datagram-auxiliary-information.patch
+Patch0065: 0065-sd-bus-store-selinux-context-at-connection-time.patch
+Patch0066: 0066-journald-simplify-context-handling.patch
+Patch0067: 0067-Fix-typo.patch
# kernel-install patch for grubby, drop if grubby is obsolete
Patch1000: kernel-install-grubby.patch
-# Fix udev --daemon crash:
-# http://comments.gmane.org/gmane.comp.sysutils.systemd.devel/32067
-# This is upstream commit 040e689654ef08.
-Patch1001: 0001-udevd-event-fix-event-queue-in-daemenozied-mode.patch
-
-# Fix udev --daemon not cleaning child processes:
-# https://www.mail-archive.com/systemd-devel@lists.freedesktop.org/msg31806.html
-# https://bugzilla.redhat.com/show_bug.cgi?id=1225641
-# This is upstream commit 86c3bece38bcf5.
-Patch1002: 0001-udevd-fix-SIGCHLD-handling-in-daemon-mode.patch
-
-# Add support for petera disk encryption
-Patch1003: 0004-cryptsetup-craft-a-unique-ID-with-the-source-device.patch
-
-# Fix udev block device watch
-Patch1004: 0005-rules-fix-typo-in-block-watch-rule.patch
-Patch1005: 0006-rules-restore-block-watch-after-CHANGE-events.patch
-
%global num_patches %{lua: c=0; for i,p in ipairs(patches) do c=c+1; end; print(c);}
BuildRequires: libcap-devel
@@ -832,7 +881,14 @@ getent passwd systemd-journal-upload >/dev/null 2>&1 || useradd -r -l -g systemd
%changelog
* Tue Jun 9 2015 Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl> - 220-8
-- Remove gudev
+- Remove gudev which is now provided as separate package (libgudev)
+- Fix for spurious selinux denials (#1224211)
+- Udev change events (#1225905)
+- Patches for some potential crashes
+- ProtectSystem=yes does not touch /home
+- Man page fixes, hwdb updates, shell completion updates
+- Restored persistent device symlinks for bcache, xen block devices
+- Tag all DRM cards as master-of-seat
* Tue Jun 09 2015 Harald Hoyer <harald at redhat.com> 220-7
- fix udev block device watch
--
cgit v0.10.2
http://pkgs.fedoraproject.org/cgit/systemd.git/commit/?h=master&id=436654a8a5b690be43288e46ba4b9acdeff9638b
More information about the scm-commits
mailing list