diff options
Diffstat (limited to 'fs/eventpoll.c')
-rw-r--r-- | fs/eventpoll.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 336fdb8ed47b..a89f370fadb5 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
@@ -371,9 +371,28 @@ static int ep_call_nested(struct nested_calls *ncalls, int max_nests, | |||
371 | return error; | 371 | return error; |
372 | } | 372 | } |
373 | 373 | ||
374 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
375 | static inline void ep_wake_up_nested(wait_queue_head_t *wqueue, | ||
376 | unsigned long events, int subclass) | ||
377 | { | ||
378 | unsigned long flags; | ||
379 | |||
380 | spin_lock_irqsave_nested(&wqueue->lock, flags, subclass); | ||
381 | wake_up_locked_poll(wqueue, events); | ||
382 | spin_unlock_irqrestore(&wqueue->lock, flags); | ||
383 | } | ||
384 | #else | ||
385 | static inline void ep_wake_up_nested(wait_queue_head_t *wqueue, | ||
386 | unsigned long events, int subclass) | ||
387 | { | ||
388 | wake_up_poll(wqueue, events); | ||
389 | } | ||
390 | #endif | ||
391 | |||
374 | static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests) | 392 | static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests) |
375 | { | 393 | { |
376 | wake_up_nested((wait_queue_head_t *) cookie, 1 + call_nests); | 394 | ep_wake_up_nested((wait_queue_head_t *) cookie, POLLIN, |
395 | 1 + call_nests); | ||
377 | return 0; | 396 | return 0; |
378 | } | 397 | } |
379 | 398 | ||
@@ -783,6 +802,15 @@ static int ep_poll_callback(wait_queue_t *wait, unsigned mode, int sync, void *k | |||
783 | goto out_unlock; | 802 | goto out_unlock; |
784 | 803 | ||
785 | /* | 804 | /* |
805 | * Check the events coming with the callback. At this stage, not | ||
806 | * every device reports the events in the "key" parameter of the | ||
807 | * callback. We need to be able to handle both cases here, hence the | ||
808 | * test for "key" != NULL before the event match test. | ||
809 | */ | ||
810 | if (key && !((unsigned long) key & epi->event.events)) | ||
811 | goto out_unlock; | ||
812 | |||
813 | /* | ||
786 | * If we are trasfering events to userspace, we can hold no locks | 814 | * If we are trasfering events to userspace, we can hold no locks |
787 | * (because we're accessing user memory, and because of linux f_op->poll() | 815 | * (because we're accessing user memory, and because of linux f_op->poll() |
788 | * semantics). All the events that happens during that period of time are | 816 | * semantics). All the events that happens during that period of time are |
@@ -1254,7 +1282,6 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, | |||
1254 | case EPOLL_CTL_ADD: | 1282 | case EPOLL_CTL_ADD: |
1255 | if (!epi) { | 1283 | if (!epi) { |
1256 | epds.events |= POLLERR | POLLHUP; | 1284 | epds.events |= POLLERR | POLLHUP; |
1257 | |||
1258 | error = ep_insert(ep, &epds, tfile, fd); | 1285 | error = ep_insert(ep, &epds, tfile, fd); |
1259 | } else | 1286 | } else |
1260 | error = -EEXIST; | 1287 | error = -EEXIST; |