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
 |