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>
This commit is contained in:

committed by
H. Peter Anvin

parent
1dce27c5aa
commit
1fd36adcd9
@@ -1026,10 +1026,10 @@ static void flush_old_files(struct files_struct * files)
|
||||
fdt = files_fdtable(files);
|
||||
if (i >= fdt->max_fds)
|
||||
break;
|
||||
set = fdt->close_on_exec->fds_bits[j];
|
||||
set = fdt->close_on_exec[j];
|
||||
if (!set)
|
||||
continue;
|
||||
fdt->close_on_exec->fds_bits[j] = 0;
|
||||
fdt->close_on_exec[j] = 0;
|
||||
spin_unlock(&files->file_lock);
|
||||
for ( ; set ; i++,set >>= 1) {
|
||||
if (set & 1) {
|
||||
|
Reference in New Issue
Block a user