* 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>
}
}
+#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)
{
retval++;
}
}
+ cond_resched();
}
if (res_in)
*rinp = res_in;
return retval;
}
-EXPORT_SYMBOL(do_select);
-
static void *select_bits_alloc(int size)
{
return kmalloc(6 * size, GFP_KERNEL);
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);