firewire: convert client_list_lock to mutex
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Sun, 5 Oct 2008 08:37:11 +0000 (10:37 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Tue, 24 Mar 2009 19:56:37 +0000 (20:56 +0100)
So far it is only taken in non-atomic contexts.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/firewire/fw-cdev.c
drivers/firewire/fw-device.c
drivers/firewire/fw-device.h

index 40cc9732dc2870ea4ce042ac7455ee0bc5eebe23..75bbd66f852ef366af499165869cc4412997f0c6 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/errno.h>
 #include <linux/device.h>
 #include <linux/vmalloc.h>
+#include <linux/mutex.h>
 #include <linux/poll.h>
 #include <linux/preempt.h>
 #include <linux/time.h>
@@ -108,7 +109,6 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
 {
        struct fw_device *device;
        struct client *client;
-       unsigned long flags;
 
        device = fw_device_get_by_devt(inode->i_rdev);
        if (device == NULL)
@@ -133,9 +133,9 @@ static int fw_device_op_open(struct inode *inode, struct file *file)
 
        file->private_data = client;
 
-       spin_lock_irqsave(&device->client_list_lock, flags);
+       mutex_lock(&device->client_list_mutex);
        list_add_tail(&client->link, &device->client_list);
-       spin_unlock_irqrestore(&device->client_list_lock, flags);
+       mutex_unlock(&device->client_list_mutex);
 
        return 0;
 }
@@ -232,14 +232,11 @@ for_each_client(struct fw_device *device,
                void (*callback)(struct client *client))
 {
        struct client *c;
-       unsigned long flags;
-
-       spin_lock_irqsave(&device->client_list_lock, flags);
 
+       mutex_lock(&device->client_list_mutex);
        list_for_each_entry(c, &device->client_list, link)
                callback(c);
-
-       spin_unlock_irqrestore(&device->client_list_lock, flags);
+       mutex_unlock(&device->client_list_mutex);
 }
 
 static void
@@ -247,7 +244,7 @@ queue_bus_reset_event(struct client *client)
 {
        struct bus_reset *bus_reset;
 
-       bus_reset = kzalloc(sizeof(*bus_reset), GFP_ATOMIC);
+       bus_reset = kzalloc(sizeof(*bus_reset), GFP_KERNEL);
        if (bus_reset == NULL) {
                fw_notify("Out of memory when allocating bus reset event\n");
                return;
@@ -988,7 +985,6 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
        struct client *client = file->private_data;
        struct event *e, *next_e;
        struct client_resource *r, *next_r;
-       unsigned long flags;
 
        if (client->buffer.pages)
                fw_iso_buffer_destroy(&client->buffer, client->device->card);
@@ -1007,9 +1003,9 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
        list_for_each_entry_safe(e, next_e, &client->event_list, link)
                kfree(e);
 
-       spin_lock_irqsave(&client->device->client_list_lock, flags);
+       mutex_lock(&client->device->client_list_mutex);
        list_del(&client->link);
-       spin_unlock_irqrestore(&client->device->client_list_lock, flags);
+       mutex_unlock(&client->device->client_list_mutex);
 
        fw_device_put(client->device);
        kfree(client);
index ffde1bed46b295a792f467e8669e94b9beb7189a..2de3dd5ebc4b5af51bd84436f3583cf6f920e9b1 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/idr.h>
 #include <linux/jiffies.h>
 #include <linux/string.h>
+#include <linux/mutex.h>
 #include <linux/rwsem.h>
 #include <linux/semaphore.h>
 #include <linux/spinlock.h>
@@ -1005,7 +1006,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
                device->node = fw_node_get(node);
                device->node_id = node->node_id;
                device->generation = card->generation;
-               spin_lock_init(&device->client_list_lock);
+               mutex_init(&device->client_list_mutex);
                INIT_LIST_HEAD(&device->client_list);
 
                /*
index 008a7908a865dab1ae475a47a8b6a44657b9d011..655d7e8380123ac15d155287d828edbb11fc51ad 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/cdev.h>
 #include <linux/idr.h>
 #include <linux/rwsem.h>
-#include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include <asm/atomic.h>
 
 enum fw_device_state {
@@ -65,9 +65,10 @@ struct fw_device {
        bool cmc;
        struct fw_card *card;
        struct device device;
-       /* to prevent deadlocks, never take this lock with card->lock held */
-       spinlock_t client_list_lock;
+
+       struct mutex client_list_mutex;
        struct list_head client_list;
+
        u32 *config_rom;
        size_t config_rom_length;
        int config_rom_retries;