patch-2.4.21 linux-2.4.21/drivers/media/video/videodev.c

Next file: linux-2.4.21/drivers/media/video/w9966.c
Previous file: linux-2.4.21/drivers/media/video/tvmixer.c
Back to the patch index
Back to the overall index

diff -urN linux-2.4.20/drivers/media/video/videodev.c linux-2.4.21/drivers/media/video/videodev.c
@@ -186,14 +186,21 @@
 static int video_release(struct inode *inode, struct file *file)
 {
 	struct video_device *vfl;
+	struct module *owner;
 
-	down(&videodev_lock);
 	vfl = video_devdata(file);
-	if(vfl->close)
+	owner = vfl->owner;
+	if (vfl->close)
 		vfl->close(vfl);
-	vfl->users--;
-	if(vfl->owner)
-		__MOD_DEC_USE_COUNT(vfl->owner);
+
+	down(&videodev_lock);
+	/* ->close() might have called video_device_unregister()
+           in case of a hot unplug, thus we have to get vfl again */
+	vfl = video_devdata(file);
+	if (NULL != vfl)
+		vfl->users--;
+	if (owner)
+		__MOD_DEC_USE_COUNT(owner);
 	up(&videodev_lock);
 	return 0;
 }

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)