vserver 1.9.5.x5
[linux-2.6.git] / fs / select.c
index 16fc1ef..1de9b6a 100644 (file)
@@ -14,6 +14,7 @@
  *     of fds to overcome nfds < 16390 descriptors limit (Tigran Aivazian).
  */
 
+#include <linux/syscalls.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
@@ -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);