nfsd: minor write_pool_threads exit cleanup
[safe/jmp/linux-2.6] / drivers / input / mousedev.c
index bbbe5e8..966b886 100644 (file)
@@ -14,6 +14,7 @@
 #define MOUSEDEV_MIX           31
 
 #include <linux/slab.h>
+#include <linux/smp_lock.h>
 #include <linux/poll.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -59,7 +60,6 @@ struct mousedev {
        int exist;
        int open;
        int minor;
-       char name[16];
        struct input_handle handle;
        wait_queue_head_t wait;
        struct list_head client_list;
@@ -402,18 +402,16 @@ static void mousedev_event(struct input_handle *handle,
 
 static int mousedev_fasync(int fd, struct file *file, int on)
 {
-       int retval;
        struct mousedev_client *client = file->private_data;
 
-       retval = fasync_helper(fd, file, on, &client->fasync);
-
-       return retval < 0 ? retval : 0;
+       return fasync_helper(fd, file, on, &client->fasync);
 }
 
 static void mousedev_free(struct device *dev)
 {
        struct mousedev *mousedev = container_of(dev, struct mousedev, dev);
 
+       input_put_device(mousedev->handle.dev);
        kfree(mousedev);
 }
 
@@ -517,7 +515,6 @@ static int mousedev_release(struct inode *inode, struct file *file)
        struct mousedev_client *client = file->private_data;
        struct mousedev *mousedev = client->mousedev;
 
-       mousedev_fasync(-1, file, 0);
        mousedev_detach_client(mousedev, client);
        kfree(client);
 
@@ -544,16 +541,21 @@ static int mousedev_open(struct inode *inode, struct file *file)
        if (i >= MOUSEDEV_MINORS)
                return -ENODEV;
 
+       lock_kernel();
        error = mutex_lock_interruptible(&mousedev_table_mutex);
-       if (error)
+       if (error) {
+               unlock_kernel();
                return error;
+       }
        mousedev = mousedev_table[i];
        if (mousedev)
                get_device(&mousedev->dev);
        mutex_unlock(&mousedev_table_mutex);
 
-       if (!mousedev)
+       if (!mousedev) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        client = kzalloc(sizeof(struct mousedev_client), GFP_KERNEL);
        if (!client) {
@@ -572,6 +574,7 @@ static int mousedev_open(struct inode *inode, struct file *file)
                goto err_free_client;
 
        file->private_data = client;
+       unlock_kernel();
        return 0;
 
  err_free_client:
@@ -579,6 +582,7 @@ static int mousedev_open(struct inode *inode, struct file *file)
        kfree(client);
  err_put_mousedev:
        put_device(&mousedev->dev);
+       unlock_kernel();
        return error;
 }
 
@@ -858,20 +862,17 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
        init_waitqueue_head(&mousedev->wait);
 
        if (minor == MOUSEDEV_MIX)
-               strlcpy(mousedev->name, "mice", sizeof(mousedev->name));
+               dev_set_name(&mousedev->dev, "mice");
        else
-               snprintf(mousedev->name, sizeof(mousedev->name),
-                        "mouse%d", minor);
+               dev_set_name(&mousedev->dev, "mouse%d", minor);
 
        mousedev->minor = minor;
        mousedev->exist = 1;
-       mousedev->handle.dev = dev;
-       mousedev->handle.name = mousedev->name;
+       mousedev->handle.dev = input_get_device(dev);
+       mousedev->handle.name = dev_name(&mousedev->dev);
        mousedev->handle.handler = handler;
        mousedev->handle.private = mousedev;
 
-       strlcpy(mousedev->dev.bus_id, mousedev->name,
-               sizeof(mousedev->dev.bus_id));
        mousedev->dev.class = &input_class;
        if (dev)
                mousedev->dev.parent = &dev->dev;