git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[media] v4l2-event: Remove pending events from fh event queue when unsubscribing
[pandora-kernel.git]
/
drivers
/
media
/
video
/
v4l2-event.c
diff --git
a/drivers/media/video/v4l2-event.c
b/drivers/media/video/v4l2-event.c
index
53b190c
..
4d01f17
100644
(file)
--- a/
drivers/media/video/v4l2-event.c
+++ b/
drivers/media/video/v4l2-event.c
@@
-215,6
+215,9
@@
int v4l2_event_subscribe(struct v4l2_fh *fh,
unsigned long flags;
unsigned i;
unsigned long flags;
unsigned i;
+ if (sub->type == V4L2_EVENT_ALL)
+ return -EINVAL;
+
if (elems < 1)
elems = 1;
if (sub->type == V4L2_EVENT_CTRL) {
if (elems < 1)
elems = 1;
if (sub->type == V4L2_EVENT_CTRL) {
@@
-282,6
+285,7
@@
int v4l2_event_unsubscribe(struct v4l2_fh *fh,
{
struct v4l2_subscribed_event *sev;
unsigned long flags;
{
struct v4l2_subscribed_event *sev;
unsigned long flags;
+ int i;
if (sub->type == V4L2_EVENT_ALL) {
v4l2_event_unsubscribe_all(fh);
if (sub->type == V4L2_EVENT_ALL) {
v4l2_event_unsubscribe_all(fh);
@@
-292,6
+296,11
@@
int v4l2_event_unsubscribe(struct v4l2_fh *fh,
sev = v4l2_event_subscribed(fh, sub->type, sub->id);
if (sev != NULL) {
sev = v4l2_event_subscribed(fh, sub->type, sub->id);
if (sev != NULL) {
+ /* Remove any pending events for this subscription */
+ for (i = 0; i < sev->in_use; i++) {
+ list_del(&sev->events[sev_pos(sev, i)].list);
+ fh->navailable--;
+ }
list_del(&sev->list);
sev->fh = NULL;
}
list_del(&sev->list);
sev->fh = NULL;
}