diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2013-02-06 07:23:01 (GMT) |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-05 17:43:41 (GMT) |
commit | 1b499fe506257369fd6059422989e36c71b99897 (patch) | |
tree | 65dd21e5895e796f68cdb1c4624a7cd753e9d340 | |
parent | f80daa2d7d7725559908909254d240c433cafc93 (diff) | |
download | linux-1b499fe506257369fd6059422989e36c71b99897.tar.xz |
[media] stk-webcam: fix read() handling when reqbufs was already called
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Tested-by: Arvydas Sidorenko <asido4@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/usb/stkwebcam/stk-webcam.c | 3 | ||||
-rw-r--r-- | drivers/media/usb/stkwebcam/stk-webcam.h | 1 |
2 files changed, 3 insertions, 1 deletions
diff --git a/drivers/media/usb/stkwebcam/stk-webcam.c b/drivers/media/usb/stkwebcam/stk-webcam.c index 2f1a09d..a8fdbaf 100644 --- a/drivers/media/usb/stkwebcam/stk-webcam.c +++ b/drivers/media/usb/stkwebcam/stk-webcam.c @@ -654,7 +654,7 @@ static ssize_t stk_read(struct file *fp, char __user *buf, if (!is_present(dev)) return -EIO; - if (dev->owner && dev->owner != fp) + if (dev->owner && (!dev->reading || dev->owner != fp)) return -EBUSY; dev->owner = fp; if (!is_streaming(dev)) { @@ -662,6 +662,7 @@ static ssize_t stk_read(struct file *fp, char __user *buf, || stk_allocate_buffers(dev, 3) || stk_start_stream(dev)) return -ENOMEM; + dev->reading = 1; spin_lock_irqsave(&dev->spinlock, flags); for (i = 0; i < dev->n_sbufs; i++) { list_add_tail(&dev->sio_bufs[i].list, &dev->sio_avail); diff --git a/drivers/media/usb/stkwebcam/stk-webcam.h b/drivers/media/usb/stkwebcam/stk-webcam.h index 03550cf..9bbfa3d 100644 --- a/drivers/media/usb/stkwebcam/stk-webcam.h +++ b/drivers/media/usb/stkwebcam/stk-webcam.h @@ -118,6 +118,7 @@ struct stk_camera { int frame_size; /* Streaming buffers */ + int reading; unsigned int n_sbufs; struct stk_sio_buffer *sio_bufs; struct list_head sio_avail; |