diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-08-01 00:12:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-08-01 00:12:07 -0400 |
commit | 8d4fbcfbe0a4bfc73e7f0297c59ae514e1f1436f (patch) | |
tree | f4fe8e2028620b8aeb298c78ee5dc9d6df07e708 | |
parent | 2f63251ed0a803ddbe7bf2577b69d467aa872f68 (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.h | 6 | ||||
-rw-r--r-- | include/asm-powerpc/bug.h | 2 |
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(); \ |