V4L/DVB (8613): v4l: move BKL down to the driver level.
authorHans Verkuil <hverkuil@xs4all.nl>
Wed, 30 Jul 2008 11:43:36 +0000 (08:43 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 12 Oct 2008 11:36:47 +0000 (09:36 -0200)
The BKL is now moved from the video_open function in v4l2-dev.c to the
various drivers. It seems about a third of the drivers already has a
lock of some sort protecting the open(), another third uses
video_exclusive_open (yuck!) and the last third required adding the
BKL in their open function.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
26 files changed:
drivers/media/radio/dsbr100.c
drivers/media/radio/radio-si470x.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/cafe_ccic.c
drivers/media/video/cx23885/cx23885-417.c
drivers/media/video/cx23885/cx23885-video.c
drivers/media/video/cx88/cx88-blackbird.c
drivers/media/video/cx88/cx88-video.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/meye.c
drivers/media/video/pvrusb2/pvrusb2-v4l2.c
drivers/media/video/s2255drv.c
drivers/media/video/saa5246a.c
drivers/media/video/saa5249.c
drivers/media/video/saa7134/saa7134-empress.c
drivers/media/video/saa7134/saa7134-video.c
drivers/media/video/se401.c
drivers/media/video/stk-webcam.c
drivers/media/video/stradis.c
drivers/media/video/stv680.c
drivers/media/video/usbvideo/vicam.c
drivers/media/video/usbvision/usbvision-video.c
drivers/media/video/v4l2-dev.c
drivers/media/video/vivi.c
drivers/media/video/zoran_driver.c
drivers/media/video/zr364xx.c

index 70c65a745923f088b96e2e8d0da59e3f7865ef25..3a4eb444a7c3630628cad9a12ce2ab2eaf9e4464 100644 (file)
@@ -407,15 +407,18 @@ static int usb_dsbr100_open(struct inode *inode, struct file *file)
 {
        struct dsbr100_device *radio=video_get_drvdata(video_devdata(file));
 
+       lock_kernel();
        radio->users = 1;
        radio->muted = 1;
 
        if (dsbr100_start(radio)<0) {
                warn("Radio did not start up properly");
                radio->users = 0;
+               unlock_kernel();
                return -EIO;
        }
        dsbr100_setfreq(radio, radio->curfreq);
+       unlock_kernel();
        return 0;
 }
 
index 16c7ef20265c4c34e3782baead264700797923dd..337d55793836fa981a76105eb526a5d6a21f6ad6 100644 (file)
@@ -1074,6 +1074,7 @@ static int si470x_fops_open(struct inode *inode, struct file *file)
        struct si470x_device *radio = video_get_drvdata(video_devdata(file));
        int retval;
 
+       lock_kernel();
        radio->users++;
 
        retval = usb_autopm_get_interface(radio->intf);
@@ -1090,6 +1091,7 @@ static int si470x_fops_open(struct inode *inode, struct file *file)
        }
 
 done:
+       unlock_kernel();
        return retval;
 }
 
index 933eaef41eadd4b3be9e404924d22fb316c1bd70..c3526d0258f8d2e60bf83bcb3de7ea3fc7f49d91 100644 (file)
@@ -3227,6 +3227,7 @@ static int bttv_open(struct inode *inode, struct file *file)
 
        dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor);
 
+       lock_kernel();
        for (i = 0; i < bttv_num; i++) {
                if (bttvs[i].video_dev &&
                    bttvs[i].video_dev->minor == minor) {
@@ -3241,16 +3242,20 @@ static int bttv_open(struct inode *inode, struct file *file)
                        break;
                }
        }
-       if (NULL == btv)
+       if (NULL == btv) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        dprintk(KERN_DEBUG "bttv%d: open called (type=%s)\n",
                btv->c.nr,v4l2_type_names[type]);
 
        /* allocate per filehandle data */
        fh = kmalloc(sizeof(*fh),GFP_KERNEL);
-       if (NULL == fh)
+       if (NULL == fh) {
+               unlock_kernel();
                return -ENOMEM;
+       }
        file->private_data = fh;
        *fh = btv->init;
        fh->type = type;
@@ -3290,6 +3295,7 @@ static int bttv_open(struct inode *inode, struct file *file)
        bttv_vbi_fmt_reset(&fh->vbi_fmt, btv->tvnorm);
 
        bttv_field_count(btv);
+       unlock_kernel();
        return 0;
 }
 
@@ -3430,21 +3436,26 @@ static int radio_open(struct inode *inode, struct file *file)
 
        dprintk("bttv: open minor=%d\n",minor);
 
+       lock_kernel();
        for (i = 0; i < bttv_num; i++) {
                if (bttvs[i].radio_dev && bttvs[i].radio_dev->minor == minor) {
                        btv = &bttvs[i];
                        break;
                }
        }
-       if (NULL == btv)
+       if (NULL == btv) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        dprintk("bttv%d: open called (radio)\n",btv->c.nr);
 
        /* allocate per filehandle data */
        fh = kmalloc(sizeof(*fh), GFP_KERNEL);
-       if (NULL == fh)
+       if (NULL == fh) {
+               unlock_kernel();
                return -ENOMEM;
+       }
        file->private_data = fh;
        *fh = btv->init;
        v4l2_prio_open(&btv->prio, &fh->prio);
@@ -3457,6 +3468,7 @@ static int radio_open(struct inode *inode, struct file *file)
        audio_input(btv,TVAUDIO_INPUT_RADIO);
 
        mutex_unlock(&btv->lock);
+       unlock_kernel();
        return 0;
 }
 
index 5405c30dbb041748b47941c5e9b0fd19842915c4..e9994c81df660ebaec7d9b9d10a587d73dfa3910 100644 (file)
@@ -1476,9 +1476,12 @@ static int cafe_v4l_open(struct inode *inode, struct file *filp)
 {
        struct cafe_camera *cam;
 
+       lock_kernel();
        cam = cafe_find_dev(iminor(inode));
-       if (cam == NULL)
+       if (cam == NULL) {
+               unlock_kernel();
                return -ENODEV;
+       }
        filp->private_data = cam;
 
        mutex_lock(&cam->s_mutex);
@@ -1490,6 +1493,7 @@ static int cafe_v4l_open(struct inode *inode, struct file *filp)
        }
        (cam->users)++;
        mutex_unlock(&cam->s_mutex);
+       unlock_kernel();
        return 0;
 }
 
index 7b0e8c01692efab12f289c2fc3f843cdff733548..93777d06d0acaa9050ac7ff79390c8686cdd1f6f 100644 (file)
@@ -1583,6 +1583,7 @@ static int mpeg_open(struct inode *inode, struct file *file)
 
        dprintk(2, "%s()\n", __func__);
 
+       lock_kernel();
        list_for_each(list, &cx23885_devlist) {
                h = list_entry(list, struct cx23885_dev, devlist);
                if (h->v4l_device->minor == minor) {
@@ -1591,13 +1592,17 @@ static int mpeg_open(struct inode *inode, struct file *file)
                }
        }
 
-       if (dev == NULL)
+       if (dev == NULL) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        /* allocate + initialize per filehandle data */
        fh = kzalloc(sizeof(*fh), GFP_KERNEL);
-       if (NULL == fh)
+       if (NULL == fh) {
+               unlock_kernel();
                return -ENOMEM;
+       }
 
        file->private_data = fh;
        fh->dev      = dev;
@@ -1608,6 +1613,7 @@ static int mpeg_open(struct inode *inode, struct file *file)
                            V4L2_FIELD_INTERLACED,
                            sizeof(struct cx23885_buffer),
                            fh);
+       unlock_kernel();
 
        return 0;
 }
index 6047c78d84bf5c2b26576e734e73e04f2724eb6c..d9bef1a54d1fa8285a96122a6b236230c4797ef3 100644 (file)
@@ -731,6 +731,7 @@ static int video_open(struct inode *inode, struct file *file)
        enum v4l2_buf_type type = 0;
        int radio = 0;
 
+       lock_kernel();
        list_for_each(list, &cx23885_devlist) {
                h = list_entry(list, struct cx23885_dev, devlist);
                if (h->video_dev->minor == minor) {
@@ -748,16 +749,20 @@ static int video_open(struct inode *inode, struct file *file)
                        dev   = h;
                }
        }
-       if (NULL == dev)
+       if (NULL == dev) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        dprintk(1, "open minor=%d radio=%d type=%s\n",
                minor, radio, v4l2_type_names[type]);
 
        /* allocate + initialize per filehandle data */
        fh = kzalloc(sizeof(*fh), GFP_KERNEL);
-       if (NULL == fh)
+       if (NULL == fh) {
+               unlock_kernel();
                return -ENOMEM;
+       }
        file->private_data = fh;
        fh->dev      = dev;
        fh->radio    = radio;
@@ -775,6 +780,7 @@ static int video_open(struct inode *inode, struct file *file)
 
        dprintk(1, "post videobuf_queue_init()\n");
 
+       unlock_kernel();
 
        return 0;
 }
index 9a1374a38ec75a315463c02e83f5c6ad113b6fb4..1b7e2e44b802fe469390fe9ac0545b1767994680 100644 (file)
@@ -1057,12 +1057,15 @@ static int mpeg_open(struct inode *inode, struct file *file)
        struct cx8802_driver *drv = NULL;
        int err;
 
+       lock_kernel();
        dev = cx8802_get_device(inode);
 
        dprintk( 1, "%s\n", __func__);
 
-       if (dev == NULL)
+       if (dev == NULL) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        /* Make sure we can acquire the hardware */
        drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD);
@@ -1077,6 +1080,7 @@ static int mpeg_open(struct inode *inode, struct file *file)
        if (blackbird_initialize_codec(dev) < 0) {
                if (drv)
                        drv->request_release(drv);
+               unlock_kernel();
                return -EINVAL;
        }
        dprintk(1,"open minor=%d\n",minor);
@@ -1086,6 +1090,7 @@ static int mpeg_open(struct inode *inode, struct file *file)
        if (NULL == fh) {
                if (drv)
                        drv->request_release(drv);
+               unlock_kernel();
                return -ENOMEM;
        }
        file->private_data = fh;
@@ -1101,6 +1106,7 @@ static int mpeg_open(struct inode *inode, struct file *file)
        /* FIXME: locking against other video device */
        cx88_set_scale(dev->core, dev->width, dev->height,
                        fh->mpegq.field);
+       unlock_kernel();
 
        return 0;
 }
index ef4d56ea00278bf4183ac932fd7f46edda8b1618..61e03d4703f6184bd0579ec45c0c6902c7aad3a2 100644 (file)
@@ -773,6 +773,7 @@ static int video_open(struct inode *inode, struct file *file)
        enum v4l2_buf_type type = 0;
        int radio = 0;
 
+       lock_kernel();
        list_for_each_entry(h, &cx8800_devlist, devlist) {
                if (h->video_dev->minor == minor) {
                        dev  = h;
@@ -788,8 +789,10 @@ static int video_open(struct inode *inode, struct file *file)
                        dev   = h;
                }
        }
-       if (NULL == dev)
+       if (NULL == dev) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        core = dev->core;
 
@@ -798,8 +801,10 @@ static int video_open(struct inode *inode, struct file *file)
 
        /* allocate + initialize per filehandle data */
        fh = kzalloc(sizeof(*fh),GFP_KERNEL);
-       if (NULL == fh)
+       if (NULL == fh) {
+               unlock_kernel();
                return -ENOMEM;
+       }
        file->private_data = fh;
        fh->dev      = dev;
        fh->radio    = radio;
@@ -832,6 +837,7 @@ static int video_open(struct inode *inode, struct file *file)
                cx88_set_stereo(core,V4L2_TUNER_MODE_STEREO,1);
                cx88_call_i2c_clients(core,AUDC_SET_RADIO,NULL);
        }
