Commit 8ded2bbc authored by Josh Boyer's avatar Josh Boyer Committed by Linus Torvalds

posix_types.h: Cleanup stale __NFDBITS and related definitions

Recently, glibc made a change to suppress sign-conversion warnings in
FD_SET (glibc commit ceb9e56b3d1).  This uncovered an issue with the
kernel's definition of __NFDBITS if applications #include
<linux/types.h> after including <sys/select.h>.  A build failure would
be seen when passing the -Werror=sign-compare and -D_FORTIFY_SOURCE=2
flags to gcc.

It was suggested that the kernel should either match the glibc
definition of __NFDBITS or remove that entirely.  The current in-kernel
uses of __NFDBITS can be replaced with BITS_PER_LONG, and there are no
uses of the related __FDELT and __FDMASK defines.  Given that, we'll
continue the cleanup that was started with commit 8b3d1cda
("posix_types: Remove fd_set macros") and drop the remaining unused
macros.

Additionally, linux/time.h has similar macros defined that expand to
nothing so we'll remove those at the same time.
Reported-by: default avatarJeff Law <law@redhat.com>
Suggested-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
CC: <stable@vger.kernel.org>
Signed-off-by: default avatarJosh Boyer <jwboyer@redhat.com>
[ .. and fix up whitespace as per akpm ]
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4cb38750
...@@ -323,7 +323,7 @@ static void sp_cleanup(void) ...@@ -323,7 +323,7 @@ static void sp_cleanup(void)
fdt = files_fdtable(files); fdt = files_fdtable(files);
for (;;) { for (;;) {
unsigned long set; unsigned long set;
i = j * __NFDBITS; i = j * BITS_PER_LONG;
if (i >= fdt->max_fds) if (i >= fdt->max_fds)
break; break;
set = fdt->open_fds[j++]; set = fdt->open_fds[j++];
......
...@@ -1020,7 +1020,7 @@ static void flush_old_files(struct files_struct * files) ...@@ -1020,7 +1020,7 @@ static void flush_old_files(struct files_struct * files)
unsigned long set, i; unsigned long set, i;
j++; j++;
i = j * __NFDBITS; i = j * BITS_PER_LONG;
fdt = files_fdtable(files); fdt = files_fdtable(files);
if (i >= fdt->max_fds) if (i >= fdt->max_fds)
break; break;
......
...@@ -345,8 +345,8 @@ static int max_select_fd(unsigned long n, fd_set_bits *fds) ...@@ -345,8 +345,8 @@ static int max_select_fd(unsigned long n, fd_set_bits *fds)
struct fdtable *fdt; struct fdtable *fdt;
/* handle last in-complete long-word first */ /* handle last in-complete long-word first */
set = ~(~0UL << (n & (__NFDBITS-1))); set = ~(~0UL << (n & (BITS_PER_LONG-1)));
n /= __NFDBITS; n /= BITS_PER_LONG;
fdt = files_fdtable(current->files); fdt = files_fdtable(current->files);
open_fds = fdt->open_fds + n; open_fds = fdt->open_fds + n;
max = 0; max = 0;
...@@ -373,7 +373,7 @@ static int max_select_fd(unsigned long n, fd_set_bits *fds) ...@@ -373,7 +373,7 @@ static int max_select_fd(unsigned long n, fd_set_bits *fds)
max++; max++;
set >>= 1; set >>= 1;
} while (set); } while (set);
max += n * __NFDBITS; max += n * BITS_PER_LONG;
} }
return max; return max;
...@@ -435,11 +435,11 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time) ...@@ -435,11 +435,11 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)
in = *inp++; out = *outp++; ex = *exp++; in = *inp++; out = *outp++; ex = *exp++;
all_bits = in | out | ex; all_bits = in | out | ex;
if (all_bits == 0) { if (all_bits == 0) {
i += __NFDBITS; i += BITS_PER_LONG;
continue; continue;
} }
for (j = 0; j < __NFDBITS; ++j, ++i, bit <<= 1) { for (j = 0; j < BITS_PER_LONG; ++j, ++i, bit <<= 1) {
int fput_needed; int fput_needed;
if (i >= n) if (i >= n)
break; break;
......
...@@ -15,26 +15,14 @@ ...@@ -15,26 +15,14 @@
*/ */
/* /*
* Those macros may have been defined in <gnu/types.h>. But we always * This macro may have been defined in <gnu/types.h>. But we always
* use the ones here. * use the one here.
*/ */
#undef __NFDBITS
#define __NFDBITS (8 * sizeof(unsigned long))
#undef __FD_SETSIZE #undef __FD_SETSIZE
#define __FD_SETSIZE 1024 #define __FD_SETSIZE 1024
#undef __FDSET_LONGS
#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)
#undef __FDELT
#define __FDELT(d) ((d) / __NFDBITS)
#undef __FDMASK
#define __FDMASK(d) (1UL << ((d) % __NFDBITS))
typedef struct { typedef struct {
unsigned long fds_bits [__FDSET_LONGS]; unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
} __kernel_fd_set; } __kernel_fd_set;
/* Type of a signal handler. */ /* Type of a signal handler. */
......
...@@ -257,14 +257,6 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) ...@@ -257,14 +257,6 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#define NFDBITS __NFDBITS
#define FD_SETSIZE __FD_SETSIZE
#define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp)
#define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp)
#define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp)
#define FD_ZERO(fdsetp) __FD_ZERO(fdsetp)
/* /*
* Names of the interval timers, and structure * Names of the interval timers, and structure
* defining a timer setting: * defining a timer setting:
......
...@@ -483,7 +483,7 @@ static void close_files(struct files_struct * files) ...@@ -483,7 +483,7 @@ static void close_files(struct files_struct * files)
rcu_read_unlock(); rcu_read_unlock();
for (;;) { for (;;) {
unsigned long set; unsigned long set;
i = j * __NFDBITS; i = j * BITS_PER_LONG;
if (i >= fdt->max_fds) if (i >= fdt->max_fds)
break; break;
set = fdt->open_fds[j++]; set = fdt->open_fds[j++];
......
...@@ -2129,7 +2129,7 @@ static inline void flush_unauthorized_files(const struct cred *cred, ...@@ -2129,7 +2129,7 @@ static inline void flush_unauthorized_files(const struct cred *cred,
int fd; int fd;
j++; j++;
i = j * __NFDBITS; i = j * BITS_PER_LONG;
fdt = files_fdtable(files); fdt = files_fdtable(files);
if (i >= fdt->max_fds) if (i >= fdt->max_fds)
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment