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