chiark / gitweb /
udev: firmware - disable firmware loading when firmware file is 0 byte
[elogind.git] / src / udev / udev-builtin-firmware.c
index 5ba712c89d64ba9d254741431fd986292c2e46aa..4a91d33575d7c0f21795de0926498320f728420f 100644 (file)
@@ -2,7 +2,7 @@
  * firmware - Kernel firmware loader
  *
  * Copyright (C) 2009 Piter Punk <piterpunk@slackware.com>
- * Copyright (C) 2009-2011 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2009-2011 Kay Sievers <kay@vrfy.org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -112,7 +112,7 @@ static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], boo
         }
 
         util_path_encode(firmware, fwencpath, sizeof(fwencpath));
-        util_strscpyl(misspath, sizeof(misspath), udev_get_run_path(udev), "/firmware-missing/", fwencpath, NULL);
+        util_strscpyl(misspath, sizeof(misspath), "/run/udev/firmware-missing/", fwencpath, NULL);
         util_strscpyl(loadpath, sizeof(loadpath), udev_device_get_syspath(dev), "/loading", NULL);
 
         if (fwfile == NULL) {
@@ -121,7 +121,7 @@ static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], boo
                 /* This link indicates the missing firmware file and the associated device */
                 log_debug("did not find firmware file '%s'\n", firmware);
                 do {
-                        err = util_create_path(udev, misspath);
+                        err = mkdir_parents(misspath, 0755);
                         if (err != 0 && err != -ENOENT)
                                 break;
                         err = symlink(udev_device_get_devpath(dev), misspath);
@@ -129,14 +129,23 @@ static int builtin_firmware(struct udev_device *dev, int argc, char *argv[], boo
                                 err = -errno;
                 } while (err == -ENOENT);
                 rc = EXIT_FAILURE;
-                set_loading(udev, loadpath, "-1");
+                /*
+                 * 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 (unlink(misspath) == 0)
                 util_delete_path(udev, misspath);