]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 5 Aug 2012 16:48:48 +0000 (09:48 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 5 Aug 2012 16:48:48 +0000 (09:48 -0700)
added patches:
posix_types.h-cleanup-stale-__nfdbits-and-related.patch

queue-3.4/posix_types.h-cleanup-stale-__nfdbits-and-related.patch [new file with mode: 0644]
queue-3.4/series

diff --git a/queue-3.4/posix_types.h-cleanup-stale-__nfdbits-and-related.patch b/queue-3.4/posix_types.h-cleanup-stale-__nfdbits-and-related.patch
new file mode 100644 (file)
index 0000000..a56a1e2
--- /dev/null
@@ -0,0 +1,174 @@
+From 8ded2bbc1845e19c771eb55209aab166ef011243 Mon Sep 17 00:00:00 2001
+From: Josh Boyer <jwboyer@redhat.com>
+Date: Wed, 25 Jul 2012 10:40:34 -0400
+Subject: posix_types.h: Cleanup stale __NFDBITS and related
+ definitions
+
+From: Josh Boyer <jwboyer@redhat.com>
+
+commit 8ded2bbc1845e19c771eb55209aab166ef011243 upstream.
+
+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 8b3d1cda4f5f
+("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: Jeff Law <law@redhat.com>
+Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Josh Boyer <jwboyer@redhat.com>
+[ .. and fix up whitespace as per akpm ]
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/mips/kernel/kspd.c     |    2 +-
+ fs/exec.c                   |    2 +-
+ fs/select.c                 |   10 +++++-----
+ include/linux/posix_types.h |   18 +++---------------
+ include/linux/time.h        |    8 --------
+ kernel/exit.c               |    2 +-
+ security/selinux/hooks.c    |    2 +-
+ 7 files changed, 12 insertions(+), 32 deletions(-)
+
+--- a/arch/mips/kernel/kspd.c
++++ b/arch/mips/kernel/kspd.c
+@@ -323,7 +323,7 @@ static void sp_cleanup(void)
+       fdt = files_fdtable(files);
+       for (;;) {
+               unsigned long set;
+-              i = j * __NFDBITS;
++              i = j * BITS_PER_LONG;
+               if (i >= fdt->max_fds)
+                       break;
+               set = fdt->open_fds[j++];
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1024,7 +1024,7 @@ static void flush_old_files(struct files
+               unsigned long set, i;
+               j++;
+-              i = j * __NFDBITS;
++              i = j * BITS_PER_LONG;
+               fdt = files_fdtable(files);
+               if (i >= fdt->max_fds)
+                       break;
+--- a/fs/select.c
++++ b/fs/select.c
+@@ -345,8 +345,8 @@ static int max_select_fd(unsigned long n
+       struct fdtable *fdt;
+       /* handle last in-complete long-word first */
+-      set = ~(~0UL << (n & (__NFDBITS-1)));
+-      n /= __NFDBITS;
++      set = ~(~0UL << (n & (BITS_PER_LONG-1)));
++      n /= BITS_PER_LONG;
+       fdt = files_fdtable(current->files);
+       open_fds = fdt->open_fds + n;
+       max = 0;
+@@ -373,7 +373,7 @@ get_max:
+                       max++;
+                       set >>= 1;
+               } while (set);
+-              max += n * __NFDBITS;
++              max += n * BITS_PER_LONG;
+       }
+       return max;
+@@ -435,11 +435,11 @@ int do_select(int n, fd_set_bits *fds, s
+                       in = *inp++; out = *outp++; ex = *exp++;
+                       all_bits = in | out | ex;
+                       if (all_bits == 0) {
+-                              i += __NFDBITS;
++                              i += BITS_PER_LONG;
+                               continue;
+                       }
+-                      for (j = 0; j < __NFDBITS; ++j, ++i, bit <<= 1) {
++                      for (j = 0; j < BITS_PER_LONG; ++j, ++i, bit <<= 1) {
+                               int fput_needed;
+                               if (i >= n)
+                                       break;
+--- a/include/linux/posix_types.h
++++ b/include/linux/posix_types.h
+@@ -15,26 +15,14 @@
+  */
+ /*
+- * Those macros may have been defined in <gnu/types.h>. But we always
+- * use the ones here. 
++ * This macro may have been defined in <gnu/types.h>. But we always
++ * use the one here.
+  */
+-#undef __NFDBITS
+-#define __NFDBITS     (8 * sizeof(unsigned long))
+-
+ #undef __FD_SETSIZE
+ #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 {
+-      unsigned long fds_bits [__FDSET_LONGS];
++      unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
+ } __kernel_fd_set;
+ /* Type of a signal handler.  */
+--- a/include/linux/time.h
++++ b/include/linux/time.h
+@@ -258,14 +258,6 @@ static __always_inline void timespec_add
+ #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
+  * defining a timer setting:
+--- a/kernel/exit.c
++++ b/kernel/exit.c
+@@ -471,7 +471,7 @@ static void close_files(struct files_str
+       rcu_read_unlock();
+       for (;;) {
+               unsigned long set;
+-              i = j * __NFDBITS;
++              i = j * BITS_PER_LONG;
+               if (i >= fdt->max_fds)
+                       break;
+               set = fdt->open_fds[j++];
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -2162,7 +2162,7 @@ static inline void flush_unauthorized_fi
+               int fd;
+               j++;
+-              i = j * __NFDBITS;
++              i = j * BITS_PER_LONG;
+               fdt = files_fdtable(files);
+               if (i >= fdt->max_fds)
+                       break;
index f86610b11e41ed7e36171b8401da068b913eafe9..2e21d8877c7e71a9bfc0ee5e527390204b4e1aaa 100644 (file)
@@ -61,3 +61,4 @@ drm-radeon-fix-non-revealent-error-message.patch
 drm-radeon-fix-hotplug-of-dp-to-dvi-hdmi-passive-adapters-v2.patch
 drm-radeon-on-hotplug-force-link-training-to-happen-v2.patch
 drm-radeon-fix-dpms-on-off-on-trinity-aruba-v2.patch
+posix_types.h-cleanup-stale-__nfdbits-and-related.patch