diff options
author | David Howells <dhowells@redhat.com> | 2012-02-16 12:49:54 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-02-19 13:30:57 -0500 |
commit | 1fd36adcd98c14d2fd97f545293c488775cb2823 (patch) | |
tree | c13ab1934a15aebe0d81601d910ce5a3c6fa2c6f /fs/exec.c | |
parent | 1dce27c5aa6770e9d195f2bb7db1db3d4dde5591 (diff) |
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>
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -1026,10 +1026,10 @@ static void flush_old_files(struct files_struct * files) | |||
1026 | fdt = files_fdtable(files); | 1026 | fdt = files_fdtable(files); |
1027 | if (i >= fdt->max_fds) | 1027 | if (i >= fdt->max_fds) |
1028 | break; | 1028 | break; |
1029 | set = fdt->close_on_exec->fds_bits[j]; | 1029 | set = fdt->close_on_exec[j]; |
1030 | if (!set) | 1030 | if (!set) |
1031 | continue; | 1031 | continue; |
1032 | fdt->close_on_exec->fds_bits[j] = 0; | 1032 | fdt->close_on_exec[j] = 0; |
1033 | spin_unlock(&files->file_lock); | 1033 | spin_unlock(&files->file_lock); |
1034 | for ( ; set ; i++,set >>= 1) { | 1034 | for ( ; set ; i++,set >>= 1) { |
1035 | if (set & 1) { | 1035 | if (set & 1) { |