ocfs2: try a blocking lock before return AOP_TRUNCATED_PAGE
[linux-2.6-microblaze.git] / fs / select.c
index 6de493b..ec14171 100644 (file)
@@ -212,7 +212,7 @@ static int pollwake(wait_queue_entry_t *wait, unsigned mode, int sync, void *key
        struct poll_table_entry *entry;
 
        entry = container_of(wait, struct poll_table_entry, wait);
-       if (key && !((unsigned long)key & entry->key))
+       if (key && !(key_to_poll(key) & entry->key))
                return 0;
        return __pollwake(wait, mode, sync, key);
 }
@@ -438,7 +438,7 @@ get_max:
 
 static inline void wait_key_set(poll_table *wait, unsigned long in,
                                unsigned long out, unsigned long bit,
-                               unsigned int ll_flag)
+                               __poll_t ll_flag)
 {
        wait->_key = POLLEX_SET | ll_flag;
        if (in & bit)
@@ -454,7 +454,7 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)
        poll_table *wait;
        int retval, i, timed_out = 0;
        u64 slack = 0;
-       unsigned int busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
+       __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
        unsigned long busy_start = 0;
 
        rcu_read_lock();
@@ -484,8 +484,9 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)
                rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex;
 
                for (i = 0; i < n; ++rinp, ++routp, ++rexp) {
-                       unsigned long in, out, ex, all_bits, bit = 1, mask, j;
+                       unsigned long in, out, ex, all_bits, bit = 1, j;
                        unsigned long res_in = 0, res_out = 0, res_ex = 0;
+                       __poll_t mask;
 
                        in = *inp++; out = *outp++; ex = *exp++;
                        all_bits = in | out | ex;
@@ -802,11 +803,11 @@ struct poll_list {
  * pwait poll_table will be used by the fd-provided poll handler for waiting,
  * if pwait->_qproc is non-NULL.
  */
-static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait,
+static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
                                     bool *can_busy_poll,
-                                    unsigned int busy_flag)
+                                    __poll_t busy_flag)
 {
-       unsigned int mask;
+       __poll_t mask;
        int fd;
 
        mask = 0;
@@ -815,20 +816,24 @@ static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait,
                struct fd f = fdget(fd);
                mask = POLLNVAL;
                if (f.file) {
+                       /* userland u16 ->events contains POLL... bitmap */
+                       __poll_t filter = demangle_poll(pollfd->events) |
+                                               POLLERR | POLLHUP;
                        mask = DEFAULT_POLLMASK;
                        if (f.file->f_op->poll) {
-                               pwait->_key = pollfd->events|POLLERR|POLLHUP;
+                               pwait->_key = filter;
                                pwait->_key |= busy_flag;
                                mask = f.file->f_op->poll(f.file, pwait);
                                if (mask & busy_flag)
                                        *can_busy_poll = true;
                        }
                        /* Mask out unneeded events. */
-                       mask &= pollfd->events | POLLERR | POLLHUP;
+                       mask &= filter;
                        fdput(f);
                }
        }
-       pollfd->revents = mask;
+       /* ... and so does ->revents */
+       pollfd->revents = mangle_poll(mask);
 
        return mask;
 }
@@ -840,7 +845,7 @@ static int do_poll(struct poll_list *list, struct poll_wqueues *wait,
        ktime_t expire, *to = NULL;
        int timed_out = 0, count = 0;
        u64 slack = 0;
-       unsigned int busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
+       __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
        unsigned long busy_start = 0;
 
        /* Optimise the no-wait case */