Replace the fd_sets in struct fdtable with an array of unsigned longs
authorDavid Howells <dhowells@redhat.com>
Thu, 16 Feb 2012 17:49:54 +0000 (17:49 +0000)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 19 Feb 2012 18:30:57 +0000 (10:30 -0800)
commit1fd36adcd98c14d2fd97f545293c488775cb2823
treec13ab1934a15aebe0d81601d910ce5a3c6fa2c6f
parent1dce27c5aa6770e9d195f2bb7db1db3d4dde5591
Replace the fd_sets in struct fdtable with an array of unsigned longs

Replace the fd_sets in struct fdtable with an array of unsigned longs and then
use the standard non-atomic bit operations rather than the FD_* macros.

This:

 (1) Removes the abuses of struct fd_set:

     (a) Since we don't want to allocate a full fd_set the vast majority of the
       time, we actually, in effect, just allocate a just-big-enough array of
       unsigned longs and cast it to an fd_set type - so why bother with the
       fd_set at all?

     (b) Some places outside of the core fdtable handling code (such as
       SELinux) want to look inside the array of unsigned longs hidden inside
       the fd_set struct for more efficient iteration over the entire set.

 (2) Eliminates the use of FD_*() macros in the kernel completely.

 (3) Permits the __FD_*() macros to be deleted entirely where not exposed to
     userspace.

Signed-off-by: David Howells <dhowells@redhat.com>
Link: http://lkml.kernel.org/r/20120216174954.23314.48147.stgit@warthog.procyon.org.uk
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
fs/exec.c
fs/file.c
fs/select.c
include/linux/fdtable.h
kernel/exit.c
security/selinux/hooks.c