From: Hans de Goede Date: Sun, 9 Oct 2011 13:28:27 +0000 (-0300) Subject: [media] pwc: poll(): Check that the device has not beem claimed for streaming already X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=296da3cd14db9eb5606924962b2956c9c656dbb0;p=linux-beck.git [media] pwc: poll(): Check that the device has not beem claimed for streaming already Some apps which use read() start the streaming through a call to poll(), this means that if another app has already claimed the device for streaming (through for example a s_fmt, or a reqbufs), that the poll should fail instead of getting passed through to vb2_poll. We only check for this when the app is polling for reads, so that ctrl events still work. Signed-off-by: Hans de Goede Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/video/pwc/pwc-if.c b/drivers/media/video/pwc/pwc-if.c index 122fbd0081eb..f3370a87cbc0 100644 --- a/drivers/media/video/pwc/pwc-if.c +++ b/drivers/media/video/pwc/pwc-if.c @@ -625,10 +625,19 @@ static ssize_t pwc_video_read(struct file *file, char __user *buf, static unsigned int pwc_video_poll(struct file *file, poll_table *wait) { struct pwc_device *pdev = video_drvdata(file); + unsigned long req_events = poll_requested_events(wait); if (!pdev->udev) return POLL_ERR; + if ((req_events & (POLLIN | POLLRDNORM)) && + pdev->vb_queue.num_buffers == 0 && + !pdev->iso_init) { + /* This poll will start a read stream, check capt_file */ + if (pwc_test_n_set_capt_file(pdev, file)) + return POLL_ERR; + } + return vb2_poll(&pdev->vb_queue, file, wait); }