diff options
author | Andy Whitcroft <apw@canonical.com> | 2009-10-26 19:50:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-29 10:39:31 -0400 |
commit | 2b474a1a566064b40bc7d9a45021ffbc4c894fa3 (patch) | |
tree | 9f65e5456a95272db6ec887eff472114bfcc5d31 /scripts/checkpatch.pl | |
parent | 99423c2065b62fee41cdbd8da7e63bf1f8f9e9b0 (diff) |
checkpatch: fix false EXPORT_SYMBOL warning
Ingo reported that the following lines triggered a false warning,
static struct lock_class_key rcu_lock_key;
struct lockdep_map rcu_lock_map =
STATIC_LOCKDEP_MAP_INIT("rcu_read_lock", &rcu_lock_key);
EXPORT_SYMBOL_GPL(rcu_lock_map);
from kernel/rcutree.c , and the false warning looked like this,
WARNING: EXPORT_SYMBOL(foo); should immediately follow its
function/variable
+EXPORT_SYMBOL_GPL(rcu_lock_map);
We actually should be checking the statement before the EXPORT_* for a
mention of the exported object, and complain where it is not there.
[akpm@linux-foundation.org: coding-style fixes]
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reported-by: Daniel Walker <dwalker@fifo99.com>
Signed-off-by: Andy Whitcroft <apw@canonical.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/checkpatch.pl')
-rwxr-xr-x | scripts/checkpatch.pl | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index ba105a848396..88c4f6a5080b 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -1145,6 +1145,7 @@ sub process { | |||
1145 | # suppression flags | 1145 | # suppression flags |
1146 | my %suppress_ifbraces; | 1146 | my %suppress_ifbraces; |
1147 | my %suppress_whiletrailers; | 1147 | my %suppress_whiletrailers; |
1148 | my %suppress_export; | ||
1148 | 1149 | ||
1149 | # Pre-scan the patch sanitizing the lines. | 1150 | # Pre-scan the patch sanitizing the lines. |
1150 | # Pre-scan the patch looking for any __setup documentation. | 1151 | # Pre-scan the patch looking for any __setup documentation. |
@@ -1253,6 +1254,7 @@ sub process { | |||
1253 | 1254 | ||
1254 | %suppress_ifbraces = (); | 1255 | %suppress_ifbraces = (); |
1255 | %suppress_whiletrailers = (); | 1256 | %suppress_whiletrailers = (); |
1257 | %suppress_export = (); | ||
1256 | next; | 1258 | next; |
1257 | 1259 | ||
1258 | # track the line number as we move through the hunk, note that | 1260 | # track the line number as we move through the hunk, note that |
@@ -1428,13 +1430,22 @@ sub process { | |||
1428 | } | 1430 | } |
1429 | 1431 | ||
1430 | # Check for potential 'bare' types | 1432 | # Check for potential 'bare' types |
1431 | my ($stat, $cond, $line_nr_next, $remain_next, $off_next); | 1433 | my ($stat, $cond, $line_nr_next, $remain_next, $off_next, |
1434 | $realline_next); | ||
1432 | if ($realcnt && $line =~ /.\s*\S/) { | 1435 | if ($realcnt && $line =~ /.\s*\S/) { |
1433 | ($stat, $cond, $line_nr_next, $remain_next, $off_next) = | 1436 | ($stat, $cond, $line_nr_next, $remain_next, $off_next) = |
1434 | ctx_statement_block($linenr, $realcnt, 0); | 1437 | ctx_statement_block($linenr, $realcnt, 0); |
1435 | $stat =~ s/\n./\n /g; | 1438 | $stat =~ s/\n./\n /g; |
1436 | $cond =~ s/\n./\n /g; | 1439 | $cond =~ s/\n./\n /g; |
1437 | 1440 | ||
1441 | # Find the real next line. | ||
1442 | $realline_next = $line_nr_next; | ||
1443 | if (defined $realline_next && | ||
1444 | (!defined $lines[$realline_next - 1] || | ||
1445 | substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { | ||
1446 | $realline_next++; | ||
1447 | } | ||
1448 | |||
1438 | my $s = $stat; | 1449 | my $s = $stat; |
1439 | $s =~ s/{.*$//s; | 1450 | $s =~ s/{.*$//s; |
1440 | 1451 | ||
@@ -1695,21 +1706,40 @@ sub process { | |||
1695 | $line =~ s@//.*@@; | 1706 | $line =~ s@//.*@@; |
1696 | $opline =~ s@//.*@@; | 1707 | $opline =~ s@//.*@@; |
1697 | 1708 | ||
1698 | #EXPORT_SYMBOL should immediately follow its function closing }. | 1709 | # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider |
1699 | if (($line =~ /EXPORT_SYMBOL.*\((.*)\)/) || | 1710 | # the whole statement. |
1700 | ($line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { | 1711 | #print "APW <$lines[$realline_next - 1]>\n"; |
1712 | if (defined $realline_next && | ||
1713 | exists $lines[$realline_next - 1] && | ||
1714 | !defined $suppress_export{$realline_next} && | ||
1715 | ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || | ||
1716 | $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { | ||
1701 | my $name = $1; | 1717 | my $name = $1; |
1702 | if ($prevline !~ /(?: | 1718 | if ($stat !~ /(?: |
1703 | ^.}| | 1719 | \n.}\s*$| |
1704 | ^.DEFINE_$Ident\(\Q$name\E\)| | 1720 | ^.DEFINE_$Ident\(\Q$name\E\)| |
1705 | ^.DECLARE_$Ident\(\Q$name\E\)| | 1721 | ^.DECLARE_$Ident\(\Q$name\E\)| |
1706 | ^.LIST_HEAD\(\Q$name\E\)| | 1722 | ^.LIST_HEAD\(\Q$name\E\)| |
1707 | ^.$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| | 1723 | ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| |
1708 | \b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=|\[) | 1724 | \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() |
1709 | )/x) { | 1725 | )/x) { |
1710 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); | 1726 | #print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; |
1727 | $suppress_export{$realline_next} = 2; | ||
1728 | } else { | ||
1729 | $suppress_export{$realline_next} = 1; | ||
1711 | } | 1730 | } |
1712 | } | 1731 | } |
1732 | if (!defined $suppress_export{$linenr} && | ||
1733 | $prevline =~ /^.\s*$/ && | ||
1734 | ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || | ||
1735 | $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { | ||
1736 | #print "FOO B <$lines[$linenr - 1]>\n"; | ||
1737 | $suppress_export{$linenr} = 2; | ||
1738 | } | ||
1739 | if (defined $suppress_export{$linenr} && | ||
1740 | $suppress_export{$linenr} == 2) { | ||
1741 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); | ||
1742 | } | ||
1713 | 1743 | ||
1714 | # check for external initialisers. | 1744 | # check for external initialisers. |
1715 | if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) { | 1745 | if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) { |