int width, height;
        int frame_bytes, line_bytes;
        wait_queue_head_t wait;
+       unsigned long in_use;
        struct mutex lock;
 };
 
  * Video4Linux Module functions
  *
  ****************************************************************************/
+static struct ar_device ardev;
+
+static int ar_exclusive_open(struct inode *inode, struct file *file)
+{
+       return test_and_set_bit(0, &ardev.in_use) ? -EBUSY : 0;
+}
+
+static int ar_exclusive_release(struct inode *inode, struct file *file)
+{
+       clear_bit(0, &ardev.in_use);
+       return 0;
+}
+
 static const struct file_operations ar_fops = {
        .owner          = THIS_MODULE,
-       .open           = video_exclusive_open,
-       .release        = video_exclusive_release,
+       .open           = ar_exclusive_open,
+       .release        = ar_exclusive_release,
        .read           = ar_read,
        .ioctl          = ar_ioctl,
 #ifdef CONFIG_COMPAT
 };
 
 #define ALIGN4(x)      ((((int)(x)) & 0x3) == 0)
-static struct ar_device ardev;
 
 static int __init ar_init(void)
 {
 
        return len;
 }
 
+static int qcam_exclusive_open(struct inode *inode, struct file *file)
+{
+       struct video_device *dev = video_devdata(file);
+       struct qcam_device *qcam = (struct qcam_device *)dev;
+
+       return test_and_set_bit(0, &qcam->in_use) ? -EBUSY : 0;
+}
+
+static int qcam_exclusive_release(struct inode *inode, struct file *file)
+{
+       struct video_device *dev = video_devdata(file);
+       struct qcam_device *qcam = (struct qcam_device *)dev;
+
+       clear_bit(0, &qcam->in_use);
+       return 0;
+}
+
 static const struct file_operations qcam_fops = {
        .owner          = THIS_MODULE,
-       .open           = video_exclusive_open,
-       .release        = video_exclusive_release,
+       .open           = qcam_exclusive_open,
+       .release        = qcam_exclusive_release,
        .ioctl          = qcam_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = v4l_compat_ioctl32,
 
        int top, left;
        int status;
        unsigned int saved_bits;
+       unsigned long in_use;
 };
 
        int contrast, brightness, whitebal;
        int top, left;
        unsigned int bidirectional;
+       unsigned long in_use;
        struct mutex lock;
 };
 
        return len;
 }
 
+static int qcam_exclusive_open(struct inode *inode, struct file *file)
+{
+       struct video_device *dev = video_devdata(file);
+       struct qcam_device *qcam = (struct qcam_device *)dev;
+
+       return test_and_set_bit(0, &qcam->in_use) ? -EBUSY : 0;
+}
+
+static int qcam_exclusive_release(struct inode *inode, struct file *file)
+{
+       struct video_device *dev = video_devdata(file);
+       struct qcam_device *qcam = (struct qcam_device *)dev;
+
+       clear_bit(0, &qcam->in_use);
+       return 0;
+}
+
 /* video device template */
 static const struct file_operations qcam_fops = {
        .owner          = THIS_MODULE,
-       .open           = video_exclusive_open,
-       .release        = video_exclusive_release,
+       .open           = qcam_exclusive_open,
+       .release        = qcam_exclusive_release,
        .ioctl          = qcam_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = v4l_compat_ioctl32,
 
 
 static int meye_open(struct inode *inode, struct file *file)
 {
-       int i, err;
+       int i;
 
-       lock_kernel();
-       err = video_exclusive_open(inode, file);
-       if (err < 0) {
-               unlock_kernel();
-               return err;
-       }
+       if (test_and_set_bit(0, &meye.in_use))
+               return -EBUSY;
 
        mchip_hic_stop();
 
        if (mchip_dma_alloc()) {
                printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
-               video_exclusive_release(inode, file);
-               unlock_kernel();
+               clear_bit(0, &meye.in_use);
                return -ENOBUFS;
        }
 
                meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
        kfifo_reset(meye.grabq);
        kfifo_reset(meye.doneq);
-       unlock_kernel();
        return 0;
 }
 
 {
        mchip_hic_stop();
        mchip_dma_free();
-       video_exclusive_release(inode, file);
+       clear_bit(0, &meye.in_use);
        return 0;
 }
 
 
        struct video_device *video_dev; /* video device parameters */
        struct video_picture picture;   /* video picture parameters */
        struct meye_params params;      /* additional parameters */
+       unsigned long in_use;           /* set to 1 if the device is in use */
 #ifdef CONFIG_PM
        u8 pm_mchip_mode;               /* old mchip mode */
 #endif
 
        struct video_picture picture;
        int height;
        int width;
+       unsigned long in_use;
        struct mutex lock;
 };
 
        return len;
 }
 
