When a video device is unregistered the video device node may still be open (this is the case if the driver is unbound). Normally vb2_queue_release() is called from vb2_fop_release() which in turn is called when the filehandle that 'owns' the queue is closed. But that might happen quite a long time afterwards when sensor drivers etc. have already been unbound as well. This causes problems in the more complex drivers, but it makes sense to just release the queue when the device is unregistered instead of waiting for the filehandle to be closed. Drivers that do not use vb2_fop_release() will still have to do this manually when they call video_unregister_device() if necessary. Signed-off-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx> --- diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index a593ea0598b5..ebe1a1647816 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -28,6 +28,7 @@ #include <media/v4l2-common.h> #include <media/v4l2-device.h> #include <media/v4l2-ioctl.h> +#include <media/videobuf2-v4l2.h> #define VIDEO_NUM_DEVICES 256 #define VIDEO_NAME "video4linux" @@ -1086,6 +1087,17 @@ void video_unregister_device(struct video_device *vdev) */ clear_bit(V4L2_FL_REGISTERED, &vdev->flags); mutex_unlock(&videodev_lock); + if (vdev->queue && vdev->queue->owner) { + struct mutex *lock = vdev->queue->lock ? + vdev->queue->lock : vdev->lock; + + if (lock) + mutex_lock(lock); + vb2_queue_release(vdev->queue); + vdev->queue->owner = NULL; + if (lock) + mutex_unlock(lock); + } device_unregister(&vdev->dev); } EXPORT_SYMBOL(video_unregister_device);