diff options
Diffstat (limited to 'drivers/firewire')
| -rw-r--r-- | drivers/firewire/nosy.c | 9 | ||||
| -rw-r--r-- | drivers/firewire/ohci.c | 4 | 
2 files changed, 9 insertions, 4 deletions
| diff --git a/drivers/firewire/nosy.c b/drivers/firewire/nosy.c index 5fd6a60b6741..88ed971e32c0 100644 --- a/drivers/firewire/nosy.c +++ b/drivers/firewire/nosy.c @@ -346,6 +346,7 @@ nosy_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	struct client *client = file->private_data;  	spinlock_t *client_list_lock = &client->lynx->client_list_lock;  	struct nosy_stats stats; +	int ret;  	switch (cmd) {  	case NOSY_IOC_GET_STATS: @@ -360,11 +361,15 @@ nosy_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  			return 0;  	case NOSY_IOC_START: +		ret = -EBUSY;  		spin_lock_irq(client_list_lock); -		list_add_tail(&client->link, &client->lynx->client_list); +		if (list_empty(&client->link)) { +			list_add_tail(&client->link, &client->lynx->client_list); +			ret = 0; +		}  		spin_unlock_irq(client_list_lock); -		return 0; +		return ret;  	case NOSY_IOC_STOP:  		spin_lock_irq(client_list_lock); diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 9811c40956e5..17c9d825188b 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c @@ -2545,7 +2545,7 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet)  	struct driver_data *driver_data = packet->driver_data;  	int ret = -ENOENT; -	tasklet_disable(&ctx->tasklet); +	tasklet_disable_in_atomic(&ctx->tasklet);  	if (packet->ack != 0)  		goto out; @@ -3465,7 +3465,7 @@ static int ohci_flush_iso_completions(struct fw_iso_context *base)  	struct iso_context *ctx = container_of(base, struct iso_context, base);  	int ret = 0; -	tasklet_disable(&ctx->context.tasklet); +	tasklet_disable_in_atomic(&ctx->context.tasklet);  	if (!test_and_set_bit_lock(0, &ctx->flushing_completions)) {  		context_tasklet((unsigned long)&ctx->context); | 
