fs: cleanup do_pollfd
authorChristoph Hellwig <hch@lst.de>
Mon, 5 Mar 2018 15:15:25 +0000 (07:15 -0800)
committerChristoph Hellwig <hch@lst.de>
Sat, 26 May 2018 07:16:44 +0000 (09:16 +0200)
Use straightline code with failure handling gotos instead of a lot
of nested conditionals.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/select.c

index a87f396..25da262 100644 (file)
@@ -812,34 +812,32 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
                                     bool *can_busy_poll,
                                     __poll_t busy_flag)
 {
-       __poll_t mask;
-       int fd;
-
-       mask = 0;
-       fd = pollfd->fd;
-       if (fd >= 0) {
-               struct fd f = fdget(fd);
-               mask = EPOLLNVAL;
-               if (f.file) {
-                       /* userland u16 ->events contains POLL... bitmap */
-                       __poll_t filter = demangle_poll(pollfd->events) |
-                                               EPOLLERR | EPOLLHUP;
-                       mask = DEFAULT_POLLMASK;
-                       if (f.file->f_op->poll) {
-                               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 &= filter;
-                       fdput(f);
-               }
+       int fd = pollfd->fd;
+       __poll_t mask = 0, filter;
+       struct fd f;
+
+       if (fd < 0)
+               goto out;
+       mask = EPOLLNVAL;
+       f = fdget(fd);
+       if (!f.file)
+               goto out;
+
+       /* userland u16 ->events contains POLL... bitmap */
+       filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP;
+       mask = DEFAULT_POLLMASK;
+       if (f.file->f_op->poll) {
+               pwait->_key = filter | busy_flag;
+               mask = f.file->f_op->poll(f.file, pwait);
+               if (mask & busy_flag)
+                       *can_busy_poll = true;
        }
+       mask &= filter;         /* Mask out unneeded events. */
+       fdput(f);
+
+out:
        /* ... and so does ->revents */
        pollfd->revents = mangle_poll(mask);
-
        return mask;
 }