firewire: cdev: fix race of fw_device_op_release with bus reset
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Sun, 14 Dec 2008 18:19:23 +0000 (19:19 +0100)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Tue, 24 Mar 2009 19:56:38 +0000 (20:56 +0100)
Unlink the client from the fw_device earlier in order to prevent bus
reset events being added to client->event_list during shutdown.

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

index a320ab48edd611b1f97fa8675eabe3701c8011df..4dd66c1a36da63e00197ff745cc9c266d5e0c161 100644 (file)
@@ -1009,6 +1009,10 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
        struct event *e, *next_e;
        struct client_resource *r, *next_r;
 
+       mutex_lock(&client->device->client_list_mutex);
+       list_del(&client->link);
+       mutex_unlock(&client->device->client_list_mutex);
+
        if (client->buffer.pages)
                fw_iso_buffer_destroy(&client->buffer, client->device->card);
 
@@ -1026,10 +1030,6 @@ 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);
 
-       mutex_lock(&client->device->client_list_mutex);
-       list_del(&client->link);
-       mutex_unlock(&client->device->client_list_mutex);
-
        fw_device_put(client->device);
        kfree(client);