+static int pms_exclusive_open(struct inode *inode, struct file *file)
+{
+       struct video_device *v = video_devdata(file);
+       struct pms_device *pd = (struct pms_device *)v;
+
+       return test_and_set_bit(0, &pd->in_use) ? -EBUSY : 0;
+}
+
+static int pms_exclusive_release(struct inode *inode, struct file *file)
+{
+       struct video_device *v = video_devdata(file);
+       struct pms_device *pd = (struct pms_device *)v;
+
+       clear_bit(0, &pd->in_use);
+       return 0;
+}
+
 static const struct file_operations pms_fops = {
        .owner          = THIS_MODULE,
-       .open           = video_exclusive_open,
-       .release        = video_exclusive_release,
+       .open           = pms_exclusive_open,
+       .release        = pms_exclusive_release,
        .ioctl          = pms_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = v4l_compat_ioctl32,
 
        u8     pgbuf[NUM_DAUS][VTX_VIRTUALSIZE];
        int    is_searching[NUM_DAUS];
        struct i2c_client *client;
+       unsigned long in_use;
        struct mutex lock;
 };
 
 {
        struct video_device *vd = video_devdata(file);
        struct saa5246a_device *t = vd->priv;
-       int err;
 
-       lock_kernel();
-       err = video_exclusive_open(inode,file);
-       if (err < 0) {
-               unlock_kernel();
-               return err;
-       }
+       if (t->client == NULL)
+               return -ENODEV;
 
-       if (t->client==NULL) {
-               err = -ENODEV;
-               goto fail;
-       }
+       if (test_and_set_bit(0, &t->in_use))
+               return -EBUSY;
 
        if (i2c_senddata(t, SAA5246A_REGISTER_R0,
-
                R0_SELECT_R11 |
                R0_PLL_TIME_CONSTANT_LONG |
                R0_ENABLE_nODD_EVEN_OUTPUT |
 
                COMMAND_END))
        {
-               err = -EIO;
-               goto fail;
+               clear_bit(0, &t->in_use);
+               return -EIO;
        }
-       unlock_kernel();
-
        return 0;
-
-fail:
-       video_exclusive_release(inode,file);
-       unlock_kernel();
-       return err;
 }
 
 static int saa5246a_release(struct inode *inode, struct file *file)
                R1_VCS_TO_SCS,
 
                COMMAND_END);
-       video_exclusive_release(inode,file);
+       clear_bit(0, &t->in_use);
        return 0;
 }
 
 
        int disp_mode;
        int virtual_mode;
        struct i2c_client *client;
+       unsigned long in_use;
        struct mutex lock;
 };
 
 static int saa5249_open(struct inode *inode, struct file *file)
 {
        struct video_device *vd = video_devdata(file);
-       struct saa5249_device *t=vd->priv;
-       int err,pgbuf;
+       struct saa5249_device *t = vd->priv;
+       int pgbuf;
 
-       lock_kernel();
-       err = video_exclusive_open(inode,file);
-       if (err < 0) {
-               unlock_kernel();
-               return err;
-       }
+       if (t->client == NULL)
+               return -ENODEV;
 
-       if (t->client==NULL) {
-               err = -ENODEV;
-               goto fail;
-       }
+       if (test_and_set_bit(0, &t->in_use))
+               return -EBUSY;
 
-       if (i2c_senddata(t, 0, 0, -1) ||                /* Select R11 */
-                                               /* Turn off parity checks (we do this ourselves) */
+       if (i2c_senddata(t, 0, 0, -1) || /* Select R11 */
+               /* Turn off parity checks (we do this ourselves) */
                i2c_senddata(t, 1, disp_modes[t->disp_mode][0], 0, -1) ||
-                                               /* Display TV-picture, no virtual rows */
-               i2c_senddata(t, 4, NUM_DAUS, disp_modes[t->disp_mode][1], disp_modes[t->disp_mode][2], 7, -1)) /* Set display to page 4 */
-
+               /* Display TV-picture, no virtual rows */
+               i2c_senddata(t, 4, NUM_DAUS, disp_modes[t->disp_mode][1], disp_modes[t->disp_mode][2], 7, -1))
+               /* Set display to page 4 */
        {
-               err = -EIO;
-               goto fail;
+               clear_bit(0, &t->in_use);
+               return -EIO;
        }
 
-       for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++)
-       {
+       for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++) {
                memset(t->vdau[pgbuf].pgbuf, ' ', sizeof(t->vdau[0].pgbuf));
                memset(t->vdau[pgbuf].sregs, 0, sizeof(t->vdau[0].sregs));
                memset(t->vdau[pgbuf].laststat, 0, sizeof(t->vdau[0].laststat));
                t->is_searching[pgbuf] = false;
        }
        t->virtual_mode = false;
-       unlock_kernel();
        return 0;
-
- fail:
-       video_exclusive_release(inode,file);
-       unlock_kernel();
-       return err;
 }
 
 
 static int saa5249_release(struct inode *inode, struct file *file)
 {
        struct video_device *vd = video_devdata(file);
-       struct saa5249_device *t=vd->priv;
+       struct saa5249_device *t = vd->priv;
+
        i2c_senddata(t, 1, 0x20, -1);           /* Turn off CCT */
        i2c_senddata(t, 5, 3, 3, -1);           /* Turn off TV-display */
-       video_exclusive_release(inode,file);
+       clear_bit(0, &t->in_use);
        return 0;
 }
 
 
        signed char contrast;
        signed char color;
        signed char hue;
+       unsigned long in_use;
 };
 
 /*
 static ssize_t w9966_v4l_read(struct file *file, char __user *buf,
                              size_t count, loff_t *ppos);
 
+static int w9966_exclusive_open(struct inode *inode, struct file *file)
+{
+       struct video_device *vdev = video_devdata(file);
+       struct w9966_dev *cam = vdev->priv;
+
+       return test_and_set_bit(0, &cam->in_use) ? -EBUSY : 0;
+}
+
+static int w9966_exclusive_release(struct inode *inode, struct file *file)
+{
+       struct video_device *vdev = video_devdata(file);
+       struct w9966_dev *cam = vdev->priv;
+
+       clear_bit(0, &cam->in_use);
+       return 0;
+}
+
 static const struct file_operations w9966_fops = {
        .owner          = THIS_MODULE,
-       .open           = video_exclusive_open,
-       .release        = video_exclusive_release,
+       .open           = w9966_exclusive_open,
+       .release        = w9966_exclusive_release,
        .ioctl          = w9966_v4l_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = v4l_compat_ioctl32,