mdev: tell kernel that we didn't find the firmware
authorChristoph Lohmann <20h@r-36.net>
Sat, 19 May 2012 21:39:45 +0000 (23:39 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 19 May 2012 21:39:45 +0000 (23:39 +0200)
function                                             old     new   delta
mdev_main                                            797     801      +4

Signed-off-by: Christoph Lohmann <20h@r-36.net>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
util-linux/mdev.c

index 84e72e2e6462ebedffa1146c1b16e23a9686be4d..79871d30e0c0badb2cd5300d70774a5e00b17224 100644 (file)
@@ -756,37 +756,45 @@ static int FAST_FUNC dirAction(const char *fileName UNUSED_PARAM,
 static void load_firmware(const char *firmware, const char *sysfs_path)
 {
        int cnt;
-       int firmware_fd, loading_fd, data_fd;
+       int firmware_fd, loading_fd;
 
        /* check for /lib/firmware/$FIRMWARE */
        xchdir("/lib/firmware");
-       firmware_fd = xopen(firmware, O_RDONLY);
-
-       /* in case we goto out ... */
-       data_fd = -1;
+       firmware_fd = open(firmware, O_RDONLY); /* can fail */
 
        /* check for /sys/$DEVPATH/loading ... give 30 seconds to appear */
        xchdir(sysfs_path);
        for (cnt = 0; cnt < 30; ++cnt) {
                loading_fd = open("loading", O_WRONLY);
-               if (loading_fd != -1)
+               if (loading_fd >= 0)
                        goto loading;
                sleep(1);
        }
        goto out;
 
  loading:
-       /* tell kernel we're loading by "echo 1 > /sys/$DEVPATH/loading" */
-       if (full_write(loading_fd, "1", 1) != 1)
-               goto out;
-
-       /* load firmware into /sys/$DEVPATH/data */
-       data_fd = open("data", O_WRONLY);
-       if (data_fd == -1)
-               goto out;
-       cnt = bb_copyfd_eof(firmware_fd, data_fd);
+       cnt = 0;
+       if (firmware_fd >= 0) {
+               int data_fd;
+
+               /* tell kernel we're loading by "echo 1 > /sys/$DEVPATH/loading" */
+               if (full_write(loading_fd, "1", 1) != 1)
+                       goto out;
+
+               /* load firmware into /sys/$DEVPATH/data */
+               data_fd = open("data", O_WRONLY);
+               if (data_fd < 0)
+                       goto out;
+               cnt = bb_copyfd_eof(firmware_fd, data_fd);
+               if (ENABLE_FEATURE_CLEAN_UP)
+                       close(data_fd);
+       }
 
-       /* tell kernel result by "echo [0|-1] > /sys/$DEVPATH/loading" */
+       /* Tell kernel result by "echo [0|-1] > /sys/$DEVPATH/loading"
+        * Note: we emit -1 also if firmware file wasn't found.
+        * There are cases when otherwise kernel would wait for minutes
+        * before timing out.
+        */
        if (cnt > 0)
                full_write(loading_fd, "0", 1);
        else
@@ -796,7 +804,6 @@ static void load_firmware(const char *firmware, const char *sysfs_path)
        if (ENABLE_FEATURE_CLEAN_UP) {
                close(firmware_fd);
                close(loading_fd);
-               close(data_fd);
        }
 }