+       unlock_kernel();
 
        return 0;
 }
index 49ab0629702e289bb2a8360a00c0703e3d60f694..600b340e3550ae3ad70da8c2420d4721ae01c684 100644 (file)
@@ -1512,6 +1512,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
        struct em28xx_fh *fh;
        enum v4l2_buf_type fh_type = 0;
 
+       lock_kernel();
        list_for_each_entry(h, &em28xx_devlist, devlist) {
                if (h->vdev->minor == minor) {
                        dev  = h;
@@ -1527,8 +1528,10 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
                        dev   = h;
                }
        }
-       if (NULL == dev)
+       if (NULL == dev) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        em28xx_videodbg("open minor=%d type=%s users=%d\n",
                                minor, v4l2_type_names[fh_type], dev->users);
@@ -1537,6 +1540,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
        fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL);
        if (!fh) {
                em28xx_errdev("em28xx-video.c: Out of memory?!\n");
+               unlock_kernel();
                return -ENOMEM;
        }
        mutex_lock(&dev->lock);
@@ -1573,6 +1577,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
                        sizeof(struct em28xx_buffer), fh);
 
        mutex_unlock(&dev->lock);
+       unlock_kernel();
 
        return errCode;
 }
index a9ef7802eb5fcdaf793d8f695d4ecc35e0ddb903..cdaff2fdf394d621827f80d18893b8a4e653f1af 100644 (file)
@@ -845,15 +845,19 @@ static int meye_open(struct inode *inode, struct file *file)
 {
        int i, err;
 
+       lock_kernel();
        err = video_exclusive_open(inode, file);
-       if (err < 0)
+       if (err < 0) {
+               unlock_kernel();
                return err;
+       }
 
        mchip_hic_stop();
 
        if (mchip_dma_alloc()) {
                printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
                video_exclusive_release(inode, file);
+               unlock_kernel();
                return -ENOBUFS;
        }
 
@@ -861,6 +865,7 @@ static int meye_open(struct inode *inode, struct file *file)
                meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
        kfifo_reset(meye.grabq);
        kfifo_reset(meye.doneq);
+       unlock_kernel();
        return 0;
 }
 
index 00306faeac015f1ab9a99c8aaf32b894032bc444..26ffaa276c5198528083aa677904861f0575921a 100644 (file)
@@ -932,6 +932,7 @@ static int pvr2_v4l2_open(struct inode *inode, struct file *file)
        unsigned int input_cnt,idx;
        int ret = 0;
 
+       lock_kernel();
        dip = container_of(video_devdata(file),struct pvr2_v4l2_dev,devbase);
 
        vp = dip->v4lp;
@@ -942,11 +943,13 @@ static int pvr2_v4l2_open(struct inode *inode, struct file *file)
        if (!pvr2_hdw_dev_ok(hdw)) {
                pvr2_trace(PVR2_TRACE_OPEN_CLOSE,
                           "pvr2_v4l2_open: hardware not ready");
+               unlock_kernel();
                return -EIO;
        }
 
        fhp = kzalloc(sizeof(*fhp),GFP_KERNEL);
        if (!fhp) {
+               unlock_kernel();
                return -ENOMEM;
        }
 
@@ -976,6 +979,7 @@ static int pvr2_v4l2_open(struct inode *inode, struct file *file)
                           fhp);
 
                kfree(fhp);
+               unlock_kernel();
                return ret;
        }
 
@@ -992,6 +996,7 @@ static int pvr2_v4l2_open(struct inode *inode, struct file *file)
                           "Destroying pvr_v4l2_fh id=%p (input map failure)",
                           fhp);
                kfree(fhp);
+               unlock_kernel();
                return -ENOMEM;
        }
        input_cnt = 0;
@@ -1015,6 +1020,7 @@ static int pvr2_v4l2_open(struct inode *inode, struct file *file)
        v4l2_prio_open(&vp->prio,&fhp->prio);
 
        fhp->fw_mode_flag = pvr2_hdw_cpufw_get_enabled(hdw);
+       unlock_kernel();
 
        return 0;
 }
index 92b83feae3668d2bca19f32a956962c2107de7f7..de39cf0890fc0267dbfe09af4e8713ba744a288e 100644 (file)
@@ -1457,6 +1457,7 @@ static int s2255_open(struct inode *inode, struct file *file)
        int cur_channel = -1;
        dprintk(1, "s2255: open called (minor=%d)\n", minor);
 
+       lock_kernel();
        list_for_each(list, &s2255_devlist) {
                h = list_entry(list, struct s2255_dev, s2255_devlist);
                for (i = 0; i < MAX_CHANNELS; i++) {
@@ -1469,6 +1470,7 @@ static int s2255_open(struct inode *inode, struct file *file)
        }
 
        if ((NULL == dev) || (cur_channel == -1)) {
+               unlock_kernel();
                dprintk(1, "s2255: openv4l no dev\n");
                return -ENODEV;
        }
@@ -1490,6 +1492,7 @@ static int s2255_open(struct inode *inode, struct file *file)
                        printk(KERN_INFO "2255 FW load failed.\n");
                        dev->users[cur_channel]--;
                        mutex_unlock(&dev->open_lock);
+                       unlock_kernel();
                        return -EFAULT;
                }
        } else if (atomic_read(&dev->fw_data->fw_state) == S2255_FW_NOTLOADED) {
@@ -1506,6 +1509,7 @@ static int s2255_open(struct inode *inode, struct file *file)
                               "try again\n");
                        dev->users[cur_channel]--;
                        mutex_unlock(&dev->open_lock);
+                       unlock_kernel();
                        return -EBUSY;
                }
        }
@@ -1515,6 +1519,7 @@ static int s2255_open(struct inode *inode, struct file *file)
        if (NULL == fh) {
                dev->users[cur_channel]--;
                mutex_unlock(&dev->open_lock);
+               unlock_kernel();
                return -ENOMEM;
        }
 
@@ -1548,6 +1553,7 @@ static int s2255_open(struct inode *inode, struct file *file)
 
        kref_get(&dev->kref);
        mutex_unlock(&dev->open_lock);
+       unlock_kernel();
        return 0;
 }
 
index 6ee63e69b36c4d7106fd0b2bcafb0433df47d64b..e2c538ee88f271a7e58951f8715a2449fb5d691b 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/init.h>
 #include <linux/i2c.h>
 #include <linux/videotext.h>
+#include <linux/smp_lock.h>
 #include <linux/videodev.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
@@ -737,9 +738,12 @@ static int saa5246a_open(struct inode *inode, struct file *file)
        struct saa5246a_device *t = vd->priv;
        int err;
 
+       lock_kernel();
        err = video_exclusive_open(inode,file);
-       if (err < 0)
+       if (err < 0) {
+               unlock_kernel();
                return err;
+       }
 
        if (t->client==NULL) {
                err = -ENODEV;
@@ -776,11 +780,13 @@ static int saa5246a_open(struct inode *inode, struct file *file)
                err = -EIO;
                goto fail;
        }
+       unlock_kernel();
 
        return 0;
 
 fail:
        video_exclusive_release(inode,file);
+       unlock_kernel();
        return err;
 }
 
index 0d639738d4e68044f4fa651b97d35573b820da83..96c0fdf1a0510029ee4ef10c84e676867a4b144d 100644 (file)
@@ -52,6 +52,7 @@
 #include <linux/ioport.h>
 #include <linux/slab.h>
 #include <linux/init.h>
+#include <linux/smp_lock.h>
 #include <stdarg.h>
 #include <linux/i2c.h>
 #include <linux/videotext.h>
@@ -633,9 +634,12 @@ static int saa5249_open(struct inode *inode, struct file *file)
        struct saa5249_device *t=vd->priv;
        int err,pgbuf;
 
+       lock_kernel();
        err = video_exclusive_open(inode,file);
-       if (err < 0)
+       if (err < 0) {
+               unlock_kernel();
                return err;
+       }
 
        if (t->client==NULL) {
                err = -ENODEV;
@@ -664,10 +668,12 @@ static int saa5249_open(struct inode *inode, struct file *file)
                t->is_searching[pgbuf] = false;
        }
        t->virtual_mode = false;
+       unlock_kernel();
        return 0;
 
  fail:
        video_exclusive_release(inode,file);
+       unlock_kernel();
        return err;
 }
 
index c0c5d7509c25a81c9fb5fda2c79b74cf2314617a..6f423d116fb447aa9113f9d8529dfed9aad85c89 100644 (file)
@@ -79,9 +79,11 @@ static int ts_open(struct inode *inode, struct file *file)
        struct saa7134_dev *dev;
        int err;
 
+       lock_kernel();
        list_for_each_entry(dev, &saa7134_devlist, devlist)
                if (dev->empress_dev && dev->empress_dev->minor == minor)
                        goto found;
+       unlock_kernel();
        return -ENODEV;
  found:
 
@@ -103,6 +105,7 @@ static int ts_open(struct inode *inode, struct file *file)
 done_up:
        mutex_unlock(&dev->empress_tsq.vb_lock);
 done:
+       unlock_kernel();
        return err;
 }
 
index 68c268981861dee9e8abc93e640a036480eecce8..8fd31138f9ad6ff646aa44438bc84a6642c8366f 100644 (file)
@@ -1330,6 +1330,8 @@ static int video_open(struct inode *inode, struct file *file)
        struct saa7134_fh *fh;
        enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        int radio = 0;
+
+       lock_kernel();
        list_for_each_entry(dev, &saa7134_devlist, devlist) {
                if (dev->video_dev && (dev->video_dev->minor == minor))
                        goto found;
@@ -1342,6 +1344,7 @@ static int video_open(struct inode *inode, struct file *file)
                        goto found;
                }
        }
+       unlock_kernel();
        return -ENODEV;
  found:
 
@@ -1350,8 +1353,10 @@ static int video_open(struct inode *inode, struct file *file)
 
        /* allocate + initialize per filehandle data */
        fh = kzalloc(sizeof(*fh),GFP_KERNEL);
-       if (NULL == fh)
+       if (NULL == fh) {
+               unlock_kernel();
                return -ENOMEM;
+       }
        file->private_data = fh;
        fh->dev      = dev;
        fh->radio    = radio;
@@ -1384,6 +1389,7 @@ static int video_open(struct inode *inode, struct file *file)
                /* switch to video/vbi mode */
                video_mux(dev,dev->ctl_input);
        }
+       unlock_kernel();
        return 0;
 }
 
index acceed5d04aee9f9a0aa1b0abb4cb1fef52d90f3..d16bbf0d278379510527cbea80d02752958759ad 100644 (file)
@@ -936,14 +936,18 @@ static int se401_open(struct inode *inode, struct file *file)
        struct usb_se401 *se401 = (struct usb_se401 *)dev;
        int err = 0;
 
-       if (se401->user)
+       lock_kernel();
+       if (se401->user) {
+               unlock_kernel();
                return -EBUSY;
+       }
        se401->fbuf = rvmalloc(se401->maxframesize * SE401_NUMFRAMES);
        if (se401->fbuf)
                file->private_data = dev;
        else
                err = -ENOMEM;
        se401->user = !err;
+       unlock_kernel();
 
        return err;
 }
index ad36af30e0992195fa1f72da85428f394d4251a4..6b1ef5dc562cbc850e08ca72430c59205d89bfff 100644 (file)
@@ -689,11 +689,15 @@ static int v4l_stk_open(struct inode *inode, struct file *fp)
        vdev = video_devdata(fp);
        dev = vdev_to_camera(vdev);
 
-       if (dev == NULL || !is_present(dev))
+       lock_kernel();
+       if (dev == NULL || !is_present(dev)) {
+               unlock_kernel();
                return -ENXIO;
+       }
        fp->private_data = vdev;
        kref_get(&dev->kref);
        usb_autopm_get_interface(dev->interface);
+       unlock_kernel();
 
        return 0;
 }
index 276bded06ab3eb9ac9b7f9414000b1918d81ce24..a3cbe9be3c15e363eab265575505846d78a0d0a2 100644 (file)
@@ -1882,12 +1882,16 @@ static int saa_open(struct inode *inode, struct file *file)
        struct video_device *vdev = video_devdata(file);
        struct saa7146 *saa = container_of(vdev, struct saa7146, video_dev);
 
+       lock_kernel();
        file->private_data = saa;
 
        saa->user++;
-       if (saa->user > 1)
+       if (saa->user > 1) {
+               unlock_kernel();
                return 0;       /* device open already, don't reset */
+       }
        saa->writemode = VID_WRITE_MPEG_VID;    /* default to video */
+       unlock_kernel();
        return 0;
 }
 
index dce947439459ca46e2d020b49440a318a6c9e20c..b21a8d6827c4e417d231e1c65c76336f4f2bcef6 100644 (file)
@@ -1086,6 +1086,7 @@ static int stv_open (struct inode *inode, struct file *file)
        int err = 0;
 
        /* we are called with the BKL held */
+       lock_kernel();
        stv680->user = 1;
        err = stv_init (stv680);        /* main initialization routine for camera */
 
@@ -1099,6 +1100,7 @@ static int stv_open (struct inode *inode, struct file *file)
        }
        if (err)
                stv680->user = 0;
+       unlock_kernel();
 
        return err;
 }
index 2eb45829791ccf509a04a15599df1381f1c732cd..efb878a7402e1f90cd2e7b8dcd5b247569cd5b16 100644 (file)
@@ -488,20 +488,24 @@ vicam_open(struct inode *inode, struct file *file)
         * rely on this fact forever.
         */
 
+       lock_kernel();
        if (cam->open_count > 0) {
                printk(KERN_INFO
                       "vicam_open called on already opened camera");
+               unlock_kernel();
                return -EBUSY;
        }
 
        cam->raw_image = kmalloc(VICAM_MAX_READ_SIZE, GFP_KERNEL);
        if (!cam->raw_image) {
+               unlock_kernel();
                return -ENOMEM;
        }
 
        cam->framebuf = rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
        if (!cam->framebuf) {
                kfree(cam->raw_image);
+               unlock_kernel();
                return -ENOMEM;
        }
 
@@ -509,6 +513,7 @@ vicam_open(struct inode *inode, struct file *file)
        if (!cam->cntrlbuf) {
                kfree(cam->raw_image);
                rvfree(cam->framebuf, VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
+               unlock_kernel();
                return -ENOMEM;
        }
 
@@ -526,6 +531,7 @@ vicam_open(struct inode *inode, struct file *file)
        cam->open_count++;
 
        file->private_data = cam;
+       unlock_kernel();
 
        return 0;
 }
index b977116a0dd99ccfa6475940c01bb860605dea13..b76295a5be8b9ac5dfce7500bfdbbb7363425bdb 100644 (file)
@@ -367,6 +367,7 @@ static int usbvision_v4l2_open(struct inode *inode, struct file *file)
 
        PDEBUG(DBG_IO, "open");
 
+       lock_kernel();
        usbvision_reset_powerOffTimer(usbvision);
 
        if (usbvision->user)
@@ -424,6 +425,7 @@ static int usbvision_v4l2_open(struct inode *inode, struct file *file)
        usbvision_empty_framequeues(usbvision);
 
        PDEBUG(DBG_IO, "success");
+       unlock_kernel();
        return errCode;
 }
 
index 155fdec9ac7d7c4fc0aa773581021fbe59ab3355..6b9f3cb0de989251655d1bd3a113b93c3627d783 100644 (file)
@@ -116,7 +116,6 @@ static int video_open(struct inode *inode, struct file *file)
 
        if (minor >= VIDEO_NUM_DEVICES)
                return -ENODEV;
-       lock_kernel();
        mutex_lock(&videodev_lock);
        vfl = video_device[minor];
        if (vfl == NULL) {
@@ -126,7 +125,6 @@ static int video_open(struct inode *inode, struct file *file)
                vfl = video_device[minor];
                if (vfl == NULL) {
                        mutex_unlock(&videodev_lock);
-                       unlock_kernel();
                        return -ENODEV;
                }
        }
@@ -140,7 +138,6 @@ static int video_open(struct inode *inode, struct file *file)
        }
        fops_put(old_fops);
        mutex_unlock(&videodev_lock);
-       unlock_kernel();
        return err;
 }
 
index 8ba8daafd7ea2a3a2dff574b535a2908128b8d8b..65c8af18e767a7e889ac239517b23823e71c9993 100644 (file)
@@ -898,9 +898,11 @@ static int vivi_open(struct inode *inode, struct file *file)
 
        printk(KERN_DEBUG "vivi: open called (minor=%d)\n", minor);
 
+       lock_kernel();
        list_for_each_entry(dev, &vivi_devlist, vivi_devlist)
                if (dev->vfd->minor == minor)
                        goto found;
+       unlock_kernel();
        return -ENODEV;
 
 found:
@@ -925,8 +927,10 @@ found:
        }
 unlock:
        mutex_unlock(&dev->mutex);
-       if (retval)
+       if (retval) {
+               unlock_kernel();
                return retval;
+       }
 
        file->private_data = fh;
        fh->dev      = dev;
@@ -955,6 +959,7 @@ unlock:
                        sizeof(struct vivi_buffer), fh);
 
        vivi_start_thread(fh);
+       unlock_kernel();
 
        return 0;
 }
index 2dab9eea4def302f7f934dab82426f3f71850134..4aa1a765626d42616ffe4083b765aaf7d3e98fb6 100644 (file)
@@ -1211,6 +1211,7 @@ zoran_open (struct inode *inode,
        struct zoran_fh *fh;
        int i, res, first_open = 0, have_module_locks = 0;
 
+       lock_kernel();
        /* find the device */
        for (i = 0; i < zoran_num; i++) {
                if (zoran[i]->video_dev->minor == minor) {
@@ -1321,6 +1322,7 @@ zoran_open (struct inode *inode,
        file->private_data = fh;
        fh->zr = zr;
        zoran_open_init_session(file);
+       unlock_kernel();
 
        return 0;
 
@@ -1338,6 +1340,7 @@ open_unlock_and_return:
        if (zr) {
                /*mutex_unlock(&zr->resource_lock);*/
        }
+       unlock_kernel();
 
        return res;
 }
index 18d1c4ba79fbf7c8384ba8497320d180ad226b44..4e1ef10d22df0e2fd00c8fe00e42ecf0d9925a3d 100644 (file)
@@ -643,14 +643,18 @@ static int zr364xx_open(struct inode *inode, struct file *file)
 
        cam->skip = 2;
 
+       lock_kernel();
        err = video_exclusive_open(inode, file);
-       if (err < 0)
+       if (err < 0) {
+               unlock_kernel();
                return err;
+       }
 
        if (!cam->framebuf) {
                cam->framebuf = vmalloc_32(MAX_FRAME_SIZE * FRAMES);
                if (!cam->framebuf) {
                        info("vmalloc_32 failed!");
+                       unlock_kernel();
                        return -ENOMEM;
                }
        }
@@ -664,6 +668,7 @@ static int zr364xx_open(struct inode *inode, struct file *file)
                if (err < 0) {
                        info("error during open sequence: %d", i);
                        mutex_unlock(&cam->lock);
+                       unlock_kernel();
                        return err;
                }
        }
@@ -676,6 +681,7 @@ static int zr364xx_open(struct inode *inode, struct file *file)
        mdelay(100);
 
        mutex_unlock(&cam->lock);
+       unlock_kernel();
        return 0;
 }