aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-01 00:12:07 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-01 00:12:07 -0400
commit8d4fbcfbe0a4bfc73e7f0297c59ae514e1f1436f (patch)
treef4fe8e2028620b8aeb298c78ee5dc9d6df07e708
parent2f63251ed0a803ddbe7bf2577b69d467aa872f68 (diff)
Fix WARN_ON() on bitfield ops
Alexey Dobriyan noticed that the new WARN_ON() semantics that were introduced by commit 684f978347deb42d180373ac4c427f82ef963171 (to also return the value to be warned on) didn't compile when given a bitfield, because the typeof doesn't work for bitfields. So instead of the typeof trick, use an "int" variable together with a "!!(x)" expression, as suggested by Al Viro. To make matters more interesting, Paul Mackerras points out that that is sub-optimal on Power, but the old asm-coded comparison seems to be buggy anyway on 32-bit Power if the conditional was 64-bit, so I think there are more problems there. Regardless, the new WARN_ON() semantics may have been a bad idea. But this at least avoids the more serious complications. Cc: Alexey Dobriyan <adobriyan@sw.ru> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Paul Mackerras <paulus@samba.org> Cc: Al Viro <viro@ftp.linux.org.uk> Cc: Ingo Molnar <mingo@elte.hu> Cc: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/asm-generic/bug.h6
-rw-r--r--include/asm-powerpc/bug.h2
2 files changed, 4 insertions, 4 deletions
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h
index 344e3091af24..d56fedbb457a 100644
--- a/include/asm-generic/bug.h
+++ b/include/asm-generic/bug.h
@@ -33,7 +33,7 @@ struct bug_entry {
33 33
34#ifndef HAVE_ARCH_WARN_ON 34#ifndef HAVE_ARCH_WARN_ON
35#define WARN_ON(condition) ({ \ 35#define WARN_ON(condition) ({ \
36 typeof(condition) __ret_warn_on = (condition); \ 36 int __ret_warn_on = !!(condition); \
37 if (unlikely(__ret_warn_on)) { \ 37 if (unlikely(__ret_warn_on)) { \
38 printk("WARNING: at %s:%d %s()\n", __FILE__, \ 38 printk("WARNING: at %s:%d %s()\n", __FILE__, \
39 __LINE__, __FUNCTION__); \ 39 __LINE__, __FUNCTION__); \
@@ -54,7 +54,7 @@ struct bug_entry {
54 54
55#ifndef HAVE_ARCH_WARN_ON 55#ifndef HAVE_ARCH_WARN_ON
56#define WARN_ON(condition) ({ \ 56#define WARN_ON(condition) ({ \
57 typeof(condition) __ret_warn_on = (condition); \ 57 int __ret_warn_on = !!(condition); \
58 unlikely(__ret_warn_on); \ 58 unlikely(__ret_warn_on); \
59}) 59})
60#endif 60#endif
@@ -62,7 +62,7 @@ struct bug_entry {
62 62
63#define WARN_ON_ONCE(condition) ({ \ 63#define WARN_ON_ONCE(condition) ({ \
64 static int __warned; \ 64 static int __warned; \
65 typeof(condition) __ret_warn_once = (condition); \ 65 int __ret_warn_once = !!(condition); \
66 \ 66 \
67 if (unlikely(__ret_warn_once)) \ 67 if (unlikely(__ret_warn_once)) \
68 if (WARN_ON(!__warned)) \ 68 if (WARN_ON(!__warned)) \
diff --git a/include/asm-powerpc/bug.h b/include/asm-powerpc/bug.h
index a248b8bd4d7c..e55d1f66b86f 100644
--- a/include/asm-powerpc/bug.h
+++ b/include/asm-powerpc/bug.h
@@ -93,7 +93,7 @@
93} while (0) 93} while (0)
94 94
95#define WARN_ON(x) ({ \ 95#define WARN_ON(x) ({ \
96 typeof(x) __ret_warn_on = (x); \ 96 int __ret_warn_on = !!(x); \
97 if (__builtin_constant_p(__ret_warn_on)) { \ 97 if (__builtin_constant_p(__ret_warn_on)) { \
98 if (__ret_warn_on) \ 98 if (__ret_warn_on) \
99 __WARN(); \ 99 __WARN(); \