]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/base/firmware_class.c
[PATCH] knfsd: Avoid excess stack usage in svc_tcp_recvfrom
[linux-2.6-omap-h63xx.git] / drivers / base / firmware_class.c
index 0c99ae6a340728bb55efc503aca6b9bb92e26860..14615694ae9aa3e707435f2f04a1c6dde4586c5c 100644 (file)
@@ -15,7 +15,8 @@
 #include <linux/vmalloc.h>
 #include <linux/interrupt.h>
 #include <linux/bitops.h>
-#include <asm/semaphore.h>
+#include <linux/mutex.h>
+#include <linux/kthread.h>
 
 #include <linux/firmware.h>
 #include "base.h"
@@ -36,7 +37,7 @@ static int loading_timeout = 10;      /* In seconds */
 
 /* fw_lock could be moved to 'struct firmware_priv' but since it is just
  * guarding for corner cases a global lock should be OK */
-static DECLARE_MUTEX(fw_lock);
+static DEFINE_MUTEX(fw_lock);
 
 struct firmware_priv {
        char fw_id[FIRMWARE_NAME_MAX];
@@ -142,9 +143,9 @@ firmware_loading_store(struct class_device *class_dev,
 
        switch (loading) {
        case 1:
-               down(&fw_lock);
+               mutex_lock(&fw_lock);
                if (!fw_priv->fw) {
-                       up(&fw_lock);
+                       mutex_unlock(&fw_lock);
                        break;
                }
                vfree(fw_priv->fw->data);
@@ -152,7 +153,7 @@ firmware_loading_store(struct class_device *class_dev,
                fw_priv->fw->size = 0;
                fw_priv->alloc_size = 0;
                set_bit(FW_STATUS_LOADING, &fw_priv->status);
-               up(&fw_lock);
+               mutex_unlock(&fw_lock);
                break;
        case 0:
                if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) {
@@ -185,7 +186,7 @@ firmware_data_read(struct kobject *kobj,
        struct firmware *fw;
        ssize_t ret_count = count;
 
-       down(&fw_lock);
+       mutex_lock(&fw_lock);
        fw = fw_priv->fw;
        if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) {
                ret_count = -ENODEV;
@@ -200,7 +201,7 @@ firmware_data_read(struct kobject *kobj,
 
        memcpy(buffer, fw->data + offset, ret_count);
 out:
-       up(&fw_lock);
+       mutex_unlock(&fw_lock);
        return ret_count;
 }
 
@@ -253,7 +254,7 @@ firmware_data_write(struct kobject *kobj,
        if (!capable(CAP_SYS_RAWIO))
                return -EPERM;
 
-       down(&fw_lock);
+       mutex_lock(&fw_lock);
        fw = fw_priv->fw;
        if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) {
                retval = -ENODEV;
@@ -268,7 +269,7 @@ firmware_data_write(struct kobject *kobj,
        fw->size = max_t(size_t, offset + count, fw->size);
        retval = count;
 out:
-       up(&fw_lock);
+       mutex_unlock(&fw_lock);
        return retval;
 }
 
@@ -436,14 +437,14 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
        } else
                wait_for_completion(&fw_priv->completion);
 
-       down(&fw_lock);
+       mutex_lock(&fw_lock);
        if (!fw_priv->fw->size || test_bit(FW_STATUS_ABORT, &fw_priv->status)) {
                retval = -ENOENT;
                release_firmware(fw_priv->fw);
                *firmware_p = NULL;
        }
        fw_priv->fw = NULL;
-       up(&fw_lock);
+       mutex_unlock(&fw_lock);
        class_device_unregister(class_dev);
        goto out;
 
@@ -511,7 +512,6 @@ request_firmware_work_func(void *arg)
                WARN_ON(1);
                return 0;
        }
-       daemonize("%s/%s", "firmware", fw_work->name);
        ret = _request_firmware(&fw, fw_work->name, fw_work->device,
                fw_work->uevent);
        if (ret < 0)
@@ -546,9 +546,9 @@ request_firmware_nowait(
        const char *name, struct device *device, void *context,
        void (*cont)(const struct firmware *fw, void *context))
 {
+       struct task_struct *task;
        struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work),
                                                GFP_ATOMIC);
-       int ret;
 
        if (!fw_work)
                return -ENOMEM;
@@ -566,14 +566,14 @@ request_firmware_nowait(
                .uevent = uevent,
        };
 
-       ret = kernel_thread(request_firmware_work_func, fw_work,
-                           CLONE_FS | CLONE_FILES);
+       task = kthread_run(request_firmware_work_func, fw_work,
+                           "firmware/%s", name);
 
-       if (ret < 0) {
+       if (IS_ERR(task)) {
                fw_work->cont(NULL, fw_work->context);
                module_put(fw_work->module);
                kfree(fw_work);
-               return ret;
+               return PTR_ERR(task);
        }
        return 0;
 }
@@ -602,7 +602,7 @@ firmware_class_exit(void)
        class_unregister(&firmware_class);
 }
 
-module_init(firmware_class_init);
+fs_initcall(firmware_class_init);
 module_exit(firmware_class_exit);
 
 EXPORT_SYMBOL(release_firmware);