diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2008-12-14 13:19:23 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-03-24 15:56:38 -0400 |
commit | 97811e347310766030a648fdf0e407b2c91a39c1 (patch) | |
tree | 61710722bac7ffd91915e09f42e0412727bba53b /drivers/firewire/fw-cdev.c | |
parent | 1f3125af8ed7410cc0ebcc0acd59bbfc1ae0057a (diff) |
firewire: cdev: fix race of fw_device_op_release with bus reset
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>
Diffstat (limited to 'drivers/firewire/fw-cdev.c')
-rw-r--r-- | drivers/firewire/fw-cdev.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c index a320ab48edd6..4dd66c1a36da 100644 --- a/drivers/firewire/fw-cdev.c +++ b/drivers/firewire/fw-cdev.c | |||
@@ -1009,6 +1009,10 @@ static int fw_device_op_release(struct inode *inode, struct file *file) | |||
1009 | struct event *e, *next_e; | 1009 | struct event *e, *next_e; |
1010 | struct client_resource *r, *next_r; | 1010 | struct client_resource *r, *next_r; |
1011 | 1011 | ||
1012 | mutex_lock(&client->device->client_list_mutex); | ||
1013 | list_del(&client->link); | ||
1014 | mutex_unlock(&client->device->client_list_mutex); | ||
1015 | |||
1012 | if (client->buffer.pages) | 1016 | if (client->buffer.pages) |
1013 | fw_iso_buffer_destroy(&client->buffer, client->device->card); | 1017 | fw_iso_buffer_destroy(&client->buffer, client->device->card); |
1014 | 1018 | ||
@@ -1026,10 +1030,6 @@ static int fw_device_op_release(struct inode *inode, struct file *file) | |||
1026 | list_for_each_entry_safe(e, next_e, &client->event_list, link) | 1030 | list_for_each_entry_safe(e, next_e, &client->event_list, link) |
1027 | kfree(e); | 1031 | kfree(e); |
1028 | 1032 | ||
1029 | mutex_lock(&client->device->client_list_mutex); | ||
1030 | list_del(&client->link); | ||
1031 | mutex_unlock(&client->device->client_list_mutex); | ||
1032 | |||
1033 | fw_device_put(client->device); | 1033 | fw_device_put(client->device); |
1034 | kfree(client); | 1034 | kfree(client); |
1035 | 1035 | ||