 8d4fbcfbe0
			
		
	
	
	8d4fbcfbe0
	
	
	
		
			
			Alexey Dobriyan noticed that the new WARN_ON() semantics that were
introduced by commit 684f978347 (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>
		
	
			
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ASM_GENERIC_BUG_H
 | |
| #define _ASM_GENERIC_BUG_H
 | |
| 
 | |
| #include <linux/compiler.h>
 | |
| 
 | |
| #ifdef CONFIG_BUG
 | |
| 
 | |
| #ifdef CONFIG_GENERIC_BUG
 | |
| #ifndef __ASSEMBLY__
 | |
| struct bug_entry {
 | |
| 	unsigned long	bug_addr;
 | |
| #ifdef CONFIG_DEBUG_BUGVERBOSE
 | |
| 	const char	*file;
 | |
| 	unsigned short	line;
 | |
| #endif
 | |
| 	unsigned short	flags;
 | |
| };
 | |
| #endif		/* __ASSEMBLY__ */
 | |
| 
 | |
| #define BUGFLAG_WARNING	(1<<0)
 | |
| #endif	/* CONFIG_GENERIC_BUG */
 | |
| 
 | |
| #ifndef HAVE_ARCH_BUG
 | |
| #define BUG() do { \
 | |
| 	printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __FUNCTION__); \
 | |
| 	panic("BUG!"); \
 | |
| } while (0)
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_ARCH_BUG_ON
 | |
| #define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while(0)
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_ARCH_WARN_ON
 | |
| #define WARN_ON(condition) ({						\
 | |
| 	int __ret_warn_on = !!(condition);				\
 | |
| 	if (unlikely(__ret_warn_on)) {					\
 | |
| 		printk("WARNING: at %s:%d %s()\n", __FILE__,		\
 | |
| 			__LINE__, __FUNCTION__);			\
 | |
| 		dump_stack();						\
 | |
| 	}								\
 | |
| 	unlikely(__ret_warn_on);					\
 | |
| })
 | |
| #endif
 | |
| 
 | |
| #else /* !CONFIG_BUG */
 | |
| #ifndef HAVE_ARCH_BUG
 | |
| #define BUG()
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_ARCH_BUG_ON
 | |
| #define BUG_ON(condition) do { if (condition) ; } while(0)
 | |
| #endif
 | |
| 
 | |
| #ifndef HAVE_ARCH_WARN_ON
 | |
| #define WARN_ON(condition) ({						\
 | |
| 	int __ret_warn_on = !!(condition);				\
 | |
| 	unlikely(__ret_warn_on);					\
 | |
| })
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #define WARN_ON_ONCE(condition)	({				\
 | |
| 	static int __warned;					\
 | |
| 	int __ret_warn_once = !!(condition);			\
 | |
| 								\
 | |
| 	if (unlikely(__ret_warn_once))				\
 | |
| 		if (WARN_ON(!__warned)) 			\
 | |
| 			__warned = 1;				\
 | |
| 	unlikely(__ret_warn_once);				\
 | |
| })
 | |
| 
 | |
| #ifdef CONFIG_SMP
 | |
| # define WARN_ON_SMP(x)			WARN_ON(x)
 | |
| #else
 | |
| # define WARN_ON_SMP(x)			do { } while (0)
 | |
| #endif
 | |
| 
 | |
| #endif
 |