diff options
Diffstat (limited to 'lib/bug.c')
| -rw-r--r-- | lib/bug.c | 54 | 
1 files changed, 29 insertions, 25 deletions
diff --git a/lib/bug.c b/lib/bug.c index 8f9d537bfb2a..45a0584f6541 100644 --- a/lib/bug.c +++ b/lib/bug.c @@ -127,6 +127,22 @@ static inline struct bug_entry *module_find_bug(unsigned long bugaddr)  }  #endif +void bug_get_file_line(struct bug_entry *bug, const char **file, +		       unsigned int *line) +{ +#ifdef CONFIG_DEBUG_BUGVERBOSE +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS +	*file = bug->file; +#else +	*file = (const char *)bug + bug->file_disp; +#endif +	*line = bug->line; +#else +	*file = NULL; +	*line = 0; +#endif +} +  struct bug_entry *find_bug(unsigned long bugaddr)  {  	struct bug_entry *bug; @@ -153,32 +169,20 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)  	disable_trace_on_warning(); -	file = NULL; -	line = 0; -	warning = 0; +	bug_get_file_line(bug, &file, &line); -	if (bug) { -#ifdef CONFIG_DEBUG_BUGVERBOSE -#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS -		file = bug->file; -#else -		file = (const char *)bug + bug->file_disp; -#endif -		line = bug->line; -#endif -		warning = (bug->flags & BUGFLAG_WARNING) != 0; -		once = (bug->flags & BUGFLAG_ONCE) != 0; -		done = (bug->flags & BUGFLAG_DONE) != 0; - -		if (warning && once) { -			if (done) -				return BUG_TRAP_TYPE_WARN; - -			/* -			 * Since this is the only store, concurrency is not an issue. -			 */ -			bug->flags |= BUGFLAG_DONE; -		} +	warning = (bug->flags & BUGFLAG_WARNING) != 0; +	once = (bug->flags & BUGFLAG_ONCE) != 0; +	done = (bug->flags & BUGFLAG_DONE) != 0; + +	if (warning && once) { +		if (done) +			return BUG_TRAP_TYPE_WARN; + +		/* +		 * Since this is the only store, concurrency is not an issue. +		 */ +		bug->flags |= BUGFLAG_DONE;  	}  	/*  | 
