--- x/drivers/media/usb/em28xx/em28xx-video.c +++ y/drivers/media/usb/em28xx/em28xx-video.c @@ -2150,6 +2150,10 @@ static int em28xx_v4l2_open(struct file if (mutex_lock_interruptible(&dev->lock)) return -ERESTARTSYS; + if (dev->v4l2 == NULL) { + mutex_unlock(&dev->lock); + return -EINVAL; + } ret = v4l2_fh_open(filp); if (ret) { dev_err(&dev->intf->dev, @@ -2898,7 +2902,6 @@ unregister_dev: v4l2_device_unregister(&v4l2->v4l2_dev); err: dev->v4l2 = NULL; - kref_put(&v4l2->ref, em28xx_free_v4l2); mutex_unlock(&dev->lock); return ret; }