|
@@ -1117,6 +1117,7 @@ static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, v
|
|
|
unsigned long flags;
|
|
|
struct epitem *epi = ep_item_from_wait(wait);
|
|
|
struct eventpoll *ep = epi->ep;
|
|
|
+ __poll_t pollflags = key_to_poll(key);
|
|
|
int ewake = 0;
|
|
|
|
|
|
spin_lock_irqsave(&ep->lock, flags);
|
|
@@ -1138,7 +1139,7 @@ static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, v
|
|
|
* callback. We need to be able to handle both cases here, hence the
|
|
|
* test for "key" != NULL before the event match test.
|
|
|
*/
|
|
|
- if (key && !((unsigned long) key & epi->event.events))
|
|
|
+ if (pollflags && !(pollflags & epi->event.events))
|
|
|
goto out_unlock;
|
|
|
|
|
|
/*
|
|
@@ -1175,8 +1176,8 @@ static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, v
|
|
|
*/
|
|
|
if (waitqueue_active(&ep->wq)) {
|
|
|
if ((epi->event.events & EPOLLEXCLUSIVE) &&
|
|
|
- !((unsigned long)key & POLLFREE)) {
|
|
|
- switch ((unsigned long)key & EPOLLINOUT_BITS) {
|
|
|
+ !(pollflags & POLLFREE)) {
|
|
|
+ switch (pollflags & EPOLLINOUT_BITS) {
|
|
|
case POLLIN:
|
|
|
if (epi->event.events & POLLIN)
|
|
|
ewake = 1;
|
|
@@ -1205,7 +1206,7 @@ out_unlock:
|
|
|
if (!(epi->event.events & EPOLLEXCLUSIVE))
|
|
|
ewake = 1;
|
|
|
|
|
|
- if ((unsigned long)key & POLLFREE) {
|
|
|
+ if (pollflags & POLLFREE) {
|
|
|
/*
|
|
|
* If we race with ep_remove_wait_queue() it can miss
|
|
|
* ->whead = NULL and do another remove_wait_queue() after
|