staging: bcm2835-audio: Don't leak workqueue if open fails
Currently, if bcm2835_audio_open() fails partway, the allocated workqueue is leaked. Avoid that. While at it, propagate the return value of bcm2835_audio_open_connection() on failure instead of returning -1. Signed-off-by: Tuomas Tynkkynen <tuomas@tuxera.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>zero-colors
parent
4feb0f375f
commit
678c5b1193
|
@ -428,16 +428,16 @@ int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream)
|
|||
return -ENOMEM;
|
||||
|
||||
ret = bcm2835_audio_open_connection(alsa_stream);
|
||||
if (ret) {
|
||||
ret = -1;
|
||||
goto exit;
|
||||
}
|
||||
if (ret)
|
||||
goto free_wq;
|
||||
|
||||
instance = alsa_stream->instance;
|
||||
LOG_DBG(" instance (%p)\n", instance);
|
||||
|
||||
if (mutex_lock_interruptible(&instance->vchi_mutex)) {
|
||||
LOG_DBG("Interrupted whilst waiting for lock on (%d)\n", instance->num_connections);
|
||||
return -EINTR;
|
||||
ret = -EINTR;
|
||||
goto free_wq;
|
||||
}
|
||||
vchi_service_use(instance->vchi_handle[0]);
|
||||
|
||||
|
@ -460,7 +460,11 @@ int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream)
|
|||
unlock:
|
||||
vchi_service_release(instance->vchi_handle[0]);
|
||||
mutex_unlock(&instance->vchi_mutex);
|
||||
exit:
|
||||
|
||||
free_wq:
|
||||
if (ret)
|
||||
destroy_workqueue(alsa_stream->my_wq);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue