return rc;
 
        if (dev->stream_on)
-               return -EINVAL;
+               return -EBUSY;
 
-       mutex_lock(&dev->lock);
        dev->stream_on = 1;
        fh->stream_on  = 1;
-       mutex_unlock(&dev->lock);
        return rc;
 }
 
                return rc;
 
 
-       if (unlikely(res_get(fh) < 0))
-               return -EBUSY;
+       mutex_lock(&dev->lock);
+       rc = res_get(fh);
+       mutex_unlock(&dev->lock);
+
+       if (unlikely(rc < 0))
+               return rc;
 
        return (videobuf_streamon(&fh->vb_vidq));
 }
         */
 
        if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
-               if (unlikely(res_get(fh)))
-                       return -EBUSY;
+               mutex_lock(&dev->lock);
+               rc = res_get(fh);
+               mutex_unlock(&dev->lock);
+
+               if (unlikely(rc < 0))
+                       return rc;
 
                return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
                                        filp->f_flags & O_NONBLOCK);
        if (rc < 0)
                return rc;
 
-       if (unlikely(res_get(fh) < 0))
+       mutex_lock(&dev->lock);
+       rc = res_get(fh);
+       mutex_unlock(&dev->lock);
+
+       if (unlikely(rc < 0))
                return POLLERR;
 
        if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
        struct em28xx    *dev   = fh->dev;
        int              rc;
 
-       if (unlikely(res_get(fh) < 0))
-               return -EBUSY;
-
        rc = check_dev(dev);
        if (rc < 0)
                return rc;
 
+       mutex_lock(&dev->lock);
+       rc = res_get(fh);
+       mutex_unlock(&dev->lock);
+
+       if (unlikely(rc < 0))
+               return rc;
+
        rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
 
        em28xx_videodbg("vma start=0x%08lx, size=%ld, ret=%d\n",