X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fselect.c;h=1de9b6ac7d352f3a54764234b82acf0853fdeeed;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=16fc1ef95981bb69f3c1461d28c3370361f6e506;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/select.c b/fs/select.c index 16fc1ef95..1de9b6ac7 100644 --- a/fs/select.c +++ b/fs/select.c @@ -14,6 +14,7 @@ * of fds to overcome nfds < 16390 descriptors limit (Tigran Aivazian). */ +#include #include #include #include @@ -118,15 +119,11 @@ void __pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table * } } +#define FDS_IN(fds, n) (fds->in + n) +#define FDS_OUT(fds, n) (fds->out + n) +#define FDS_EX(fds, n) (fds->ex + n) -#define __IN(fds, n) (fds->in + n) -#define __OUT(fds, n) (fds->out + n) -#define __EX(fds, n) (fds->ex + n) -#define __RES_IN(fds, n) (fds->res_in + n) -#define __RES_OUT(fds, n) (fds->res_out + n) -#define __RES_EX(fds, n) (fds->res_ex + n) - -#define BITS(fds, n) (*__IN(fds, n)|*__OUT(fds, n)|*__EX(fds, n)) +#define BITS(fds, n) (*FDS_IN(fds, n)|*FDS_OUT(fds, n)|*FDS_EX(fds, n)) static int max_select_fd(unsigned long n, fd_set_bits *fds) { @@ -243,6 +240,7 @@ int do_select(int n, fd_set_bits *fds, long *timeout) retval++; } } + cond_resched(); } if (res_in) *rinp = res_in; @@ -271,8 +269,6 @@ int do_select(int n, fd_set_bits *fds, long *timeout) return retval; } -EXPORT_SYMBOL(do_select); - static void *select_bits_alloc(int size) { return kmalloc(6 * size, GFP_KERNEL); @@ -377,9 +373,10 @@ sys_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, s ret = 0; } - set_fd_set(n, inp, fds.res_in); - set_fd_set(n, outp, fds.res_out); - set_fd_set(n, exp, fds.res_ex); + if (set_fd_set(n, inp, fds.res_in) || + set_fd_set(n, outp, fds.res_out) || + set_fd_set(n, exp, fds.res_ex)) + ret = -EFAULT; out: select_bits_free(bits, size);