diff options
Diffstat (limited to 'fs/select.c')
| -rw-r--r-- | fs/select.c | 64 | 
1 files changed, 34 insertions, 30 deletions
| diff --git a/fs/select.c b/fs/select.c index 945896d0ac9e..0ee55af1a55c 100644 --- a/fs/select.c +++ b/fs/select.c @@ -15,6 +15,7 @@   *     of fds to overcome nfds < 16390 descriptors limit (Tigran Aivazian).   */ +#include <linux/compat.h>  #include <linux/kernel.h>  #include <linux/sched/signal.h>  #include <linux/sched/rt.h> @@ -458,9 +459,11 @@ get_max:  	return max;  } -#define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | EPOLLHUP | EPOLLERR) -#define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT | EPOLLERR) -#define POLLEX_SET (EPOLLPRI) +#define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | EPOLLHUP | EPOLLERR |\ +			EPOLLNVAL) +#define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT | EPOLLERR |\ +			 EPOLLNVAL) +#define POLLEX_SET (EPOLLPRI | EPOLLNVAL)  static inline void wait_key_set(poll_table *wait, unsigned long in,  				unsigned long out, unsigned long bit, @@ -527,6 +530,7 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)  					break;  				if (!(bit & all_bits))  					continue; +				mask = EPOLLNVAL;  				f = fdget(i);  				if (f.file) {  					wait_key_set(wait, in, out, bit, @@ -534,34 +538,34 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)  					mask = vfs_poll(f.file, wait);  					fdput(f); -					if ((mask & POLLIN_SET) && (in & bit)) { -						res_in |= bit; -						retval++; -						wait->_qproc = NULL; -					} -					if ((mask & POLLOUT_SET) && (out & bit)) { -						res_out |= bit; -						retval++; -						wait->_qproc = NULL; -					} -					if ((mask & POLLEX_SET) && (ex & bit)) { -						res_ex |= bit; -						retval++; -						wait->_qproc = NULL; -					} -					/* got something, stop busy polling */ -					if (retval) { -						can_busy_loop = false; -						busy_flag = 0; - -					/* -					 * only remember a returned -					 * POLL_BUSY_LOOP if we asked for it -					 */ -					} else if (busy_flag & mask) -						can_busy_loop = true; -  				} +				if ((mask & POLLIN_SET) && (in & bit)) { +					res_in |= bit; +					retval++; +					wait->_qproc = NULL; +				} +				if ((mask & POLLOUT_SET) && (out & bit)) { +					res_out |= bit; +					retval++; +					wait->_qproc = NULL; +				} +				if ((mask & POLLEX_SET) && (ex & bit)) { +					res_ex |= bit; +					retval++; +					wait->_qproc = NULL; +				} +				/* got something, stop busy polling */ +				if (retval) { +					can_busy_loop = false; +					busy_flag = 0; + +				/* +				 * only remember a returned +				 * POLL_BUSY_LOOP if we asked for it +				 */ +				} else if (busy_flag & mask) +					can_busy_loop = true; +  			}  			if (res_in)  				*rinp = res_in; |