Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97811e34 authored by Stefan Richter's avatar Stefan Richter
Browse files

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: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent 1f3125af
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -1009,6 +1009,10 @@ static int fw_device_op_release(struct inode *inode, struct file *file)
	struct event *e, *next_e;
	struct event *e, *next_e;
	struct client_resource *r, *next_r;
	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)
	if (client->buffer.pages)
		fw_iso_buffer_destroy(&client->buffer, client->device->card);
		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)
	list_for_each_entry_safe(e, next_e, &client->event_list, link)
		kfree(e);
		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);
	fw_device_put(client->device);
	kfree(client);
	kfree(client);