Hello community,

here is the log from the commit of package systemd for openSUSE:Factory checked 
in at 2014-09-17 17:41:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/systemd (Old)
 and      /work/SRC/openSUSE:Factory/.systemd.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "systemd"

Changes:
--------
--- /work/SRC/openSUSE:Factory/systemd/systemd-mini.changes     2014-09-10 
07:28:33.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.systemd.new/systemd-mini.changes        
2014-09-17 17:42:05.000000000 +0200
@@ -1,0 +2,60 @@
+Tue Sep 16 10:45:33 UTC 2014 - [email protected]
+
+- Add upstream patches as real fixes
+  0001-activate-fix-fd-leak-in-do_accept.patch
+  0002-analyze-avoid-a-null-dereference.patch
+  0003-analyze-fix-mem-leak.patch
+  0004-backlight-Avoid-error-when-state-restore-is-disabled.patch
+  0005-bus-avoid-using-m-kdbus-after-freeing-it.patch
+  0006-bus-unref-buscreds-on-failure.patch
+  0007-core-fix-a-potential-mem-leak.patch
+  0008-core-smack-setup-Actually-allow-for-succesfully-load.patch
+  0009-journal-do-not-leak-mmaps-on-OOM.patch
+  0010-manager-use-correct-cleanup-function.patch
+- Intergrate the work of Robert and rename the patch
+  1068-udev-remove-userspace-firmware-loading-support.patch
+  to 1078-udev-remove-userspace-firmware-loading-support.patch
+  Also add patch
+  1079-udev-remove-userspace-firmware-loading-support.patch
+  to apply the same change for opensuse 13.2 and above
+
+-------------------------------------------------------------------
+Tue Sep 16 10:21:02 UTC 2014 - [email protected]
+
+- Add upstream patch
+  0001-systemctl-allow-to-change-the-default-target-without.patch
+  to allow to override default target without --force (bnc#896664)
+
+-------------------------------------------------------------------
+Tue Sep 16 09:10:52 UTC 2014 - [email protected]
+
+- Add upstream patches for udev 
+  1068-udev-net_setup_link-export-the-.link-filename-applie.patch
+  1069-rules-net-setup-link-preserve-ID_NET_LINK_FILE-and-I.patch
+  1070-rules-net-setup-link-remove-stray-linebreak.patch
+  1071-udev-import-the-full-db-on-MOVE-events-for-devices-w.patch
+  1072-udev-netif_rename-don-t-log-to-kmsg.patch
+  1073-udev-drop-print_kmsg.patch
+  1074-udev-fix-copy-paste-error-in-log-message.patch
+  1075-udev-timeout-increase-timeout.patch (bnc#889297)
+  1076-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch (bnc#889297)
+  1077-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch (bnc#889297)
+
+-------------------------------------------------------------------
+Tue Sep 16 07:55:37 UTC 2014 - [email protected]
+
+- udev: remove userspace firmware loading support (bnc#889297).
+  Add 1068-udev-remove-userspace-firmware-loading-support.patch 
+
+-------------------------------------------------------------------
+Sat Sep 13 13:35:33 UTC 2014 - [email protected]
+
+- udev: always resolve correctly database names on 'change' event (bnc#864745).
+  Add 1067-udev-always-resolve-correctly-database-names-on-chan.patch 
+
+-------------------------------------------------------------------
+Tue Sep  9 14:36:20 UTC 2014 - [email protected]
+
+- Add upstream patch 0009-hwdb-update.patch 
+
+-------------------------------------------------------------------
systemd.changes: same change

New:
----
  0001-activate-fix-fd-leak-in-do_accept.patch
  0001-systemctl-allow-to-change-the-default-target-without.patch
  0002-analyze-avoid-a-null-dereference.patch
  0003-analyze-fix-mem-leak.patch
  0004-backlight-Avoid-error-when-state-restore-is-disabled.patch
  0005-bus-avoid-using-m-kdbus-after-freeing-it.patch
  0006-bus-unref-buscreds-on-failure.patch
  0007-core-fix-a-potential-mem-leak.patch
  0008-core-smack-setup-Actually-allow-for-succesfully-load.patch
  0009-hwdb-update.patch
  0009-journal-do-not-leak-mmaps-on-OOM.patch
  0010-manager-use-correct-cleanup-function.patch
  1067-udev-always-resolve-correctly-database-names-on-chan.patch
  1068-udev-net_setup_link-export-the-.link-filename-applie.patch
  1069-rules-net-setup-link-preserve-ID_NET_LINK_FILE-and-I.patch
  1070-rules-net-setup-link-remove-stray-linebreak.patch
  1071-udev-import-the-full-db-on-MOVE-events-for-devices-w.patch
  1072-udev-netif_rename-don-t-log-to-kmsg.patch
  1073-udev-drop-print_kmsg.patch
  1074-udev-fix-copy-paste-error-in-log-message.patch
  1075-udev-timeout-increase-timeout.patch
  1076-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch
  1077-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch
  1078-udev-remove-userspace-firmware-loading-support.patch
  1079-udev-remove-userspace-firmware-loading-support.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ systemd-mini.spec ++++++
--- /var/tmp/diff_new_pack.dhS726/_old  2014-09-17 17:42:11.000000000 +0200
+++ /var/tmp/diff_new_pack.dhS726/_new  2014-09-17 17:42:11.000000000 +0200
@@ -832,6 +832,30 @@
 Patch401:       0001-initrd-parse-etc.service-ignore-return-code-of-daemo.patch
 # PATCH-FIX-UPSTREAM added at 2014/09/08
 Patch402:       0008-hwdb-Update-database-of-Bluetooth-company-identifier.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/09
+Patch403:       0009-hwdb-update.patch
+# PATCH-FIX-UPSTREAM bnc896664: Allow to override default target without 
--force
+Patch404:       0001-systemctl-allow-to-change-the-default-target-without.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch405:       0001-activate-fix-fd-leak-in-do_accept.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch406:       0002-analyze-avoid-a-null-dereference.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch407:       0003-analyze-fix-mem-leak.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch408:       0004-backlight-Avoid-error-when-state-restore-is-disabled.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch409:       0005-bus-avoid-using-m-kdbus-after-freeing-it.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch410:       0006-bus-unref-buscreds-on-failure.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch411:       0007-core-fix-a-potential-mem-leak.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch412:       0008-core-smack-setup-Actually-allow-for-succesfully-load.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch413:       0009-journal-do-not-leak-mmaps-on-OOM.patch
+# PATCH-FIX-UPSTREAM added at 2014/09/16
+Patch414:       0010-manager-use-correct-cleanup-function.patch
 
 # UDEV PATCHES
 # ============
@@ -971,6 +995,32 @@
 Patch1065:      1065-udev-bump-event-timeout-to-60-seconds.patch
 # PATCH-FIX-SUSE 
1066-udev-add-compatibility-links-for-truncated-by-id-links.patch (bnc#886852)
 Patch1066:      
1066-udev-add-compatibility-links-for-truncated-by-id-links.patch
+# PATCH-FIX-UPSTREAM 
1067-udev-always-resolve-correctly-database-names-on-chan.patch (bnc#864745)
+Patch1067:      1067-udev-always-resolve-correctly-database-names-on-chan.patch
+# PATCH-FIX-UPSTREAM 
1068-udev-net_setup_link-export-the-.link-filename-applie.patch
+Patch1068:      1068-udev-net_setup_link-export-the-.link-filename-applie.patch
+# PATCH-FIX-UPSTREAM 
1069-rules-net-setup-link-preserve-ID_NET_LINK_FILE-and-I.patch
+Patch1069:      1069-rules-net-setup-link-preserve-ID_NET_LINK_FILE-and-I.patch
+# PATCH-FIX-UPSTREAM 1070-rules-net-setup-link-remove-stray-linebreak.patch
+Patch1070:      1070-rules-net-setup-link-remove-stray-linebreak.patch
+# PATCH-FIX-UPSTREAM 
1071-udev-import-the-full-db-on-MOVE-events-for-devices-w.patch
+Patch1071:      1071-udev-import-the-full-db-on-MOVE-events-for-devices-w.patch
+# PATCH-FIX-UPSTREAM 1072-udev-netif_rename-don-t-log-to-kmsg.patch
+Patch1072:      1072-udev-netif_rename-don-t-log-to-kmsg.patch
+# PATCH-FIX-UPSTREAM 1073-udev-drop-print_kmsg.patch
+Patch1073:      1073-udev-drop-print_kmsg.patch
+# PATCH-FIX-UPSTREAM 1074-udev-fix-copy-paste-error-in-log-message.patch
+Patch1074:      1074-udev-fix-copy-paste-error-in-log-message.patch
+# PATCH-FIX-UPSTREAM 1075-udev-timeout-increase-timeout.patch
+Patch1075:      1075-udev-timeout-increase-timeout.patch
+# PATCH-FIX-UPSTREAM 
1076-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch
+Patch1076:      1076-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch
+# PATCH-FIX-UPSTREAM 
1077-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch
+Patch1077:      1077-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch
+# PATCH-FIX-UPSTREAM 1078-udev-remove-userspace-firmware-loading-support.patch
+Patch1078:      1078-udev-remove-userspace-firmware-loading-support.patch
+# PATCH-FIX-UPSTREAM 1079-udev-remove-userspace-firmware-loading-support.patch
+Patch1079:      1079-udev-remove-userspace-firmware-loading-support.patch
 
 %description
 Systemd is a system and service manager, compatible with SysV and LSB
@@ -1534,6 +1584,18 @@
 %patch400 -p0
 %patch401 -p0
 %patch402 -p0
+%patch403 -p0
+%patch404 -p0
+%patch405 -p0
+%patch406 -p0
+%patch407 -p0
+%patch408 -p0
+%patch409 -p0
+%patch410 -p0
+%patch411 -p0
+%patch412 -p0
+%patch413 -p0
+%patch414 -p0
 
 # udev patches
 %patch1001 -p1
@@ -1623,6 +1685,27 @@
 %patch1064 -p0
 %patch1065 -p0
 %patch1066 -p1
+%patch1067 -p1
+%patch1068 -p0
+%patch1069 -p0
+%patch1070 -p0
+%patch1071 -p0
+%patch1072 -p0
+%patch1073 -p0
+%patch1074 -p0
+%patch1075 -p0
+%if %{with udevsettle}
+%patch1076 -p0
+%else
+%patch1077 -p0
+%endif
+%if 0%{?suse_version} > 1310
+%if %{with udevsettle}
+%patch1079 -p1
+%else
+%patch1078 -p1
+%endif
+%endif
 
 # remove patch backups
 find -name '*.orig' -exec rm -f '{}' \+

systemd.spec: same change
++++++ 0001-activate-fix-fd-leak-in-do_accept.patch ++++++
>From aa44499da15a8fa7026463555a7a27e55e4e24a8 Mon Sep 17 00:00:00 2001
From: Philippe De Swert <[email protected]>
Date: Wed, 10 Sep 2014 22:14:41 +0300
Subject: [PATCH] activate: fix fd leak in do_accept()

Found with Coverity.
---
 src/activate/activate.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git src/activate/activate.c src/activate/activate.c
index 8942773..0a1df37 100644
--- src/activate/activate.c
+++ src/activate/activate.c
@@ -242,7 +242,7 @@ static int launch1(const char* child, char** argv, char 
**env, int fd) {
 
 static int do_accept(const char* name, char **argv, char **envp, int fd) {
         _cleanup_free_ char *local = NULL, *peer = NULL;
-        int fd2;
+        _cleanup_close_ int fd2 = -1;
 
         fd2 = accept(fd, NULL, NULL);
         if (fd2 < 0) {
-- 
1.7.9.2

++++++ 0001-systemctl-allow-to-change-the-default-target-without.patch ++++++
>From a1484a216e79da1fa7e2323095fb1b7203fb7a17 Mon Sep 17 00:00:00 2001
From: Djalal Harouni <[email protected]>
Date: Mon, 14 Apr 2014 01:07:52 +0100
Subject: [PATCH] systemctl: allow to change the default target without the
 --force switch

Currently "systemctl set-default" will fail to change the default target
due to the 'default.target' being a symlink which is always the case.

To work around this, the user must specify the "--force" switch to be
able to overwrite the existing symlink.

This is clearly a regression that was introduced by commit  718db96199e
since it worked before without the "--force" switch and the man pages do
not mention that you need to specify it. It is expected that this is a
symlink.

So just explicity set the force flag to make it work again.

https://bugs.freedesktop.org/show_bug.cgi?id=76623

Reported-by: <[email protected]>
---
 src/systemctl/systemctl.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git src/systemctl/systemctl.c src/systemctl/systemctl.c
index ee0938f..1b381f7 100644
--- src/systemctl/systemctl.c
+++ src/systemctl/systemctl.c
@@ -1968,7 +1968,7 @@ static int set_default(sd_bus *bus, char **args) {
                 return log_oom();
 
         if (!bus || avoid_bus()) {
-                r = unit_file_set_default(arg_scope, arg_root, unit, 
arg_force, &changes, &n_changes);
+                r = unit_file_set_default(arg_scope, arg_root, unit, true, 
&changes, &n_changes);
                 if (r < 0) {
                         log_error("Failed to set default target: %s", 
strerror(-r));
                         return r;
@@ -1990,7 +1990,7 @@ static int set_default(sd_bus *bus, char **args) {
                                 "SetDefaultTarget",
                                 &error,
                                 &reply,
-                                "sb", unit, arg_force);
+                                "sb", unit, true);
                 if (r < 0) {
                         log_error("Failed to set default target: %s", 
bus_error_message(&error, -r));
                         return r;
-- 
1.7.9.2

++++++ 0002-analyze-avoid-a-null-dereference.patch ++++++
>From d725a138c5c311ba06567d6841933aa5b7b6a435 Mon Sep 17 00:00:00 2001
From: Thomas Hindoe Paaboel Andersen <[email protected]>
Date: Thu, 11 Sep 2014 23:41:44 +0200
Subject: [PATCH] analyze: avoid a null dereference

If we have an error in the early sd_bus_* calls then unit_times
will still be null.

Found with coverity. Fixes: CID#996464
---
 src/analyze/analyze.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git src/analyze/analyze.c src/analyze/analyze.c
index d860a02..1281d6b 100644
--- src/analyze/analyze.c
+++ src/analyze/analyze.c
@@ -277,7 +277,8 @@ static int acquire_time_data(sd_bus *bus, struct unit_times 
**out) {
         return c;
 
 fail:
-        free_unit_times(unit_times, (unsigned) c);
+        if (unit_times)
+                free_unit_times(unit_times, (unsigned) c);
         return r;
 }
 
-- 
1.7.9.2

++++++ 0003-analyze-fix-mem-leak.patch ++++++
>From 0ee9613d98cbe1f36ffc98c6bfa51dd2b798fc6d Mon Sep 17 00:00:00 2001
From: Thomas Hindoe Paaboel Andersen <[email protected]>
Date: Sat, 13 Sep 2014 12:29:43 +0200
Subject: [PATCH] analyze: fix mem leak

Found with Coverity. Fixes: CID#1237756
---
 src/analyze/analyze.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git src/analyze/analyze.c src/analyze/analyze.c
index 1281d6b..82f5cf3 100644
--- src/analyze/analyze.c
+++ src/analyze/analyze.c
@@ -848,7 +848,8 @@ static int list_dependencies(sd_bus *bus, const char *name) 
{
         char ts[FORMAT_TIMESPAN_MAX];
         struct unit_times *times;
         int r;
-        const char *path, *id;
+        const char *id;
+        _cleanup_free_ char *path = NULL;
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         struct boot_times *boot;
-- 
1.7.9.2

++++++ 0004-backlight-Avoid-error-when-state-restore-is-disabled.patch ++++++
>From b76388e123e8d73ded1fd53937d816b314948517 Mon Sep 17 00:00:00 2001
From: Michael Biebl <[email protected]>
Date: Thu, 11 Sep 2014 00:49:36 +0200
Subject: [PATCH] backlight: Avoid error when state restore is disabled

When the state restore is disabled, we would print:
"Unknown verb: load" instead of simply skipping loading the
state.
---
 src/backlight/backlight.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git src/backlight/backlight.c src/backlight/backlight.c
index 4d94ebf..0a2bac6 100644
--- src/backlight/backlight.c
+++ src/backlight/backlight.c
@@ -372,9 +372,12 @@ int main(int argc, char *argv[]) {
          * device probing should be complete), so that the validity
          * check at boot time doesn't have to be reliable. */
 
-        if (streq(argv[1], "load") && shall_restore_state()) {
+        if (streq(argv[1], "load")) {
                 _cleanup_free_ char *value = NULL;
 
+                if (!shall_restore_state())
+                        return EXIT_SUCCESS;
+
                 if (!validate_device(udev, device))
                         return EXIT_SUCCESS;
 
-- 
1.7.9.2

++++++ 0005-bus-avoid-using-m-kdbus-after-freeing-it.patch ++++++
Based on fd989a0bc999d79719408ac28b126d9c9016bcb5 Mon Sep 17 00:00:00 2001
From: Philippe De Swert <[email protected]>
Date: Wed, 10 Sep 2014 12:20:38 +0300
Subject: [PATCH] bus: avoid using m->kdbus after freeing it

m->kdbus could be freed before it is released. Changing the
order fixes the issue.

Found with Coverity. Fixes: CID#1237798
---
 src/libsystemd/sd-bus/bus-message.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

--- src/libsystemd/sd-bus/bus-message.c
+++ src/libsystemd/sd-bus/bus-message.c 2014-09-16 10:31:37.538735664 +0000
@@ -126,9 +126,6 @@ static void message_free(sd_bus_message
 
         message_reset_parts(m);
 
-        if (m->free_kdbus)
-                free(m->kdbus);
-
         if (m->release_kdbus) {
                 uint64_t off;
 
@@ -136,6 +133,9 @@ static void message_free(sd_bus_message
                 ioctl(m->bus->input_fd, KDBUS_CMD_FREE, &off);
         }
 
+        if (m->free_kdbus)
+                free(m->kdbus);
+
         if (m->bus)
                 sd_bus_unref(m->bus);
 
++++++ 0006-bus-unref-buscreds-on-failure.patch ++++++
>From 2b347169b9046ff2d735ef23e62a8c74f5151600 Mon Sep 17 00:00:00 2001
From: Philippe De Swert <[email protected]>
Date: Wed, 10 Sep 2014 12:20:42 +0300
Subject: [PATCH] bus: unref buscreds on failure

Actually unref the buscreds when we are not going to return a
pointer to them. As when bus_creds_add_more fails we immediately
return the error code otherwise and leak the new buscreds.
Found with coverity. Fixes: CID#1237761
---
 src/libsystemd/sd-bus/sd-bus.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git src/libsystemd/sd-bus/sd-bus.c src/libsystemd/sd-bus/sd-bus.c
index 78e91b9..83b3aa1 100644
--- src/libsystemd/sd-bus/sd-bus.c
+++ src/libsystemd/sd-bus/sd-bus.c
@@ -3339,8 +3339,10 @@ _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t 
mask, sd_bus_creds **re
         }
 
         r = bus_creds_add_more(c, mask, pid, 0);
-        if (r < 0)
+        if (r < 0) {
+                sd_bus_creds_unref(c);
                 return r;
+        }
 
         *ret = c;
         return 0;
-- 
1.7.9.2

++++++ 0007-core-fix-a-potential-mem-leak.patch ++++++
Based on 4d5e13a125cf8d77d432225ab69826caa1d1cf59 Mon Sep 17 00:00:00 2001
From: Thomas Hindoe Paaboel Andersen <[email protected]>
Date: Sat, 13 Sep 2014 12:35:06 +0200
Subject: [PATCH] core: fix a potential mem leak

Found with Coverity. Fixes: CID#996438
---
 src/core/load-fragment.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

--- src/core/load-fragment.c
+++ src/core/load-fragment.c    2014-09-16 10:35:13.354235607 +0000
@@ -1294,8 +1294,11 @@ int config_parse_timer(const char *unit,
         }
 
         v = new0(TimerValue, 1);
-        if (!v)
+        if (!v) {
+                if (c)
+                        free(c);
                 return log_oom();
+        }
 
         v->base = b;
         v->clock_id = id;
++++++ 0008-core-smack-setup-Actually-allow-for-succesfully-load.patch ++++++
>From b9289d4c6e13ec5fb67bfce69c826d93b004da6a Mon Sep 17 00:00:00 2001
From: Philippe De Swert <[email protected]>
Date: Fri, 12 Sep 2014 16:49:48 +0300
Subject: [PATCH] core: smack-setup: Actually allow for succesfully loading
 CIPSO policy

The line under the last switch statement  *loaded_policy = true;
would never be executed. As all switch cases return 0. Thus the
policy would never be marked as loaded.

Found with Coverity. Fixes: CID#1237785
---
 src/core/smack-setup.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git src/core/smack-setup.c src/core/smack-setup.c
index 5f6dabf..5d8a26c 100644
--- src/core/smack-setup.c
+++ src/core/smack-setup.c
@@ -158,7 +158,7 @@ int smack_setup(bool *loaded_policy) {
                 return 0;
         case 0:
                 log_info("Successfully loaded Smack/CIPSO policies.");
-                return 0;
+                break;
         default:
                 log_warning("Failed to load Smack/CIPSO access rules: %s, 
ignoring.",
                             strerror(abs(r)));
-- 
1.7.9.2

++++++ 0009-hwdb-update.patch ++++++
++++ 3363 lines (skipped)

++++++ 0009-journal-do-not-leak-mmaps-on-OOM.patch ++++++
>From b67ddc7bbe31cde7f69f9814204d9bb1d4623c47 Mon Sep 17 00:00:00 2001
From: Philippe De Swert <[email protected]>
Date: Wed, 10 Sep 2014 12:20:41 +0300
Subject: [PATCH] journal: do not leak mmaps on OOM

After a section of memory is succesfully allocated, some of the following
actions can still fail due to lack of memory. In this case -ENOMEM is
returned without actually freeing the already mapped memory.
Found with coverity. Fixes: CID#1237762
---
 src/journal/mmap-cache.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git src/journal/mmap-cache.c src/journal/mmap-cache.c
index 7dbbb5e..908562d 100644
--- src/journal/mmap-cache.c
+++ src/journal/mmap-cache.c
@@ -496,15 +496,15 @@ static int add_mmap(
 
         c = context_add(m, context);
         if (!c)
-                return -ENOMEM;
+                goto outofmem;
 
         f = fd_add(m, fd);
         if (!f)
-                return -ENOMEM;
+                goto outofmem;
 
         w = window_add(m);
         if (!w)
-                return -ENOMEM;
+                goto outofmem;
 
         w->keep_always = keep_always;
         w->ptr = d;
@@ -522,6 +522,10 @@ static int add_mmap(
         if (ret)
                 *ret = (uint8_t*) w->ptr + (offset - w->offset);
         return 1;
+
+outofmem:
+        munmap(d, wsize);
+        return -ENOMEM;
 }
 
 int mmap_cache_get(
-- 
1.7.9.2

++++++ 0010-manager-use-correct-cleanup-function.patch ++++++
>From 807d0cca2b0daf4cd725298c1b5e062b1126f15b Mon Sep 17 00:00:00 2001
From: Thomas Hindoe Paaboel Andersen <[email protected]>
Date: Thu, 11 Sep 2014 21:14:53 +0200
Subject: [PATCH] manager: use correct cleanup function

Close the dir instead of attempt to free it.

Introduced in 874310b7b68c4c0d36ff07397db30a959bb7dae5

Found with coverity. Fixes: CID#996368
---
 src/core/manager.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git src/core/manager.c src/core/manager.c
index 9abdf47..095111e 100644
--- src/core/manager.c
+++ src/core/manager.c
@@ -896,7 +896,7 @@ static int manager_coldplug(Manager *m) {
 
 static void manager_build_unit_path_cache(Manager *m) {
         char **i;
-        _cleanup_free_ DIR *d = NULL;
+        _cleanup_closedir_ DIR *d = NULL;
         int r;
 
         assert(m);
-- 
1.7.9.2

++++++ 1067-udev-always-resolve-correctly-database-names-on-chan.patch ++++++
>From 368082520b25722575783f06879fb5fc2e4c219c Mon Sep 17 00:00:00 2001
From: Robert Milasan <[email protected]>
Date: Sat, 13 Sep 2014 15:18:37 +0200
Subject: [PATCH] udev: always resolve correctly database names on 'change'
 event

Signed-off-by: Robert Milasan <[email protected]>
---
 src/libudev/libudev-device.c  | 2 +-
 src/libudev/libudev-private.h | 1 +
 src/udev/udev-event.c         | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/libudev/libudev-device.c b/src/libudev/libudev-device.c
index d61a2ad..2699374 100644
--- a/src/libudev/libudev-device.c
+++ b/src/libudev/libudev-device.c
@@ -161,7 +161,7 @@ _public_ dev_t udev_device_get_devnum(struct udev_device 
*udev_device)
         return udev_device->devnum;
 }
 
-static int udev_device_set_devnum(struct udev_device *udev_device, dev_t 
devnum)
+int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum)
 {
         char num[32];
 
diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h
index 35ea7ba..05a6410 100644
--- a/src/libudev/libudev-private.h
+++ b/src/libudev/libudev-private.h
@@ -59,6 +59,7 @@ uid_t udev_device_get_devnode_uid(struct udev_device 
*udev_device);
 gid_t udev_device_get_devnode_gid(struct udev_device *udev_device);
 int udev_device_set_subsystem(struct udev_device *udev_device, const char 
*subsystem);
 int udev_device_set_syspath(struct udev_device *udev_device, const char 
*syspath);
+int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum);
 int udev_device_add_devlink(struct udev_device *udev_device, const char 
*devlink);
 void udev_device_cleanup_devlinks_list(struct udev_device *udev_device);
 struct udev_list_entry *udev_device_add_property(struct udev_device 
*udev_device, const char *key, const char *value);
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index e8d6676..2cf0763 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -812,6 +812,7 @@ void udev_event_execute_rules(struct udev_event *event,
                 if (event->dev_db != NULL) {
                         udev_device_set_syspath(event->dev_db, 
udev_device_get_syspath(dev));
                         udev_device_set_subsystem(event->dev_db, 
udev_device_get_subsystem(dev));
+                        udev_device_set_devnum(event->dev_db, 
udev_device_get_devnum(dev));
                         udev_device_read_db(event->dev_db, NULL);
                         udev_device_set_info_loaded(event->dev_db);
 
-- 
1.8.4.5

++++++ 1068-udev-net_setup_link-export-the-.link-filename-applie.patch ++++++
>From ad6e5b348fa88f44d6cbfe7aabda7612a1d0463f Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Mon, 8 Sep 2014 14:00:58 +0200
Subject: [PATCH] udev: net_setup_link - export the .link filename applied to
 the link

---
 src/udev/udev-builtin-net_setup_link.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git src/udev/udev-builtin-net_setup_link.c 
src/udev/udev-builtin-net_setup_link.c
index 6207269..14351de 100644
--- src/udev/udev-builtin-net_setup_link.c
+++ src/udev/udev-builtin-net_setup_link.c
@@ -57,6 +57,8 @@ static int builtin_net_setup_link(struct udev_device *dev, 
int argc, char **argv
                 return EXIT_FAILURE;
         }
 
+        udev_builtin_add_property(dev, test, "ID_NET_LINK_FILE", 
link->filename);
+
         if (name)
                 udev_builtin_add_property(dev, test, "ID_NET_NAME", name);
 
-- 
1.7.9.2

++++++ 1069-rules-net-setup-link-preserve-ID_NET_LINK_FILE-and-I.patch ++++++
>From e4d7c49050769877c7f10184bbe2a1e77d0b5333 Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Mon, 8 Sep 2014 17:16:24 +0200
Subject: [PATCH] rules: net-setup-link - preserve ID_NET_LINK_FILE and
 ID_NET_NAME after MOVE

---
 rules/80-net-setup-link.rules |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git rules/80-net-setup-link.rules rules/80-net-setup-link.rules
index f390fcb..27c43b9 100644
--- rules/80-net-setup-link.rules
+++ rules/80-net-setup-link.rules
@@ -4,7 +4,8 @@ SUBSYSTEM!="net", GOTO="net_setup_link_end"
 
 IMPORT{builtin}="path_id"
 
-ACTION=="move", IMPORT{db}="ID_NET_DRIVER"
+ACTION=="move", IMPORT{db}="ID_NET_DRIVER", IMPORT{db}="ID_NET_LINK_FILE",
+IMPORT{db}="ID_NET_NAME"
 
 ACTION!="add", GOTO="net_setup_link_end"
 
-- 
1.7.9.2

++++++ 1070-rules-net-setup-link-remove-stray-linebreak.patch ++++++
>From 52e231b04635400292179cf51b30d7d9b6323fb2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mantas=20Mikul=C4=97nas?= <[email protected]>
Date: Mon, 8 Sep 2014 22:53:39 +0300
Subject: [PATCH] rules: net-setup-link - remove stray linebreak

If not backslash-escaped, it splits the rule in two.
---
 rules/80-net-setup-link.rules |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git rules/80-net-setup-link.rules rules/80-net-setup-link.rules
index 27c43b9..4207694 100644
--- rules/80-net-setup-link.rules
+++ rules/80-net-setup-link.rules
@@ -4,8 +4,7 @@ SUBSYSTEM!="net", GOTO="net_setup_link_end"
 
 IMPORT{builtin}="path_id"
 
-ACTION=="move", IMPORT{db}="ID_NET_DRIVER", IMPORT{db}="ID_NET_LINK_FILE",
-IMPORT{db}="ID_NET_NAME"
+ACTION=="move", IMPORT{db}="ID_NET_DRIVER", IMPORT{db}="ID_NET_LINK_FILE", 
IMPORT{db}="ID_NET_NAME"
 
 ACTION!="add", GOTO="net_setup_link_end"
 
-- 
1.7.9.2

++++++ 1071-udev-import-the-full-db-on-MOVE-events-for-devices-w.patch ++++++
>From b081b27e1433cdc7ac72b25ae8b4db887d79187f Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Tue, 9 Sep 2014 12:23:19 +0200
Subject: [PATCH] udev: import the full db on MOVE events for devices without
 dev_t

---
 rules/80-net-setup-link.rules |    2 --
 src/udev/udev-event.c         |   16 ++++++++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git rules/80-net-setup-link.rules rules/80-net-setup-link.rules
index 4207694..6e411a9 100644
--- rules/80-net-setup-link.rules
+++ rules/80-net-setup-link.rules
@@ -4,8 +4,6 @@ SUBSYSTEM!="net", GOTO="net_setup_link_end"
 
 IMPORT{builtin}="path_id"
 
-ACTION=="move", IMPORT{db}="ID_NET_DRIVER", IMPORT{db}="ID_NET_LINK_FILE", 
IMPORT{db}="ID_NET_NAME"
-
 ACTION!="add", GOTO="net_setup_link_end"
 
 IMPORT{builtin}="net_setup_link"
diff --git src/udev/udev-event.c src/udev/udev-event.c
index 00cd6d4..18b92ca 100644
--- src/udev/udev-event.c
+++ src/udev/udev-event.c
@@ -805,6 +805,22 @@ void udev_event_execute_rules(struct udev_event *event,
                                 udev_watch_end(event->udev, event->dev_db);
                 }
 
+                if (major(udev_device_get_devnum(dev)) == 0 &&
+                    streq(udev_device_get_action(dev), "move")) {
+                        struct udev_list_entry *entry;
+
+                        for ((entry = 
udev_device_get_properties_list_entry(event->dev_db)); entry; entry = 
udev_list_entry_get_next(entry)) {
+                                const char *key, *value;
+                                struct udev_list_entry *property;
+
+                                key = udev_list_entry_get_name(entry);
+                                value = udev_list_entry_get_value(entry);
+
+                                property = 
udev_device_add_property(event->dev, key, value);
+                                udev_list_entry_set_num(property, true);
+                        }
+                }
+
                 udev_rules_apply_to_event(rules, event, timeout_usec, sigmask);
 
                 /* rename a new network interface, if needed */
-- 
1.7.9.2

++++++ 1072-udev-netif_rename-don-t-log-to-kmsg.patch ++++++
Based on 1187f20655de0c37337ea73e1e55823b83cd7c00 Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Tue, 9 Sep 2014 22:45:03 +0200
Subject: [PATCH] udev: netif_rename - don't log to kmsg

As of 3.17, the kernel will do this on its own, so just do regular log_debug() 
logging from udev.
---
 src/udev/udev-event.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

--- src/udev/udev-event.c
+++ src/udev/udev-event.c       2014-09-16 08:52:36.154735794 +0000
@@ -770,7 +770,7 @@ static int rename_netif(struct udev_even
 
         r = rtnl_set_link_name(rtnl, udev_device_get_ifindex(dev), name);
         if (r == 0) {
-                print_kmsg("renamed network interface %s to %s\n", oldname, 
name);
+                log_debug("renamed network interface %s to %s", oldname, name);
                 return r;
         } else if (r != -EEXIST) {
                 log_error("error changing net interface name %s to %s: %s",
@@ -789,7 +789,7 @@ static int rename_netif(struct udev_even
         }
 
         /* log temporary name */
-        print_kmsg("renamed network interface %s to %s\n", oldname, interim);
+        log_debug("renamed network interface %s to %s", oldname, interim);
 
         loop = 90 * 20;
         while (loop--) {
@@ -798,7 +798,7 @@ static int rename_netif(struct udev_even
 
                 r = rtnl_set_link_name(rtnl, udev_device_get_ifindex(dev), 
name);
                 if (r == 0) {
-                        print_kmsg("renamed network interface %s to %s\n", 
interim, name);
+                        log_debug("renamed network interface %s to %s", 
interim, name);
                         break;
                 }
 
++++++ 1073-udev-drop-print_kmsg.patch ++++++
Based on 9d19a679f23c7a72c326cbbbf44e0c9f423dec5d Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Tue, 9 Sep 2014 22:48:07 +0200
Subject: [PATCH] udev - drop print_kmsg

The only remaining user was 'starting version XXX', which is now logged using 
log_info().
---
 src/libudev/libudev-private.h |    1 -
 src/libudev/libudev-util.c    |   25 -------------------------
 src/udev/udevd.c              |    2 +-
 3 files changed, 1 insertion(+), 27 deletions(-)

diff --git src/libudev/libudev-private.h src/libudev/libudev-private.h
index ae97557..cd1c1fb 100644
--- src/libudev/libudev-private.h
+++ src/libudev/libudev-private.h
@@ -170,6 +170,5 @@ int util_delete_path(struct udev *udev, const char *path);
 uid_t util_lookup_user(struct udev *udev, const char *user);
 gid_t util_lookup_group(struct udev *udev, const char *group);
 int util_resolve_subsys_kernel(struct udev *udev, const char *string, char 
*result, size_t maxsize, int read_value);
-ssize_t print_kmsg(const char *fmt, ...) _printf_(1, 2);
 
 #endif
--- src/libudev/libudev-util.c
+++ src/libudev/libudev-util.c  2014-09-16 08:56:01.862736270 +0000
@@ -422,33 +422,3 @@ static int parse_proc_cmdline_word(const
 
         return 0;
 }
-
-ssize_t print_kmsg(const char *fmt, ...)
-{
-        _cleanup_close_ int fd = -1;
-        va_list ap;
-        char text[1024];
-        ssize_t len;
-        ssize_t ret;
-
-        if (parse_proc_cmdline(parse_proc_cmdline_word) == -115) {
-                fd = open("/dev/null", O_WRONLY|O_NOCTTY|O_CLOEXEC);
-        } else {
-                fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC);
-        }
-
-        if (fd < 0)
-                return -errno;
-
-        len = snprintf(text, sizeof(text), "<30>systemd-udevd[%u]: ", 
getpid());
-
-        va_start(ap, fmt);
-        len += vsnprintf(text + len, sizeof(text) - len, fmt, ap);
-        va_end(ap);
-
-        ret = write(fd, text, len);
-        if (ret < 0)
-                return -errno;
-
-        return ret;
-}
diff --git src/udev/udevd.c src/udev/udevd.c
index be0acc3..b023b6e 100644
--- src/udev/udevd.c
+++ src/udev/udevd.c
@@ -1200,7 +1200,7 @@ int main(int argc, char *argv[]) {
                 sd_notify(1, "READY=1");
         }
 
-        print_kmsg("starting version " VERSION "\n");
+        log_info("starting version " VERSION "\n");
 
         if (!debug) {
                 int fd;
-- 
1.7.9.2

++++++ 1074-udev-fix-copy-paste-error-in-log-message.patch ++++++
>From ec3281d3b681b002dfe1a4bea0532a504e37557a Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Wed, 10 Sep 2014 07:59:22 +0200
Subject: [PATCH] udev: fix copy-paste error in log message

---
 src/udev/udev-rules.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git src/udev/udev-rules.c src/udev/udev-rules.c
index cc56215..6de7511 100644
--- src/udev/udev-rules.c
+++ src/udev/udev-rules.c
@@ -1323,7 +1323,7 @@ static int add_rule(struct udev_rules *rules, char *line,
                                 if (cmd < UDEV_BUILTIN_MAX)
                                         rule_add_key(&rule_tmp, 
TK_A_RUN_BUILTIN, op, value, &cmd);
                                 else
-                                        log_error("IMPORT{builtin}: '%s' 
unknown %s:%u", value, filename, lineno);
+                                        log_error("RUN{builtin}: '%s' unknown 
%s:%u", value, filename, lineno);
                         } else if (streq(attr, "program")) {
                                 enum udev_builtin_cmd cmd = UDEV_BUILTIN_MAX;
 
-- 
1.7.9.2

++++++ 1075-udev-timeout-increase-timeout.patch ++++++
>From b5338a19864ac3f5632aee48069a669479621dca Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Wed, 10 Sep 2014 10:56:26 +0200
Subject: [PATCH] udev: timeout - increase timeout

Some kernel modules still take more than one minute to insmod, we no longer 
rely on the timeout
killing insmod within a given period of time, so just bump this to a much 
higher value. Its only
purpose is to make sure that nothing stays aronud forever.
---
 src/udev/udevd.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git src/udev/udevd.c src/udev/udevd.c
index b023b6e..a7f8cbd 100644
--- src/udev/udevd.c
+++ src/udev/udevd.c
@@ -74,7 +74,7 @@ static bool reload;
 static int children;
 static int children_max;
 static int exec_delay;
-static usec_t event_timeout_usec = 60 * USEC_PER_SEC;
+static usec_t event_timeout_usec = 180 * USEC_PER_SEC;
 static sigset_t sigmask_orig;
 static UDEV_LIST(event_list);
 static UDEV_LIST(worker_list);
-- 
1.7.9.2

++++++ 1076-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch ++++++
Based on 671174136525ddf208cdbe75d6d6bd159afa961f Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Thu, 11 Sep 2014 18:49:04 +0200
Subject: [PATCH] udev: timeout - warn after a third of the timeout before
 killing

---
 src/test/test-udev.c    |    4 ++--
 src/udev/udev-event.c   |   40 ++++++++++++++++++++++++++++++----------
 src/udev/udev-rules.c   |    8 +++++---
 src/udev/udev.h         |    9 ++++++---
 src/udev/udevadm-test.c |    2 +-
 src/udev/udevd.c        |   40 +++++++++++++++++++++++++++-------------
 6 files changed, 71 insertions(+), 32 deletions(-)

diff --git src/test/test-udev.c src/test/test-udev.c
index 566a73a..f085262 100644
--- src/test/test-udev.c
+++ src/test/test-udev.c
@@ -153,8 +153,8 @@ int main(int argc, char *argv[]) {
                 }
         }
 
-        udev_event_execute_rules(event, USEC_PER_SEC, rules, &sigmask_orig);
-        udev_event_execute_run(event, USEC_PER_SEC, NULL);
+        udev_event_execute_rules(event, 3 * USEC_PER_SEC, USEC_PER_SEC, rules, 
&sigmask_orig);
+        udev_event_execute_run(event, 3 * USEC_PER_SEC, USEC_PER_SEC, NULL);
 out:
         if (event != NULL && event->fd_signal >= 0)
                 close(event->fd_signal);
diff --git src/udev/udev-event.c src/udev/udev-event.c
index a883edc..e8d6676 100644
--- src/udev/udev-event.c
+++ src/udev/udev-event.c
@@ -541,6 +541,7 @@ out:
 
 static int spawn_wait(struct udev_event *event,
                       usec_t timeout_usec,
+                      usec_t timeout_warn_usec,
                       const char *cmd, pid_t pid) {
         struct pollfd pfd[1];
         int err = 0;
@@ -550,6 +551,7 @@ static int spawn_wait(struct udev_event *event,
 
         while (pid > 0) {
                 int timeout;
+                int timeout_warn = 0;
                 int fdcount;
 
                 if (timeout_usec > 0) {
@@ -558,13 +560,17 @@ static int spawn_wait(struct udev_event *event,
                         age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
                         if (age_usec >= timeout_usec)
                                 timeout = 1000;
-                        else
-                                timeout = ((timeout_usec - age_usec) / 
USEC_PER_MSEC) + MSEC_PER_SEC;
+                        else {
+                                if (timeout_warn_usec > 0)
+                                        timeout_warn = ((timeout_warn_usec - 
age_usec) / USEC_PER_MSEC) + MSEC_PER_SEC;
+
+                                timeout = ((timeout_usec - timeout_warn_usec - 
age_usec) / USEC_PER_MSEC) + MSEC_PER_SEC;
+                        }
                 } else {
                         timeout = -1;
                 }
 
-                fdcount = poll(pfd, 1, timeout);
+                fdcount = poll(pfd, 1, timeout_warn);
                 if (fdcount < 0) {
                         if (errno == EINTR)
                                 continue;
@@ -573,8 +579,20 @@ static int spawn_wait(struct udev_event *event,
                         goto out;
                 }
                 if (fdcount == 0) {
-                        log_error("timeout: killing '%s' [%u]", cmd, pid);
-                        kill(pid, SIGKILL);
+                        log_warning("slow: '%s' [%u]", cmd, pid);
+
+                        fdcount = poll(pfd, 1, timeout);
+                        if (fdcount < 0) {
+                                if (errno == EINTR)
+                                        continue;
+                                err = -errno;
+                                log_error("failed to poll: %m");
+                                goto out;
+                        }
+                        if (fdcount == 0) {
+                                log_error("timeout: killing '%s' [%u]", cmd, 
pid);
+                                kill(pid, SIGKILL);
+                        }
                 }
 
                 if (pfd[0].revents & POLLIN) {
@@ -654,6 +672,7 @@ out:
 
 int udev_event_spawn(struct udev_event *event,
                      usec_t timeout_usec,
+                     usec_t timeout_warn_usec,
                      const char *cmd, char **envp, const sigset_t *sigmask,
                      char *result, size_t ressize) {
         struct udev *udev = event->udev;
@@ -730,7 +749,7 @@ int udev_event_spawn(struct udev_event *event,
                            outpipe[READ_END], errpipe[READ_END],
                            result, ressize);
 
-                err = spawn_wait(event, timeout_usec, cmd, pid);
+                err = spawn_wait(event, timeout_usec, timeout_warn_usec, cmd, 
pid);
         }
 
 out:
@@ -769,6 +788,7 @@ static int rename_netif(struct udev_event *event) {
 
 void udev_event_execute_rules(struct udev_event *event,
                               usec_t timeout_usec,
+                              usec_t timeout_warn_usec,
                               struct udev_rules *rules, const sigset_t 
*sigmask) {
         struct udev_device *dev = event->dev;
 
@@ -783,7 +803,7 @@ void udev_event_execute_rules(struct udev_event *event,
                 if (major(udev_device_get_devnum(dev)) != 0)
                         udev_watch_end(event->udev, dev);
 
-                udev_rules_apply_to_event(rules, event, timeout_usec, sigmask);
+                udev_rules_apply_to_event(rules, event, timeout_usec, 
timeout_warn_usec, sigmask);
 
                 if (major(udev_device_get_devnum(dev)) != 0)
                         udev_node_remove(dev);
@@ -816,7 +836,7 @@ void udev_event_execute_rules(struct udev_event *event,
                         }
                 }
 
-                udev_rules_apply_to_event(rules, event, timeout_usec, sigmask);
+                udev_rules_apply_to_event(rules, event, timeout_usec, 
timeout_warn_usec, sigmask);
 
                 /* rename a new network interface, if needed */
                 if (udev_device_get_ifindex(dev) > 0 && 
streq(udev_device_get_action(dev), "add") &&
@@ -889,7 +909,7 @@ void udev_event_execute_rules(struct udev_event *event,
         }
 }
 
-void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
const sigset_t *sigmask) {
+void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
usec_t timeout_warn_usec, const sigset_t *sigmask) {
         struct udev_list_entry *list_entry;
 
         udev_list_entry_foreach(list_entry, 
udev_list_get_entry(&event->run_list)) {
@@ -912,7 +932,7 @@ void udev_event_execute_run(struct udev_event *event, 
usec_t timeout_usec, const
 
                         udev_event_apply_format(event, cmd, program, 
sizeof(program));
                         envp = udev_device_get_properties_envp(event->dev);
-                        udev_event_spawn(event, timeout_usec, program, envp, 
sigmask, NULL, 0);
+                        udev_event_spawn(event, timeout_usec, 
timeout_warn_usec, program, envp, sigmask, NULL, 0);
                 }
         }
 }
diff --git src/udev/udev-rules.c src/udev/udev-rules.c
index 9514dde..db95442 100644
--- src/udev/udev-rules.c
+++ src/udev/udev-rules.c
@@ -615,6 +615,7 @@ static int import_file_into_properties(struct udev_device 
*dev, const char *file
 
 static int import_program_into_properties(struct udev_event *event,
                                           usec_t timeout_usec,
+                                          usec_t timeout_warn_usec,
                                           const char *program, const sigset_t 
*sigmask) {
         struct udev_device *dev = event->dev;
         char **envp;
@@ -623,7 +624,7 @@ static int import_program_into_properties(struct udev_event 
*event,
         int err;
 
         envp = udev_device_get_properties_envp(dev);
-        err = udev_event_spawn(event, timeout_usec, program, envp, sigmask, 
result, sizeof(result));
+        err = udev_event_spawn(event, timeout_usec, timeout_warn_usec, 
program, envp, sigmask, result, sizeof(result));
         if (err < 0)
                 return err;
 
@@ -1862,6 +1863,7 @@ enum escape_type {
 int udev_rules_apply_to_event(struct udev_rules *rules,
                               struct udev_event *event,
                               usec_t timeout_usec,
+                              usec_t timeout_warn_usec,
                               const sigset_t *sigmask) {
         struct token *cur;
         struct token *rule;
@@ -2070,7 +2072,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                                   rules_str(rules, rule->rule.filename_off),
                                   rule->rule.filename_line);
 
-                        if (udev_event_spawn(event, timeout_usec, program, 
envp, sigmask, result, sizeof(result)) < 0) {
+                        if (udev_event_spawn(event, timeout_usec, 
timeout_warn_usec, program, envp, sigmask, result, sizeof(result)) < 0) {
                                 if (cur->key.op != OP_NOMATCH)
                                         goto nomatch;
                         } else {
@@ -2106,7 +2108,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                                   rules_str(rules, rule->rule.filename_off),
                                   rule->rule.filename_line);
 
-                        if (import_program_into_properties(event, 
timeout_usec, import, sigmask) != 0)
+                        if (import_program_into_properties(event, 
timeout_usec, timeout_warn_usec, import, sigmask) != 0)
                                 if (cur->key.op != OP_NOMATCH)
                                         goto nomatch;
                         break;
diff --git src/udev/udev.h src/udev/udev.h
index ed01da3..765ba9e 100644
--- src/udev/udev.h
+++ src/udev/udev.h
@@ -73,7 +73,8 @@ struct udev_rules;
 struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names);
 struct udev_rules *udev_rules_unref(struct udev_rules *rules);
 bool udev_rules_check_timestamp(struct udev_rules *rules);
-int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event 
*event, usec_t timeout_usec, const sigset_t *sigmask);
+int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event 
*event, usec_t timeout_usec, usec_t timeout_warn_usec,
+                              const sigset_t *sigmask);
 int udev_rules_apply_static_dev_perms(struct udev_rules *rules);
 
 /* udev-event.c */
@@ -84,10 +85,12 @@ int udev_event_apply_subsys_kernel(struct udev_event 
*event, const char *string,
                                    char *result, size_t maxsize, int 
read_value);
 int udev_event_spawn(struct udev_event *event,
                      usec_t timeout_usec,
+                     usec_t timeout_warn_usec,
                      const char *cmd, char **envp, const sigset_t *sigmask,
                      char *result, size_t ressize);
-void udev_event_execute_rules(struct udev_event *event, usec_t timeout_usec, 
struct udev_rules *rules, const sigset_t *sigset);
-void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
const sigset_t *sigset);
+void udev_event_execute_rules(struct udev_event *event, usec_t timeout_usec, 
usec_t timeout_warn_usec,
+                              struct udev_rules *rules, const sigset_t 
*sigset);
+void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
usec_t timeout_warn_usec, const sigset_t *sigset);
 int udev_build_argv(struct udev *udev, char *cmd, int *argc, char *argv[]);
 
 /* udev-watch.c */
diff --git src/udev/udevadm-test.c src/udev/udevadm-test.c
index 809adb6..4738b61 100644
--- src/udev/udevadm-test.c
+++ src/udev/udevadm-test.c
@@ -136,7 +136,7 @@ static int adm_test(struct udev *udev, int argc, char 
*argv[]) {
                 goto out;
         }
 
-        udev_event_execute_rules(event, 60 * USEC_PER_SEC, rules, 
&sigmask_orig);
+        udev_event_execute_rules(event, 60 * USEC_PER_SEC, 20 * USEC_PER_SEC, 
rules, &sigmask_orig);
 
         udev_list_entry_foreach(entry, 
udev_device_get_properties_list_entry(dev))
                 printf("%s=%s\n", udev_list_entry_get_name(entry), 
udev_list_entry_get_value(entry));
--- src/udev/udevd.c
+++ src/udev/udevd.c    2014-09-16 09:01:14.382735997 +0000
@@ -75,6 +75,7 @@ static int children;
 static int children_max;
 static int exec_delay;
 static usec_t event_timeout_usec = 180 * USEC_PER_SEC;
+static usec_t event_timeout_warn_usec = 180 * USEC_PER_SEC / 3;
 static sigset_t sigmask_orig;
 static UDEV_LIST(event_list);
 static UDEV_LIST(worker_list);
@@ -129,6 +130,7 @@ struct worker {
         enum worker_state state;
         struct event *event;
         usec_t event_start_usec;
+        bool event_warned;
 };
 
 /* passed from worker to main process */
@@ -314,9 +316,9 @@ static void worker_new(struct event *eve
                         }
 
                         /* apply rules, create node, symlinks */
-                        udev_event_execute_rules(udev_event, 
event_timeout_usec, rules, &sigmask_orig);
+                        udev_event_execute_rules(udev_event, 
event_timeout_usec, event_timeout_warn_usec, rules, &sigmask_orig);
 
-                        udev_event_execute_run(udev_event, event_timeout_usec, 
&sigmask_orig);
+                        udev_event_execute_run(udev_event, event_timeout_usec, 
event_timeout_warn_usec, &sigmask_orig);
 
                         /* apply/restore inotify watch */
                         if (udev_event->inotify_watch) {
@@ -410,6 +412,7 @@ out:
                 worker->pid = pid;
                 worker->state = WORKER_RUNNING;
                 worker->event_start_usec = now(CLOCK_MONOTONIC);
+                worker->event_warned = false;
                 worker->event = event;
                 event->state = EVENT_RUNNING;
                 udev_list_node_append(&worker->node, &worker_list);
@@ -441,6 +444,7 @@ static void event_run(struct event *even
                 worker->event = event;
                 worker->state = WORKER_RUNNING;
                 worker->event_start_usec = now(CLOCK_MONOTONIC);
+                worker->event_warned = false;
                 event->state = EVENT_RUNNING;
                 return;
         }
@@ -1016,6 +1020,7 @@ static void kernel_cmdline_options(struc
                         exec_delay = strtoul(opt + 16, NULL, 0);
                 } else if (startswith(opt, "udev.event-timeout=")) {
                         event_timeout_usec = strtoul(opt + 16, NULL, 0) * 
USEC_PER_SEC;
+                        event_timeout_warn_usec = (event_timeout_usec / 3) ? : 
1;
                 }
 
                 free(s);
@@ -1078,6 +1083,7 @@ int main(int argc, char *argv[]) {
                         break;
                 case 't':
                         event_timeout_usec = strtoul(optarg, NULL, 0) * 
USEC_PER_SEC;
+                        event_timeout_warn_usec = (event_timeout_usec / 3) ? : 
1;
                         break;
                 case 'D':
                         debug = true;
@@ -1413,21 +1419,29 @@ int main(int argc, char *argv[]) {
                         /* check for hanging events */
                         udev_list_node_foreach(loop, &worker_list) {
                                 struct worker *worker = node_to_worker(loop);
+                                usec_t ts;
 
                                 if (worker->state != WORKER_RUNNING)
                                         continue;
 
-                                if ((now(CLOCK_MONOTONIC) - 
worker->event_start_usec) > event_timeout_usec) {
-                                        log_error("worker [%u] %s timeout; 
kill it", worker->pid, worker->event->devpath);
-                                        kill(worker->pid, SIGKILL);
-                                        worker->state = WORKER_KILLED;
-
-                                        /* drop reference taken for state 
'running' */
-                                        worker_unref(worker);
-                                        log_error("seq %llu '%s' killed", 
udev_device_get_seqnum(worker->event->dev), worker->event->devpath);
-                                        worker->event->exitcode = -64;
-                                        event_queue_delete(worker->event);
-                                        worker->event = NULL;
+                                ts = now(CLOCK_MONOTONIC);
+
+                                if ((ts - worker->event_start_usec) > 
event_timeout_warn_usec) {
+                                        if ((ts - worker->event_start_usec) > 
event_timeout_usec) {
+                                                log_error("worker [%u] %s 
timeout; kill it", worker->pid, worker->event->devpath);
+                                                kill(worker->pid, SIGKILL);
+                                                worker->state = WORKER_KILLED;
+
+                                                /* drop reference taken for 
state 'running' */
+                                                worker_unref(worker);
+                                                log_error("seq %llu '%s' 
killed", udev_device_get_seqnum(worker->event->dev), worker->event->devpath);
+                                                worker->event->exitcode = -64;
+                                                
event_queue_delete(worker->event);
+                                                worker->event = NULL;
+                                        } else if (!worker->event_warned) {
+                                                log_warning("worker [%u] %s is 
taking a long time", worker->pid, worker->event->devpath);
+                                                worker->event_warned = true;
+                                        }
                                 }
                         }
 
-- 
1.7.9.2

++++++ 1077-udev-timeout-warn-after-a-third-of-the-timeout-befor.patch ++++++
Based on 671174136525ddf208cdbe75d6d6bd159afa961f Mon Sep 17 00:00:00 2001
From: Tom Gundersen <[email protected]>
Date: Thu, 11 Sep 2014 18:49:04 +0200
Subject: [PATCH] udev: timeout - warn after a third of the timeout before
 killing

---
 src/test/test-udev.c    |    4 ++--
 src/udev/udev-event.c   |   40 ++++++++++++++++++++++++++++++----------
 src/udev/udev-rules.c   |    8 +++++---
 src/udev/udev.h         |    9 ++++++---
 src/udev/udevadm-test.c |    2 +-
 src/udev/udevd.c        |   40 +++++++++++++++++++++++++++-------------
 6 files changed, 71 insertions(+), 32 deletions(-)

diff --git src/test/test-udev.c src/test/test-udev.c
index 566a73a..f085262 100644
--- src/test/test-udev.c
+++ src/test/test-udev.c
@@ -153,8 +153,8 @@ int main(int argc, char *argv[]) {
                 }
         }
 
-        udev_event_execute_rules(event, USEC_PER_SEC, rules, &sigmask_orig);
-        udev_event_execute_run(event, USEC_PER_SEC, NULL);
+        udev_event_execute_rules(event, 3 * USEC_PER_SEC, USEC_PER_SEC, rules, 
&sigmask_orig);
+        udev_event_execute_run(event, 3 * USEC_PER_SEC, USEC_PER_SEC, NULL);
 out:
         if (event != NULL && event->fd_signal >= 0)
                 close(event->fd_signal);
diff --git src/udev/udev-event.c src/udev/udev-event.c
index a883edc..e8d6676 100644
--- src/udev/udev-event.c
+++ src/udev/udev-event.c
@@ -541,6 +541,7 @@ out:
 
 static int spawn_wait(struct udev_event *event,
                       usec_t timeout_usec,
+                      usec_t timeout_warn_usec,
                       const char *cmd, pid_t pid) {
         struct pollfd pfd[1];
         int err = 0;
@@ -550,6 +551,7 @@ static int spawn_wait(struct udev_event *event,
 
         while (pid > 0) {
                 int timeout;
+                int timeout_warn = 0;
                 int fdcount;
 
                 if (timeout_usec > 0) {
@@ -558,13 +560,17 @@ static int spawn_wait(struct udev_event *event,
                         age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
                         if (age_usec >= timeout_usec)
                                 timeout = 1000;
-                        else
-                                timeout = ((timeout_usec - age_usec) / 
USEC_PER_MSEC) + MSEC_PER_SEC;
+                        else {
+                                if (timeout_warn_usec > 0)
+                                        timeout_warn = ((timeout_warn_usec - 
age_usec) / USEC_PER_MSEC) + MSEC_PER_SEC;
+
+                                timeout = ((timeout_usec - timeout_warn_usec - 
age_usec) / USEC_PER_MSEC) + MSEC_PER_SEC;
+                        }
                 } else {
                         timeout = -1;
                 }
 
-                fdcount = poll(pfd, 1, timeout);
+                fdcount = poll(pfd, 1, timeout_warn);
                 if (fdcount < 0) {
                         if (errno == EINTR)
                                 continue;
@@ -573,8 +579,20 @@ static int spawn_wait(struct udev_event *event,
                         goto out;
                 }
                 if (fdcount == 0) {
-                        log_error("timeout: killing '%s' [%u]", cmd, pid);
-                        kill(pid, SIGKILL);
+                        log_warning("slow: '%s' [%u]", cmd, pid);
+
+                        fdcount = poll(pfd, 1, timeout);
+                        if (fdcount < 0) {
+                                if (errno == EINTR)
+                                        continue;
+                                err = -errno;
+                                log_error("failed to poll: %m");
+                                goto out;
+                        }
+                        if (fdcount == 0) {
+                                log_error("timeout: killing '%s' [%u]", cmd, 
pid);
+                                kill(pid, SIGKILL);
+                        }
                 }
 
                 if (pfd[0].revents & POLLIN) {
@@ -654,6 +672,7 @@ out:
 
 int udev_event_spawn(struct udev_event *event,
                      usec_t timeout_usec,
+                     usec_t timeout_warn_usec,
                      const char *cmd, char **envp, const sigset_t *sigmask,
                      char *result, size_t ressize) {
         struct udev *udev = event->udev;
@@ -730,7 +749,7 @@ int udev_event_spawn(struct udev_event *event,
                            outpipe[READ_END], errpipe[READ_END],
                            result, ressize);
 
-                err = spawn_wait(event, timeout_usec, cmd, pid);
+                err = spawn_wait(event, timeout_usec, timeout_warn_usec, cmd, 
pid);
         }
 
 out:
@@ -769,6 +788,7 @@ static int rename_netif(struct udev_event *event) {
 
 void udev_event_execute_rules(struct udev_event *event,
                               usec_t timeout_usec,
+                              usec_t timeout_warn_usec,
                               struct udev_rules *rules, const sigset_t 
*sigmask) {
         struct udev_device *dev = event->dev;
 
@@ -783,7 +803,7 @@ void udev_event_execute_rules(struct udev_event *event,
                 if (major(udev_device_get_devnum(dev)) != 0)
                         udev_watch_end(event->udev, dev);
 
-                udev_rules_apply_to_event(rules, event, timeout_usec, sigmask);
+                udev_rules_apply_to_event(rules, event, timeout_usec, 
timeout_warn_usec, sigmask);
 
                 if (major(udev_device_get_devnum(dev)) != 0)
                         udev_node_remove(dev);
@@ -816,7 +836,7 @@ void udev_event_execute_rules(struct udev_event *event,
                         }
                 }
 
-                udev_rules_apply_to_event(rules, event, timeout_usec, sigmask);
+                udev_rules_apply_to_event(rules, event, timeout_usec, 
timeout_warn_usec, sigmask);
 
                 /* rename a new network interface, if needed */
                 if (udev_device_get_ifindex(dev) > 0 && 
streq(udev_device_get_action(dev), "add") &&
@@ -889,7 +909,7 @@ void udev_event_execute_rules(struct udev_event *event,
         }
 }
 
-void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
const sigset_t *sigmask) {
+void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
usec_t timeout_warn_usec, const sigset_t *sigmask) {
         struct udev_list_entry *list_entry;
 
         udev_list_entry_foreach(list_entry, 
udev_list_get_entry(&event->run_list)) {
@@ -912,7 +932,7 @@ void udev_event_execute_run(struct udev_event *event, 
usec_t timeout_usec, const
 
                         udev_event_apply_format(event, cmd, program, 
sizeof(program));
                         envp = udev_device_get_properties_envp(event->dev);
-                        udev_event_spawn(event, timeout_usec, program, envp, 
sigmask, NULL, 0);
+                        udev_event_spawn(event, timeout_usec, 
timeout_warn_usec, program, envp, sigmask, NULL, 0);
                 }
         }
 }
diff --git src/udev/udev-rules.c src/udev/udev-rules.c
index 9514dde..db95442 100644
--- src/udev/udev-rules.c
+++ src/udev/udev-rules.c
@@ -615,6 +615,7 @@ static int import_file_into_properties(struct udev_device 
*dev, const char *file
 
 static int import_program_into_properties(struct udev_event *event,
                                           usec_t timeout_usec,
+                                          usec_t timeout_warn_usec,
                                           const char *program, const sigset_t 
*sigmask) {
         struct udev_device *dev = event->dev;
         char **envp;
@@ -623,7 +624,7 @@ static int import_program_into_properties(struct udev_event 
*event,
         int err;
 
         envp = udev_device_get_properties_envp(dev);
-        err = udev_event_spawn(event, timeout_usec, program, envp, sigmask, 
result, sizeof(result));
+        err = udev_event_spawn(event, timeout_usec, timeout_warn_usec, 
program, envp, sigmask, result, sizeof(result));
         if (err < 0)
                 return err;
 
@@ -1862,6 +1863,7 @@ enum escape_type {
 int udev_rules_apply_to_event(struct udev_rules *rules,
                               struct udev_event *event,
                               usec_t timeout_usec,
+                              usec_t timeout_warn_usec,
                               const sigset_t *sigmask) {
         struct token *cur;
         struct token *rule;
@@ -2070,7 +2072,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                                   rules_str(rules, rule->rule.filename_off),
                                   rule->rule.filename_line);
 
-                        if (udev_event_spawn(event, timeout_usec, program, 
envp, sigmask, result, sizeof(result)) < 0) {
+                        if (udev_event_spawn(event, timeout_usec, 
timeout_warn_usec, program, envp, sigmask, result, sizeof(result)) < 0) {
                                 if (cur->key.op != OP_NOMATCH)
                                         goto nomatch;
                         } else {
@@ -2106,7 +2108,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules,
                                   rules_str(rules, rule->rule.filename_off),
                                   rule->rule.filename_line);
 
-                        if (import_program_into_properties(event, 
timeout_usec, import, sigmask) != 0)
+                        if (import_program_into_properties(event, 
timeout_usec, timeout_warn_usec, import, sigmask) != 0)
                                 if (cur->key.op != OP_NOMATCH)
                                         goto nomatch;
                         break;
diff --git src/udev/udev.h src/udev/udev.h
index ed01da3..765ba9e 100644
--- src/udev/udev.h
+++ src/udev/udev.h
@@ -73,7 +73,8 @@ struct udev_rules;
 struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names);
 struct udev_rules *udev_rules_unref(struct udev_rules *rules);
 bool udev_rules_check_timestamp(struct udev_rules *rules);
-int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event 
*event, usec_t timeout_usec, const sigset_t *sigmask);
+int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event 
*event, usec_t timeout_usec, usec_t timeout_warn_usec,
+                              const sigset_t *sigmask);
 int udev_rules_apply_static_dev_perms(struct udev_rules *rules);
 
 /* udev-event.c */
@@ -84,10 +85,12 @@ int udev_event_apply_subsys_kernel(struct udev_event 
*event, const char *string,
                                    char *result, size_t maxsize, int 
read_value);
 int udev_event_spawn(struct udev_event *event,
                      usec_t timeout_usec,
+                     usec_t timeout_warn_usec,
                      const char *cmd, char **envp, const sigset_t *sigmask,
                      char *result, size_t ressize);
-void udev_event_execute_rules(struct udev_event *event, usec_t timeout_usec, 
struct udev_rules *rules, const sigset_t *sigset);
-void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
const sigset_t *sigset);
+void udev_event_execute_rules(struct udev_event *event, usec_t timeout_usec, 
usec_t timeout_warn_usec,
+                              struct udev_rules *rules, const sigset_t 
*sigset);
+void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, 
usec_t timeout_warn_usec, const sigset_t *sigset);
 int udev_build_argv(struct udev *udev, char *cmd, int *argc, char *argv[]);
 
 /* udev-watch.c */
diff --git src/udev/udevadm-test.c src/udev/udevadm-test.c
index 809adb6..4738b61 100644
--- src/udev/udevadm-test.c
+++ src/udev/udevadm-test.c
@@ -136,7 +136,7 @@ static int adm_test(struct udev *udev, int argc, char 
*argv[]) {
                 goto out;
         }
 
-        udev_event_execute_rules(event, 60 * USEC_PER_SEC, rules, 
&sigmask_orig);
+        udev_event_execute_rules(event, 60 * USEC_PER_SEC, 20 * USEC_PER_SEC, 
rules, &sigmask_orig);
 
         udev_list_entry_foreach(entry, 
udev_device_get_properties_list_entry(dev))
                 printf("%s=%s\n", udev_list_entry_get_name(entry), 
udev_list_entry_get_value(entry));
--- src/udev/udevd.c
+++ src/udev/udevd.c    2014-09-16 09:01:14.382735997 +0000
@@ -75,6 +75,7 @@ static int children;
 static int children_max;
 static int exec_delay;
 static usec_t event_timeout_usec = 180 * USEC_PER_SEC;
+static usec_t event_timeout_warn_usec = 180 * USEC_PER_SEC / 3;
 static sigset_t sigmask_orig;
 static UDEV_LIST(event_list);
 static UDEV_LIST(worker_list);
@@ -129,6 +130,7 @@ struct worker {
         enum worker_state state;
         struct event *event;
         usec_t event_start_usec;
+        bool event_warned;
 };
 
 /* passed from worker to main process */
@@ -314,9 +316,9 @@ static void worker_new(struct event *eve
                         }
 
                         /* apply rules, create node, symlinks */
-                        udev_event_execute_rules(udev_event, 
event_timeout_usec, rules, &sigmask_orig);
+                        udev_event_execute_rules(udev_event, 
event_timeout_usec, event_timeout_warn_usec, rules, &sigmask_orig);
 
-                        udev_event_execute_run(udev_event, event_timeout_usec, 
&sigmask_orig);
+                        udev_event_execute_run(udev_event, event_timeout_usec, 
event_timeout_warn_usec, &sigmask_orig);
 
                         /* apply/restore inotify watch */
                         if (udev_event->inotify_watch) {
@@ -410,6 +412,7 @@ out:
                 worker->pid = pid;
                 worker->state = WORKER_RUNNING;
                 worker->event_start_usec = now(CLOCK_MONOTONIC);
+                worker->event_warned = false;
                 worker->event = event;
                 event->state = EVENT_RUNNING;
                 udev_list_node_append(&worker->node, &worker_list);
@@ -441,6 +444,7 @@ static void event_run(struct event *even
                 worker->event = event;
                 worker->state = WORKER_RUNNING;
                 worker->event_start_usec = now(CLOCK_MONOTONIC);
+                worker->event_warned = false;
                 event->state = EVENT_RUNNING;
                 return;
         }
@@ -1016,6 +1020,7 @@ static void kernel_cmdline_options(struc
                         exec_delay = strtoul(opt + 16, NULL, 0);
                 } else if (startswith(opt, "udev.event-timeout=")) {
                         event_timeout_usec = strtoul(opt + 16, NULL, 0) * 
USEC_PER_SEC;
+                        event_timeout_warn_usec = (event_timeout_usec / 3) ? : 
1;
                 }
 
                 free(s);
@@ -1078,6 +1083,7 @@ int main(int argc, char *argv[]) {
                         break;
                 case 't':
                         event_timeout_usec = strtoul(optarg, NULL, 0) * 
USEC_PER_SEC;
+                        event_timeout_warn_usec = (event_timeout_usec / 3) ? : 
1;
                         break;
                 case 'D':
                         debug = true;
@@ -1413,21 +1419,29 @@ int main(int argc, char *argv[]) {
                         /* check for hanging events */
                         udev_list_node_foreach(loop, &worker_list) {
                                 struct worker *worker = node_to_worker(loop);
+                                usec_t ts;
 
                                 if (worker->state != WORKER_RUNNING)
                                         continue;
 
-                                if ((now(CLOCK_MONOTONIC) - 
worker->event_start_usec) > event_timeout_usec) {
-                                        log_error("worker [%u] %s timeout; 
kill it", worker->pid, worker->event->devpath);
-                                        kill(worker->pid, SIGKILL);
-                                        worker->state = WORKER_KILLED;
-
-                                        /* drop reference taken for state 
'running' */
-                                        worker_unref(worker);
-                                        log_error("seq %llu '%s' killed", 
udev_device_get_seqnum(worker->event->dev), worker->event->devpath);
-                                        worker->event->exitcode = -64;
-                                        event_queue_delete(worker->event, 
true);
-                                        worker->event = NULL;
+                                ts = now(CLOCK_MONOTONIC);
+
+                                if ((ts - worker->event_start_usec) > 
event_timeout_warn_usec) {
+                                        if ((ts - worker->event_start_usec) > 
event_timeout_usec) {
+                                                log_error("worker [%u] %s 
timeout; kill it", worker->pid, worker->event->devpath);
+                                                kill(worker->pid, SIGKILL);
+                                                worker->state = WORKER_KILLED;
+
+                                                /* drop reference taken for 
state 'running' */
+                                                worker_unref(worker);
+                                                log_error("seq %llu '%s' 
killed", udev_device_get_seqnum(worker->event->dev), worker->event->devpath);
+                                                worker->event->exitcode = -64;
+                                                
event_queue_delete(worker->event, true);
+                                                worker->event = NULL;
+                                        } else if (!worker->event_warned) {
+                                                log_warning("worker [%u] %s is 
taking a long time", worker->pid, worker->event->devpath);
+                                                worker->event_warned = true;
+                                        }
                                 }
                         }
 
-- 
1.7.9.2

++++++ 1078-udev-remove-userspace-firmware-loading-support.patch ++++++
>From be2ea723b1d023b3d385d3b791ee4607cbfb20ca Mon Sep 17 00:00:00 2001
From: Kay Sievers <[email protected]>
Date: Sat, 30 Aug 2014 11:34:20 +0200
Subject: [PATCH] udev: remove userspace firmware loading support

---
 Makefile.am                      |  12 ---
 README                           |   9 +--
 TODO                             |   1 -
 configure.ac                     |  20 -----
 src/udev/udev-builtin-firmware.c | 154 ---------------------------------------
 src/udev/udev-builtin.c          |   3 -
 src/udev/udev.h                  |   6 --
 src/udev/udevd.c                 |  13 ----

Index: systemd-210/configure.ac
===================================================================
--- systemd-210.orig/configure.ac
+++ systemd-210/configure.ac
@@ -902,25 +902,6 @@ if test "x$have_myhostname" != "xno"; th
 fi
 
 # 
------------------------------------------------------------------------------
-AC_ARG_WITH(firmware-path,
-       AS_HELP_STRING([--with-firmware-path=DIR[[[:DIR[...]]]]],
-          [Firmware search path (default="")]),
-       [], [with_firmware_path=""])
-OLD_IFS=$IFS
-IFS=:
-for i in $with_firmware_path; do
-       if test "x${FIRMWARE_PATH}" = "x"; then
-              FIRMWARE_PATH="\\\"${i}/\\\""
-       else
-              FIRMWARE_PATH="${FIRMWARE_PATH}, \\\"${i}/\\\""
-       fi
-done
-IFS=$OLD_IFS
-AC_SUBST(FIRMWARE_PATH)
-AS_IF([test "x${FIRMWARE_PATH}" != "x"], [ AC_DEFINE(HAVE_FIRMWARE, 1, [Define 
if FIRMWARE is available]) ])
-AM_CONDITIONAL(ENABLE_FIRMWARE, [test "x${FIRMWARE_PATH}" != "x"])
-
-# 
------------------------------------------------------------------------------
 AC_ARG_ENABLE([gudev],
        AS_HELP_STRING([--disable-gudev], [disable Gobject libudev support 
@<:@default=enabled@:>@]),
        [], [enable_gudev=yes])
@@ -1137,7 +1118,6 @@ AC_MSG_RESULT([
         Build Python:            ${PYTHON}
         Installation Python:     ${PYTHON_BINARY}
         sphinx binary:           ${SPHINX_BUILD}
-        firmware path:           ${FIRMWARE_PATH}
         PAM modules dir:         ${with_pamlibdir}
         PAM configuration dir:   ${with_pamconfdir}
         D-Bus policy dir:        ${with_dbuspolicydir}
Index: systemd-210/Makefile.am
===================================================================
--- systemd-210.orig/Makefile.am
+++ systemd-210/Makefile.am
@@ -2677,18 +2677,6 @@ libudev_core_la_LIBADD = \
        $(BLKID_LIBS) \
        $(KMOD_LIBS)
 
-libudev_core_la_CPPFLAGS = \
-       $(AM_CPPFLAGS) \
-       -DFIRMWARE_PATH="$(FIRMWARE_PATH)"
-
-if ENABLE_FIRMWARE
-libudev_core_la_SOURCES += \
-       src/udev/udev-builtin-firmware.c
-
-dist_udevrules_DATA += \
-       rules/50-firmware.rules
-endif
-
 if HAVE_KMOD
 libudev_core_la_SOURCES += \
        src/udev/udev-builtin-kmod.c
Index: systemd-210/README
===================================================================
--- systemd-210.orig/README
+++ systemd-210/README
@@ -51,14 +51,14 @@ REQUIREMENTS:
 
         Linux kernel >= 3.8 for Smack support
 
-        Udev will fail to work with the legacy layout:
+        Udev will fail to work with the legacy sysfs layout:
           CONFIG_SYSFS_DEPRECATED=n
 
         Legacy hotplug slows down the system and confuses udev:
           CONFIG_UEVENT_HELPER_PATH=""
 
-        Userspace firmware loading is deprecated, will go away, and
-        sometimes causes problems:
+        Userspace firmware loading is not supported and should
+        be disabled in the kernel
           CONFIG_FW_LOADER_USER_HELPER=n
 
         Some udev rules and virtualization detection relies on it:
Index: systemd-210/src/udev/udev-builtin.c
===================================================================
--- systemd-210.orig/src/udev/udev-builtin.c
+++ systemd-210/src/udev/udev-builtin.c
@@ -34,9 +34,6 @@ static const struct udev_builtin *builti
         [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
 #endif
         [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
-#ifdef HAVE_FIRMWARE
-        [UDEV_BUILTIN_FIRMWARE] = &udev_builtin_firmware,
-#endif
         [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
         [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
         [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard,
Index: systemd-210/src/udev/udev-builtin-firmware.c
===================================================================
--- systemd-210.orig/src/udev/udev-builtin-firmware.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * firmware - Kernel firmware loader
- *
- * Copyright (C) 2009 Piter Punk <[email protected]>
- * Copyright (C) 2009-2011 Kay Sievers <[email protected]>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details:*
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <getopt.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <sys/utsname.h>
-#include <sys/stat.h>
-
-#include "udev.h"
-
-static bool set_loading(struct udev *udev, char *loadpath, const char *state)
-{
-        FILE *ldfile;
-
-        ldfile = fopen(loadpath, "we");
-        if (ldfile == NULL) {
-                log_error("error: can not open '%s'", loadpath);
-                return false;
-        };
-        fprintf(ldfile, "%s\n", state);
-        fclose(ldfile);
-        return true;
-}
-
-static bool copy_firmware(struct udev *udev, const char *source, const char 
*target, size_t size)
-{
-        char *buf;
-        FILE *fsource = NULL, *ftarget = NULL;
-        bool ret = false;
-
-        buf = malloc(size);
-        if (buf == NULL) {
-                log_error("No memory available to load firmware file");
-                return false;
-        }
-
-        log_debug("writing '%s' (%zi) to '%s'", source, size, target);
-
-        fsource = fopen(source, "re");
-        if (fsource == NULL)
-                goto exit;
-        ftarget = fopen(target, "we");
-        if (ftarget == NULL)
-                goto exit;
-        if (fread(buf, size, 1, fsource) != 1)
-                goto exit;
-        if (fwrite(buf, size, 1, ftarget) == 1)
-                ret = true;
-exit:
-        if (ftarget != NULL)
-                fclose(ftarget);
-        if (fsource != NULL)
-                fclose(fsource);
-        free(buf);
-        return ret;
-}
-
-static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], 
bool test)
-{
-        struct udev *udev = udev_device_get_udev(dev);
-        static const char *searchpath[] = { FIRMWARE_PATH };
-        char loadpath[UTIL_PATH_SIZE];
-        char datapath[UTIL_PATH_SIZE];
-        char fwpath[UTIL_PATH_SIZE];
-        const char *firmware;
-        FILE *fwfile = NULL;
-        struct utsname kernel;
-        struct stat statbuf;
-        unsigned int i;
-        int rc = EXIT_SUCCESS;
-
-        firmware = udev_device_get_property_value(dev, "FIRMWARE");
-        if (firmware == NULL) {
-                log_error("firmware parameter missing");
-                rc = EXIT_FAILURE;
-                goto exit;
-        }
-
-        /* lookup firmware file */
-        uname(&kernel);
-        for (i = 0; i < ELEMENTSOF(searchpath); i++) {
-                strscpyl(fwpath, sizeof(fwpath), searchpath[i], 
kernel.release, "/", firmware, NULL);
-                fwfile = fopen(fwpath, "re");
-                if (fwfile != NULL)
-                        break;
-
-                strscpyl(fwpath, sizeof(fwpath), searchpath[i], firmware, 
NULL);
-                fwfile = fopen(fwpath, "re");
-                if (fwfile != NULL)
-                        break;
-        }
-
-        strscpyl(loadpath, sizeof(loadpath), udev_device_get_syspath(dev), 
"/loading", NULL);
-
-        if (fwfile == NULL) {
-                log_debug("did not find firmware file '%s'", firmware);
-                rc = EXIT_FAILURE;
-                /*
-                 * Do not cancel the request in the initrd, the real root 
might have
-                 * the firmware file and the 'coldplug' run in the real root 
will find
-                 * this pending request and fulfill or cancel it.
-                 * */
-                if (!in_initrd())
-                        set_loading(udev, loadpath, "-1");
-                goto exit;
-        }
-
-        if (stat(fwpath, &statbuf) < 0 || statbuf.st_size == 0) {
-                if (!in_initrd())
-                        set_loading(udev, loadpath, "-1");
-                rc = EXIT_FAILURE;
-                goto exit;
-        }
-
-        if (!set_loading(udev, loadpath, "1"))
-                goto exit;
-
-        strscpyl(datapath, sizeof(datapath), udev_device_get_syspath(dev), 
"/data", NULL);
-        if (!copy_firmware(udev, fwpath, datapath, statbuf.st_size)) {
-                log_error("error sending firmware '%s' to device", firmware);
-                set_loading(udev, loadpath, "-1");
-                rc = EXIT_FAILURE;
-                goto exit;
-        };
-
-        set_loading(udev, loadpath, "0");
-exit:
-        if (fwfile)
-                fclose(fwfile);
-        return rc;
-}
-
-const struct udev_builtin udev_builtin_firmware = {
-        .name = "firmware",
-        .cmd = builtin_firmware,
-        .help = "kernel firmware loader",
-        .run_once = true,
-};
Index: systemd-210/src/udev/udevd.c
===================================================================
--- systemd-210.orig/src/udev/udevd.c
+++ systemd-210/src/udev/udevd.c
@@ -100,9 +100,6 @@ struct event {
         dev_t devnum;
         int ifindex;
         bool is_block;
-#ifdef HAVE_FIRMWARE
-        bool nodelay;
-#endif
 };
 
 static inline struct event *node_to_event(struct udev_list_node *node)
@@ -474,10 +471,6 @@ static int event_queue_insert(struct ude
         event->devnum = udev_device_get_devnum(dev);
         event->is_block = streq("block", udev_device_get_subsystem(dev));
         event->ifindex = udev_device_get_ifindex(dev);
-#ifdef HAVE_FIRMWARE
-        if (streq(udev_device_get_subsystem(dev), "firmware"))
-                event->nodelay = true;
-#endif
 
         udev_queue_export_device_queued(udev_queue_export, dev);
         log_debug("seq %llu queued, '%s' '%s'", udev_device_get_seqnum(dev),
@@ -557,12 +550,6 @@ static bool is_devpath_busy(struct event
                         return true;
                 }
 
-#ifdef HAVE_FIRMWARE
-                /* allow to bypass the dependency tracking */
-                if (event->nodelay)
-                        continue;
-#endif
-
                 /* parent device event found */
                 if (event->devpath[common] == '/') {
                         event->delaying_seqnum = loop_event->seqnum;
Index: systemd-210/src/udev/udev.h
===================================================================
--- systemd-210.orig/src/udev/udev.h
+++ systemd-210/src/udev/udev.h
@@ -141,9 +141,6 @@ enum udev_builtin_cmd {
         UDEV_BUILTIN_BLKID,
 #endif
         UDEV_BUILTIN_BTRFS,
-#ifdef HAVE_FIRMWARE
-        UDEV_BUILTIN_FIRMWARE,
-#endif
         UDEV_BUILTIN_HWDB,
         UDEV_BUILTIN_INPUT_ID,
         UDEV_BUILTIN_KEYBOARD,
@@ -172,9 +169,6 @@ struct udev_builtin {
 extern const struct udev_builtin udev_builtin_blkid;
 #endif
 extern const struct udev_builtin udev_builtin_btrfs;
-#ifdef HAVE_FIRMWARE
-extern const struct udev_builtin udev_builtin_firmware;
-#endif
 extern const struct udev_builtin udev_builtin_hwdb;
 extern const struct udev_builtin udev_builtin_input_id;
 extern const struct udev_builtin udev_builtin_keyboard;
Index: systemd-210/TODO
===================================================================
--- systemd-210.orig/TODO
+++ systemd-210/TODO
@@ -541,7 +541,6 @@ Features:
 * ExecOnFailure=/usr/bin/foo
 
 * udev:
-  - remove src/udev/udev-builtin-firmware.c (CONFIG_FW_LOADER_USER_HELPER=n)
   - move to LGPL
   - kill scsi_id
   - add trigger --subsystem-match=usb/usb_device device

++++++ 1079-udev-remove-userspace-firmware-loading-support.patch ++++++
>From be2ea723b1d023b3d385d3b791ee4607cbfb20ca Mon Sep 17 00:00:00 2001
From: Kay Sievers <[email protected]>
Date: Sat, 30 Aug 2014 11:34:20 +0200
Subject: [PATCH] udev: remove userspace firmware loading support

---
 Makefile.am                      |  12 ---
 README                           |   9 +--
 TODO                             |   1 -
 configure.ac                     |  20 -----
 src/udev/udev-builtin-firmware.c | 154 ---------------------------------------
 src/udev/udev-builtin.c          |   3 -
 src/udev/udev.h                  |   6 --
 src/udev/udevd.c                 |  13 ----

Index: systemd-210/configure.ac
===================================================================
--- systemd-210.orig/configure.ac
+++ systemd-210/configure.ac
@@ -902,25 +902,6 @@ if test "x$have_myhostname" != "xno"; th
 fi
 
 # 
------------------------------------------------------------------------------
-AC_ARG_WITH(firmware-path,
-       AS_HELP_STRING([--with-firmware-path=DIR[[[:DIR[...]]]]],
-          [Firmware search path (default="")]),
-       [], [with_firmware_path=""])
-OLD_IFS=$IFS
-IFS=:
-for i in $with_firmware_path; do
-       if test "x${FIRMWARE_PATH}" = "x"; then
-              FIRMWARE_PATH="\\\"${i}/\\\""
-       else
-              FIRMWARE_PATH="${FIRMWARE_PATH}, \\\"${i}/\\\""
-       fi
-done
-IFS=$OLD_IFS
-AC_SUBST(FIRMWARE_PATH)
-AS_IF([test "x${FIRMWARE_PATH}" != "x"], [ AC_DEFINE(HAVE_FIRMWARE, 1, [Define 
if FIRMWARE is available]) ])
-AM_CONDITIONAL(ENABLE_FIRMWARE, [test "x${FIRMWARE_PATH}" != "x"])
-
-# 
------------------------------------------------------------------------------
 AC_ARG_ENABLE([gudev],
        AS_HELP_STRING([--disable-gudev], [disable Gobject libudev support 
@<:@default=enabled@:>@]),
        [], [enable_gudev=yes])
@@ -1137,7 +1118,6 @@ AC_MSG_RESULT([
         Build Python:            ${PYTHON}
         Installation Python:     ${PYTHON_BINARY}
         sphinx binary:           ${SPHINX_BUILD}
-        firmware path:           ${FIRMWARE_PATH}
         PAM modules dir:         ${with_pamlibdir}
         PAM configuration dir:   ${with_pamconfdir}
         D-Bus policy dir:        ${with_dbuspolicydir}
Index: systemd-210/Makefile.am
===================================================================
--- systemd-210.orig/Makefile.am
+++ systemd-210/Makefile.am
@@ -2677,18 +2677,6 @@ libudev_core_la_LIBADD = \
        $(BLKID_LIBS) \
        $(KMOD_LIBS)
 
-libudev_core_la_CPPFLAGS = \
-       $(AM_CPPFLAGS) \
-       -DFIRMWARE_PATH="$(FIRMWARE_PATH)"
-
-if ENABLE_FIRMWARE
-libudev_core_la_SOURCES += \
-       src/udev/udev-builtin-firmware.c
-
-dist_udevrules_DATA += \
-       rules/50-firmware.rules
-endif
-
 if HAVE_KMOD
 libudev_core_la_SOURCES += \
        src/udev/udev-builtin-kmod.c
Index: systemd-210/README
===================================================================
--- systemd-210.orig/README
+++ systemd-210/README
@@ -51,14 +51,14 @@ REQUIREMENTS:
 
         Linux kernel >= 3.8 for Smack support
 
-        Udev will fail to work with the legacy layout:
+        Udev will fail to work with the legacy sysfs layout:
           CONFIG_SYSFS_DEPRECATED=n
 
         Legacy hotplug slows down the system and confuses udev:
           CONFIG_UEVENT_HELPER_PATH=""
 
-        Userspace firmware loading is deprecated, will go away, and
-        sometimes causes problems:
+        Userspace firmware loading is not supported and should
+        be disabled in the kernel
           CONFIG_FW_LOADER_USER_HELPER=n
 
         Some udev rules and virtualization detection relies on it:
Index: systemd-210/src/udev/udev-builtin.c
===================================================================
--- systemd-210.orig/src/udev/udev-builtin.c
+++ systemd-210/src/udev/udev-builtin.c
@@ -34,9 +34,6 @@ static const struct udev_builtin *builti
         [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
 #endif
         [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
-#ifdef HAVE_FIRMWARE
-        [UDEV_BUILTIN_FIRMWARE] = &udev_builtin_firmware,
-#endif
         [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
         [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
         [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard,
Index: systemd-210/src/udev/udev-builtin-firmware.c
===================================================================
--- systemd-210.orig/src/udev/udev-builtin-firmware.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * firmware - Kernel firmware loader
- *
- * Copyright (C) 2009 Piter Punk <[email protected]>
- * Copyright (C) 2009-2011 Kay Sievers <[email protected]>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details:*
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <getopt.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <sys/utsname.h>
-#include <sys/stat.h>
-
-#include "udev.h"
-
-static bool set_loading(struct udev *udev, char *loadpath, const char *state)
-{
-        FILE *ldfile;
-
-        ldfile = fopen(loadpath, "we");
-        if (ldfile == NULL) {
-                log_error("error: can not open '%s'", loadpath);
-                return false;
-        };
-        fprintf(ldfile, "%s\n", state);
-        fclose(ldfile);
-        return true;
-}
-
-static bool copy_firmware(struct udev *udev, const char *source, const char 
*target, size_t size)
-{
-        char *buf;
-        FILE *fsource = NULL, *ftarget = NULL;
-        bool ret = false;
-
-        buf = malloc(size);
-        if (buf == NULL) {
-                log_error("No memory available to load firmware file");
-                return false;
-        }
-
-        log_debug("writing '%s' (%zi) to '%s'", source, size, target);
-
-        fsource = fopen(source, "re");
-        if (fsource == NULL)
-                goto exit;
-        ftarget = fopen(target, "we");
-        if (ftarget == NULL)
-                goto exit;
-        if (fread(buf, size, 1, fsource) != 1)
-                goto exit;
-        if (fwrite(buf, size, 1, ftarget) == 1)
-                ret = true;
-exit:
-        if (ftarget != NULL)
-                fclose(ftarget);
-        if (fsource != NULL)
-                fclose(fsource);
-        free(buf);
-        return ret;
-}
-
-static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], 
bool test)
-{
-        struct udev *udev = udev_device_get_udev(dev);
-        static const char *searchpath[] = { FIRMWARE_PATH };
-        char loadpath[UTIL_PATH_SIZE];
-        char datapath[UTIL_PATH_SIZE];
-        char fwpath[UTIL_PATH_SIZE];
-        const char *firmware;
-        FILE *fwfile = NULL;
-        struct utsname kernel;
-        struct stat statbuf;
-        unsigned int i;
-        int rc = EXIT_SUCCESS;
-
-        firmware = udev_device_get_property_value(dev, "FIRMWARE");
-        if (firmware == NULL) {
-                log_error("firmware parameter missing");
-                rc = EXIT_FAILURE;
-                goto exit;
-        }
-
-        /* lookup firmware file */
-        uname(&kernel);
-        for (i = 0; i < ELEMENTSOF(searchpath); i++) {
-                strscpyl(fwpath, sizeof(fwpath), searchpath[i], 
kernel.release, "/", firmware, NULL);
-                fwfile = fopen(fwpath, "re");
-                if (fwfile != NULL)
-                        break;
-
-                strscpyl(fwpath, sizeof(fwpath), searchpath[i], firmware, 
NULL);
-                fwfile = fopen(fwpath, "re");
-                if (fwfile != NULL)
-                        break;
-        }
-
-        strscpyl(loadpath, sizeof(loadpath), udev_device_get_syspath(dev), 
"/loading", NULL);
-
-        if (fwfile == NULL) {
-                log_debug("did not find firmware file '%s'", firmware);
-                rc = EXIT_FAILURE;
-                /*
-                 * Do not cancel the request in the initrd, the real root 
might have
-                 * the firmware file and the 'coldplug' run in the real root 
will find
-                 * this pending request and fulfill or cancel it.
-                 * */
-                if (!in_initrd())
-                        set_loading(udev, loadpath, "-1");
-                goto exit;
-        }
-
-        if (stat(fwpath, &statbuf) < 0 || statbuf.st_size == 0) {
-                if (!in_initrd())
-                        set_loading(udev, loadpath, "-1");
-                rc = EXIT_FAILURE;
-                goto exit;
-        }
-
-        if (!set_loading(udev, loadpath, "1"))
-                goto exit;
-
-        strscpyl(datapath, sizeof(datapath), udev_device_get_syspath(dev), 
"/data", NULL);
-        if (!copy_firmware(udev, fwpath, datapath, statbuf.st_size)) {
-                log_error("error sending firmware '%s' to device", firmware);
-                set_loading(udev, loadpath, "-1");
-                rc = EXIT_FAILURE;
-                goto exit;
-        };
-
-        set_loading(udev, loadpath, "0");
-exit:
-        if (fwfile)
-                fclose(fwfile);
-        return rc;
-}
-
-const struct udev_builtin udev_builtin_firmware = {
-        .name = "firmware",
-        .cmd = builtin_firmware,
-        .help = "kernel firmware loader",
-        .run_once = true,
-};
Index: systemd-210/src/udev/udevd.c
===================================================================
--- systemd-210.orig/src/udev/udevd.c
+++ systemd-210/src/udev/udevd.c
@@ -100,9 +100,6 @@ struct event {
         dev_t devnum;
         int ifindex;
         bool is_block;
-#ifdef HAVE_FIRMWARE
-        bool nodelay;
-#endif
 };
 
 static inline struct event *node_to_event(struct udev_list_node *node)
@@ -474,10 +471,6 @@ static int event_queue_insert(struct ude
         event->devnum = udev_device_get_devnum(dev);
         event->is_block = streq("block", udev_device_get_subsystem(dev));
         event->ifindex = udev_device_get_ifindex(dev);
-#ifdef HAVE_FIRMWARE
-        if (streq(udev_device_get_subsystem(dev), "firmware"))
-                event->nodelay = true;
-#endif
 
         log_debug("seq %llu queued, '%s' '%s'", udev_device_get_seqnum(dev),
              udev_device_get_action(dev), udev_device_get_subsystem(dev));
@@ -557,12 +550,6 @@ static bool is_devpath_busy(struct event
                         return true;
                 }
 
-#ifdef HAVE_FIRMWARE
-                /* allow to bypass the dependency tracking */
-                if (event->nodelay)
-                        continue;
-#endif
-
                 /* parent device event found */
                 if (event->devpath[common] == '/') {
                         event->delaying_seqnum = loop_event->seqnum;
Index: systemd-210/src/udev/udev.h
===================================================================
--- systemd-210.orig/src/udev/udev.h
+++ systemd-210/src/udev/udev.h
@@ -141,9 +141,6 @@ enum udev_builtin_cmd {
         UDEV_BUILTIN_BLKID,
 #endif
         UDEV_BUILTIN_BTRFS,
-#ifdef HAVE_FIRMWARE
-        UDEV_BUILTIN_FIRMWARE,
-#endif
         UDEV_BUILTIN_HWDB,
         UDEV_BUILTIN_INPUT_ID,
         UDEV_BUILTIN_KEYBOARD,
@@ -172,9 +169,6 @@ struct udev_builtin {
 extern const struct udev_builtin udev_builtin_blkid;
 #endif
 extern const struct udev_builtin udev_builtin_btrfs;
-#ifdef HAVE_FIRMWARE
-extern const struct udev_builtin udev_builtin_firmware;
-#endif
 extern const struct udev_builtin udev_builtin_hwdb;
 extern const struct udev_builtin udev_builtin_input_id;
 extern const struct udev_builtin udev_builtin_keyboard;
Index: systemd-210/TODO
===================================================================
--- systemd-210.orig/TODO
+++ systemd-210/TODO
@@ -541,7 +541,6 @@ Features:
 * ExecOnFailure=/usr/bin/foo
 
 * udev:
-  - remove src/udev/udev-builtin-firmware.c (CONFIG_FW_LOADER_USER_HELPER=n)
   - move to LGPL
   - kill scsi_id
   - add trigger --subsystem-match=usb/usb_device device

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to