Date: Sunday, January 31, 2010 @ 07:38:25
  Author: thomas
Revision: 66508

Fix a bug in the new firmware loader

When a firmware file is not found, the firmware loader does not properly report 
error to the kernel, resulting in a 60 second stall during modprobe.

Added:
  udev/trunk/firmware-loader-fix-missing-firmware.patch
Modified:
  udev/trunk/PKGBUILD

--------------------------------------------+
 PKGBUILD                                   |   11 ++++++++---
 firmware-loader-fix-missing-firmware.patch |   27 +++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2010-01-31 12:18:33 UTC (rev 66507)
+++ PKGBUILD    2010-01-31 12:38:25 UTC (rev 66508)
@@ -6,7 +6,7 @@
 pkgbase="udev"
 pkgname=('udev' 'udev-compat')
 pkgver=151
-pkgrel=1
+pkgrel=2
 arch=(i686 x86_64)
 url="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html";
 license=('GPL')
@@ -16,17 +16,22 @@
 makedepends=('glibc' 'coreutils' 'util-linux' 'libusb' 'glib2' 'kernel26' 
'gperf' 'libxslt' 'gobject-introspection')
 
source=(http://www.kernel.org/pub/linux/utils/kernel/hotplug/$pkgname-$pkgver.tar.bz2
         81-arch.rules load-modules.sh cdsymlinks.sh root-link.sh
-        arch-udev-rules.patch ignore-remove.sh)
+        arch-udev-rules.patch ignore-remove.sh
+        firmware-loader-fix-missing-firmware.patch)
 md5sums=('aeae0e6273dcbec246c3c1b9868ebed1'
          '6393ee81993f8b9beb776ca904005864'
          'a2d0d59742b80b3b28ed498718654eb7'
          '2e808ee78d237c478b57af2a68d43769'
          '2d6dc6842464f107bccc68cd505a6c31'
          '22c1f059cdeddaac5e7fe33b007da6a3'
-         '35fa97500243a79b2370fa4684828e69')
+         '35fa97500243a79b2370fa4684828e69'
+         'ec1fa2ecaff2e8efc611cb70568630ad')
 
 build() {
   cd $srcdir/$pkgname-$pkgver
+  # The new firmware loader has a bug where modprobe will hang 60 seconds when 
a
+  # firmware file is missing. Fix this by properly reporting error to the 
kernel
+  patch -p1 -i "$srcdir"/firmware-loader-fix-missing-firmware.patch || return 1
   ./configure --prefix="" --mandir=/usr/share/man\
                           --includedir=/usr/include\
                           --libexecdir=/lib/udev\

Added: firmware-loader-fix-missing-firmware.patch
===================================================================
--- firmware-loader-fix-missing-firmware.patch                          (rev 0)
+++ firmware-loader-fix-missing-firmware.patch  2010-01-31 12:38:25 UTC (rev 
66508)
@@ -0,0 +1,27 @@
+diff -Nur udev-151.orig/extras/firmware/firmware.c 
udev-151/extras/firmware/firmware.c
+--- udev-151.orig/extras/firmware/firmware.c   2009-12-15 16:19:30.000000000 
+0100
++++ udev-151/extras/firmware/firmware.c        2010-01-31 13:17:09.195896260 
+0100
+@@ -149,6 +149,7 @@
+ 
+       util_path_encode(firmware, fwencpath, sizeof(fwencpath));
+       util_strscpyl(misspath, sizeof(misspath), udev_get_dev_path(udev), 
"/.udev/firmware-missing/", fwencpath, NULL);
++      util_strscpyl(loadpath, sizeof(loadpath), udev_get_sys_path(udev), 
devpath, "/loading", NULL);
+ 
+       if (fwfile == NULL) {
+               int err;
+@@ -166,6 +167,7 @@
+                       udev_selinux_resetfscreatecon(udev);
+               } while (err == -ENOENT);
+               rc = 2;
++              set_loading(udev, loadpath, "-1");
+               goto exit;
+       }
+ 
+@@ -176,7 +178,6 @@
+       if (unlink(misspath) == 0)
+               util_delete_path(udev, misspath);
+ 
+-      util_strscpyl(loadpath, sizeof(loadpath), udev_get_sys_path(udev), 
devpath, "/loading", NULL);
+       set_loading(udev, loadpath, "1");
+ 
+       util_strscpyl(datapath, sizeof(datapath), udev_get_sys_path(udev), 
devpath, "/data", NULL);

Reply via email to