diff options
Diffstat (limited to 'fs/select.c')
| -rw-r--r-- | fs/select.c | 28 | 
1 files changed, 12 insertions, 16 deletions
diff --git a/fs/select.c b/fs/select.c index ffdd16d6e69..2ef72d96503 100644 --- a/fs/select.c +++ b/fs/select.c @@ -428,8 +428,6 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)  		for (i = 0; i < n; ++rinp, ++routp, ++rexp) {  			unsigned long in, out, ex, all_bits, bit = 1, mask, j;  			unsigned long res_in = 0, res_out = 0, res_ex = 0; -			const struct file_operations *f_op = NULL; -			struct file *file = NULL;  			in = *inp++; out = *outp++; ex = *exp++;  			all_bits = in | out | ex; @@ -439,20 +437,21 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)  			}  			for (j = 0; j < BITS_PER_LONG; ++j, ++i, bit <<= 1) { -				int fput_needed; +				struct fd f;  				if (i >= n)  					break;  				if (!(bit & all_bits))  					continue; -				file = fget_light(i, &fput_needed); -				if (file) { -					f_op = file->f_op; +				f = fdget(i); +				if (f.file) { +					const struct file_operations *f_op; +					f_op = f.file->f_op;  					mask = DEFAULT_POLLMASK;  					if (f_op && f_op->poll) {  						wait_key_set(wait, in, out, bit); -						mask = (*f_op->poll)(file, wait); +						mask = (*f_op->poll)(f.file, wait);  					} -					fput_light(file, fput_needed); +					fdput(f);  					if ((mask & POLLIN_SET) && (in & bit)) {  						res_in |= bit;  						retval++; @@ -725,20 +724,17 @@ static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait)  	mask = 0;  	fd = pollfd->fd;  	if (fd >= 0) { -		int fput_needed; -		struct file * file; - -		file = fget_light(fd, &fput_needed); +		struct fd f = fdget(fd);  		mask = POLLNVAL; -		if (file != NULL) { +		if (f.file) {  			mask = DEFAULT_POLLMASK; -			if (file->f_op && file->f_op->poll) { +			if (f.file->f_op && f.file->f_op->poll) {  				pwait->_key = pollfd->events|POLLERR|POLLHUP; -				mask = file->f_op->poll(file, pwait); +				mask = f.file->f_op->poll(f.file, pwait);  			}  			/* Mask out unneeded events. */  			mask &= pollfd->events | POLLERR | POLLHUP; -			fput_light(file, fput_needed); +			fdput(f);  		}  	}  	pollfd->revents = mask;  |