Loading drivers/firewire/fw-cdev.c +8 −12 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <linux/errno.h> #include <linux/errno.h> #include <linux/device.h> #include <linux/device.h> #include <linux/vmalloc.h> #include <linux/vmalloc.h> #include <linux/mutex.h> #include <linux/poll.h> #include <linux/poll.h> #include <linux/preempt.h> #include <linux/preempt.h> #include <linux/time.h> #include <linux/time.h> Loading Loading @@ -108,7 +109,6 @@ static int fw_device_op_open(struct inode *inode, struct file *file) { { struct fw_device *device; struct fw_device *device; struct client *client; struct client *client; unsigned long flags; device = fw_device_get_by_devt(inode->i_rdev); device = fw_device_get_by_devt(inode->i_rdev); if (device == NULL) if (device == NULL) Loading @@ -133,9 +133,9 @@ static int fw_device_op_open(struct inode *inode, struct file *file) file->private_data = client; 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); list_add_tail(&client->link, &device->client_list); spin_unlock_irqrestore(&device->client_list_lock, flags); mutex_unlock(&device->client_list_mutex); return 0; return 0; } } Loading Loading @@ -232,14 +232,11 @@ for_each_client(struct fw_device *device, void (*callback)(struct client *client)) void (*callback)(struct client *client)) { { struct client *c; 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) list_for_each_entry(c, &device->client_list, link) callback(c); callback(c); mutex_unlock(&device->client_list_mutex); spin_unlock_irqrestore(&device->client_list_lock, flags); } } static void static void Loading @@ -247,7 +244,7 @@ queue_bus_reset_event(struct client *client) { { struct bus_reset *bus_reset; 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) { if (bus_reset == NULL) { fw_notify("Out of memory when allocating bus reset event\n"); fw_notify("Out of memory when allocating bus reset event\n"); return; return; Loading Loading @@ -988,7 +985,6 @@ static int fw_device_op_release(struct inode *inode, struct file *file) struct client *client = file->private_data; struct client *client = file->private_data; struct event *e, *next_e; struct event *e, *next_e; struct client_resource *r, *next_r; struct client_resource *r, *next_r; unsigned long flags; if (client->buffer.pages) if (client->buffer.pages) fw_iso_buffer_destroy(&client->buffer, client->device->card); fw_iso_buffer_destroy(&client->buffer, client->device->card); Loading @@ -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) list_for_each_entry_safe(e, next_e, &client->event_list, link) kfree(e); kfree(e); spin_lock_irqsave(&client->device->client_list_lock, flags); mutex_lock(&client->device->client_list_mutex); list_del(&client->link); 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); fw_device_put(client->device); kfree(client); kfree(client); Loading drivers/firewire/fw-device.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/idr.h> #include <linux/idr.h> #include <linux/jiffies.h> #include <linux/jiffies.h> #include <linux/string.h> #include <linux/string.h> #include <linux/mutex.h> #include <linux/rwsem.h> #include <linux/rwsem.h> #include <linux/semaphore.h> #include <linux/semaphore.h> #include <linux/spinlock.h> #include <linux/spinlock.h> Loading Loading @@ -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 = fw_node_get(node); device->node_id = node->node_id; device->node_id = node->node_id; device->generation = card->generation; device->generation = card->generation; spin_lock_init(&device->client_list_lock); mutex_init(&device->client_list_mutex); INIT_LIST_HEAD(&device->client_list); INIT_LIST_HEAD(&device->client_list); /* /* Loading drivers/firewire/fw-device.h +4 −3 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,7 @@ #include <linux/cdev.h> #include <linux/cdev.h> #include <linux/idr.h> #include <linux/idr.h> #include <linux/rwsem.h> #include <linux/rwsem.h> #include <linux/spinlock.h> #include <linux/mutex.h> #include <asm/atomic.h> #include <asm/atomic.h> enum fw_device_state { enum fw_device_state { Loading Loading @@ -65,9 +65,10 @@ struct fw_device { bool cmc; bool cmc; struct fw_card *card; struct fw_card *card; struct device device; 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; struct list_head client_list; u32 *config_rom; u32 *config_rom; size_t config_rom_length; size_t config_rom_length; int config_rom_retries; int config_rom_retries; Loading Loading
drivers/firewire/fw-cdev.c +8 −12 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <linux/errno.h> #include <linux/errno.h> #include <linux/device.h> #include <linux/device.h> #include <linux/vmalloc.h> #include <linux/vmalloc.h> #include <linux/mutex.h> #include <linux/poll.h> #include <linux/poll.h> #include <linux/preempt.h> #include <linux/preempt.h> #include <linux/time.h> #include <linux/time.h> Loading Loading @@ -108,7 +109,6 @@ static int fw_device_op_open(struct inode *inode, struct file *file) { { struct fw_device *device; struct fw_device *device; struct client *client; struct client *client; unsigned long flags; device = fw_device_get_by_devt(inode->i_rdev); device = fw_device_get_by_devt(inode->i_rdev); if (device == NULL) if (device == NULL) Loading @@ -133,9 +133,9 @@ static int fw_device_op_open(struct inode *inode, struct file *file) file->private_data = client; 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); list_add_tail(&client->link, &device->client_list); spin_unlock_irqrestore(&device->client_list_lock, flags); mutex_unlock(&device->client_list_mutex); return 0; return 0; } } Loading Loading @@ -232,14 +232,11 @@ for_each_client(struct fw_device *device, void (*callback)(struct client *client)) void (*callback)(struct client *client)) { { struct client *c; 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) list_for_each_entry(c, &device->client_list, link) callback(c); callback(c); mutex_unlock(&device->client_list_mutex); spin_unlock_irqrestore(&device->client_list_lock, flags); } } static void static void Loading @@ -247,7 +244,7 @@ queue_bus_reset_event(struct client *client) { { struct bus_reset *bus_reset; 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) { if (bus_reset == NULL) { fw_notify("Out of memory when allocating bus reset event\n"); fw_notify("Out of memory when allocating bus reset event\n"); return; return; Loading Loading @@ -988,7 +985,6 @@ static int fw_device_op_release(struct inode *inode, struct file *file) struct client *client = file->private_data; struct client *client = file->private_data; struct event *e, *next_e; struct event *e, *next_e; struct client_resource *r, *next_r; struct client_resource *r, *next_r; unsigned long flags; if (client->buffer.pages) if (client->buffer.pages) fw_iso_buffer_destroy(&client->buffer, client->device->card); fw_iso_buffer_destroy(&client->buffer, client->device->card); Loading @@ -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) list_for_each_entry_safe(e, next_e, &client->event_list, link) kfree(e); kfree(e); spin_lock_irqsave(&client->device->client_list_lock, flags); mutex_lock(&client->device->client_list_mutex); list_del(&client->link); 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); fw_device_put(client->device); kfree(client); kfree(client); Loading
drivers/firewire/fw-device.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/idr.h> #include <linux/idr.h> #include <linux/jiffies.h> #include <linux/jiffies.h> #include <linux/string.h> #include <linux/string.h> #include <linux/mutex.h> #include <linux/rwsem.h> #include <linux/rwsem.h> #include <linux/semaphore.h> #include <linux/semaphore.h> #include <linux/spinlock.h> #include <linux/spinlock.h> Loading Loading @@ -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 = fw_node_get(node); device->node_id = node->node_id; device->node_id = node->node_id; device->generation = card->generation; device->generation = card->generation; spin_lock_init(&device->client_list_lock); mutex_init(&device->client_list_mutex); INIT_LIST_HEAD(&device->client_list); INIT_LIST_HEAD(&device->client_list); /* /* Loading
drivers/firewire/fw-device.h +4 −3 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,7 @@ #include <linux/cdev.h> #include <linux/cdev.h> #include <linux/idr.h> #include <linux/idr.h> #include <linux/rwsem.h> #include <linux/rwsem.h> #include <linux/spinlock.h> #include <linux/mutex.h> #include <asm/atomic.h> #include <asm/atomic.h> enum fw_device_state { enum fw_device_state { Loading Loading @@ -65,9 +65,10 @@ struct fw_device { bool cmc; bool cmc; struct fw_card *card; struct fw_card *card; struct device device; 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; struct list_head client_list; u32 *config_rom; u32 *config_rom; size_t config_rom_length; size_t config_rom_length; int config_rom_retries; int config_rom_retries; Loading