Hi,
would anybody object to me adding a semaphore to the video_device structure ?
It would be taken by read & write in the v4l layer. This would cure races in
the usb v4l devices.
The problem is, that, although opening is exvlusive in v4l, threads can share
fds. Thus read & write must be protected.
On a related note: v4l open has an SMP race condition. Please test the
attached fix.
Regards
Oliver
--- drivers/media/video/videodev.c.alt Sun Oct 29 20:42:54 2000
+++ drivers/media/video/videodev.c Sun Oct 29 20:49:49 2000
@@ -30,16 +30,17 @@
#include <asm/uaccess.h>
#include <asm/system.h>
+#include <asm/bitops.h>
#include <linux/kmod.h>
-#define VIDEO_NUM_DEVICES 256
+#define VIDEO_NUM_DEVICES 256
/*
- * Active devices
+ * Active devices
*/
-
+
static struct video_device *video_device[VIDEO_NUM_DEVICES];
@@ -145,10 +146,10 @@
unsigned int minor = MINOR(inode->i_rdev);
int err;
struct video_device *vfl;
-
+
if(minor>=VIDEO_NUM_DEVICES)
return -ENODEV;
-
+
vfl=video_device[minor];
if(vfl==NULL) {
char modname[20];
@@ -159,16 +160,15 @@
if (vfl==NULL)
return -ENODEV;
}
- if(vfl->busy)
+ if(test_and_set_bit(0,&(vfl->busy)))
return -EBUSY;
- vfl->busy=1; /* In case vfl->open sleeps */
-
+
if(vfl->open)
{
err=vfl->open(vfl,0); /* Tell the device it is open */
if(err)
{
- vfl->busy=0;
+ clear_bit(0,&(vfl->busy));
return err;
}
}