Commit a2d887c5 authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

[media] gspca: Use req_events in poll



So that we don't start a read stream when an app is only polling for control
events.

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9a190c85
Loading
Loading
Loading
Loading
+26 −18
Original line number Diff line number Diff line
@@ -2030,31 +2030,39 @@ out:
static unsigned int dev_poll(struct file *file, poll_table *wait)
{
	struct gspca_dev *gspca_dev = video_drvdata(file);
	int ret;
	unsigned long req_events = poll_requested_events(wait);
	int ret = 0;

	PDEBUG(D_FRAM, "poll");

	poll_wait(file, &gspca_dev->wq, wait);
	if (req_events & POLLPRI)
		ret |= v4l2_ctrl_poll(file, wait);

	if (req_events & (POLLIN | POLLRDNORM)) {
		/* if reqbufs is not done, the user would use read() */
		if (gspca_dev->memory == GSPCA_MEMORY_NO) {
		ret = read_alloc(gspca_dev, file);
		if (ret != 0)
			return POLLERR;
			if (read_alloc(gspca_dev, file) != 0) {
				ret |= POLLERR;
				goto out;
			}
		}

	if (mutex_lock_interruptible(&gspca_dev->queue_lock) != 0)
		return POLLERR;
		poll_wait(file, &gspca_dev->wq, wait);

		/* check if an image has been received */
		if (mutex_lock_interruptible(&gspca_dev->queue_lock) != 0) {
			ret |= POLLERR;
			goto out;
		}
		if (gspca_dev->fr_o != atomic_read(&gspca_dev->fr_i))
		ret = POLLIN | POLLRDNORM;	/* yes */
	else
		ret = 0;
	ret |= v4l2_ctrl_poll(file, wait);
			ret |= POLLIN | POLLRDNORM;
		mutex_unlock(&gspca_dev->queue_lock);
	}

out:
	if (!gspca_dev->present)
		return POLLHUP;
		ret |= POLLHUP;

	return ret;
}