You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'akpm' (patches from Andrew)
Merge more updates from Andrew Morton: - the rest of MM - KASAN updates - procfs updates - exit, fork updates - printk updates - lib/ updates - radix-tree testsuite updates - checkpatch updates - kprobes updates - a few other misc bits * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (162 commits) samples/kprobes: print out the symbol name for the hooks samples/kprobes: add a new module parameter kprobes: add the "tls" argument for j_do_fork init/main.c: simplify initcall_blacklisted() fs/efs/super.c: fix return value checkpatch: improve --git <commit-count> shortcut checkpatch: reduce number of `git log` calls with --git checkpatch: add support to check already applied git commits checkpatch: add --list-types to show message types to show or ignore checkpatch: advertise the --fix and --fix-inplace options more checkpatch: whine about ACCESS_ONCE checkpatch: add test for keywords not starting on tabstops checkpatch: improve CONSTANT_COMPARISON test for structure members checkpatch: add PREFER_IS_ENABLED test lib/GCD.c: use binary GCD algorithm instead of Euclidean radix-tree: free up the bottom bit of exceptional entries for reuse dax: move RADIX_DAX_ definitions to dax.c radix-tree: make radix_tree_descend() more useful radix-tree: introduce radix_tree_replace_clear_tags() radix-tree: tidy up __radix_tree_create() ...
This commit is contained in:
+139
-3
@@ -27,12 +27,15 @@ my $emacs = 0;
|
||||
my $terse = 0;
|
||||
my $showfile = 0;
|
||||
my $file = 0;
|
||||
my $git = 0;
|
||||
my %git_commits = ();
|
||||
my $check = 0;
|
||||
my $check_orig = 0;
|
||||
my $summary = 1;
|
||||
my $mailback = 0;
|
||||
my $summary_file = 0;
|
||||
my $show_types = 0;
|
||||
my $list_types = 0;
|
||||
my $fix = 0;
|
||||
my $fix_inplace = 0;
|
||||
my $root;
|
||||
@@ -68,13 +71,24 @@ Options:
|
||||
--emacs emacs compile window format
|
||||
--terse one line per report
|
||||
--showfile emit diffed file position, not input file position
|
||||
-g, --git treat FILE as a single commit or git revision range
|
||||
single git commit with:
|
||||
<rev>
|
||||
<rev>^
|
||||
<rev>~n
|
||||
multiple git commits with:
|
||||
<rev1>..<rev2>
|
||||
<rev1>...<rev2>
|
||||
<rev>-<count>
|
||||
git merges are ignored
|
||||
-f, --file treat FILE as regular source file
|
||||
--subjective, --strict enable more subjective tests
|
||||
--list-types list the possible message types
|
||||
--types TYPE(,TYPE2...) show only these comma separated message types
|
||||
--ignore TYPE(,TYPE2...) ignore various comma separated message types
|
||||
--show-types show the specific message type in the output
|
||||
--max-line-length=n set the maximum line length, if exceeded, warn
|
||||
--min-conf-desc-length=n set the min description length, if shorter, warn
|
||||
--show-types show the message "types" in the output
|
||||
--root=PATH PATH to the kernel tree root
|
||||
--no-summary suppress the per-file summary
|
||||
--mailback only produce a report in case of warnings/errors
|
||||
@@ -106,6 +120,37 @@ EOM
|
||||
exit($exitcode);
|
||||
}
|
||||
|
||||
sub uniq {
|
||||
my %seen;
|
||||
return grep { !$seen{$_}++ } @_;
|
||||
}
|
||||
|
||||
sub list_types {
|
||||
my ($exitcode) = @_;
|
||||
|
||||
my $count = 0;
|
||||
|
||||
local $/ = undef;
|
||||
|
||||
open(my $script, '<', abs_path($P)) or
|
||||
die "$P: Can't read '$P' $!\n";
|
||||
|
||||
my $text = <$script>;
|
||||
close($script);
|
||||
|
||||
my @types = ();
|
||||
for ($text =~ /\b(?:(?:CHK|WARN|ERROR)\s*\(\s*"([^"]+)")/g) {
|
||||
push (@types, $_);
|
||||
}
|
||||
@types = sort(uniq(@types));
|
||||
print("#\tMessage type\n\n");
|
||||
foreach my $type (@types) {
|
||||
print(++$count . "\t" . $type . "\n");
|
||||
}
|
||||
|
||||
exit($exitcode);
|
||||
}
|
||||
|
||||
my $conf = which_conf($configuration_file);
|
||||
if (-f $conf) {
|
||||
my @conf_args;
|
||||
@@ -141,11 +186,13 @@ GetOptions(
|
||||
'terse!' => \$terse,
|
||||
'showfile!' => \$showfile,
|
||||
'f|file!' => \$file,
|
||||
'g|git!' => \$git,
|
||||
'subjective!' => \$check,
|
||||
'strict!' => \$check,
|
||||
'ignore=s' => \@ignore,
|
||||
'types=s' => \@use,
|
||||
'show-types!' => \$show_types,
|
||||
'list-types!' => \$list_types,
|
||||
'max-line-length=i' => \$max_line_length,
|
||||
'min-conf-desc-length=i' => \$min_conf_desc_length,
|
||||
'root=s' => \$root,
|
||||
@@ -166,6 +213,8 @@ GetOptions(
|
||||
|
||||
help(0) if ($help);
|
||||
|
||||
list_types(0) if ($list_types);
|
||||
|
||||
$fix = 1 if ($fix_inplace);
|
||||
$check_orig = $check;
|
||||
|
||||
@@ -752,10 +801,42 @@ my @fixed_inserted = ();
|
||||
my @fixed_deleted = ();
|
||||
my $fixlinenr = -1;
|
||||
|
||||
# If input is git commits, extract all commits from the commit expressions.
|
||||
# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
|
||||
die "$P: No git repository found\n" if ($git && !-e ".git");
|
||||
|
||||
if ($git) {
|
||||
my @commits = ();
|
||||
foreach my $commit_expr (@ARGV) {
|
||||
my $git_range;
|
||||
if ($commit_expr =~ m/^(.*)-(\d+)$/) {
|
||||
$git_range = "-$2 $1";
|
||||
} elsif ($commit_expr =~ m/\.\./) {
|
||||
$git_range = "$commit_expr";
|
||||
} else {
|
||||
$git_range = "-1 $commit_expr";
|
||||
}
|
||||
my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
|
||||
foreach my $line (split(/\n/, $lines)) {
|
||||
$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
|
||||
next if (!defined($1) || !defined($2));
|
||||
my $sha1 = $1;
|
||||
my $subject = $2;
|
||||
unshift(@commits, $sha1);
|
||||
$git_commits{$sha1} = $subject;
|
||||
}
|
||||
}
|
||||
die "$P: no git commits after extraction!\n" if (@commits == 0);
|
||||
@ARGV = @commits;
|
||||
}
|
||||
|
||||
my $vname;
|
||||
for my $filename (@ARGV) {
|
||||
my $FILE;
|
||||
if ($file) {
|
||||
if ($git) {
|
||||
open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
|
||||
die "$P: $filename: git format-patch failed - $!\n";
|
||||
} elsif ($file) {
|
||||
open($FILE, '-|', "diff -u /dev/null $filename") ||
|
||||
die "$P: $filename: diff failed - $!\n";
|
||||
} elsif ($filename eq '-') {
|
||||
@@ -766,6 +847,8 @@ for my $filename (@ARGV) {
|
||||
}
|
||||
if ($filename eq '-') {
|
||||
$vname = 'Your patch';
|
||||
} elsif ($git) {
|
||||
$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
|
||||
} else {
|
||||
$vname = $filename;
|
||||
}
|
||||
@@ -2755,6 +2838,19 @@ sub process {
|
||||
"Logical continuations should be on the previous line\n" . $hereprev);
|
||||
}
|
||||
|
||||
# check indentation starts on a tab stop
|
||||
if ($^V && $^V ge 5.10.0 &&
|
||||
$sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$))/) {
|
||||
my $indent = length($1);
|
||||
if ($indent % 8) {
|
||||
if (WARN("TABSTOP",
|
||||
"Statements should start on a tabstop\n" . $herecurr) &&
|
||||
$fix) {
|
||||
$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# check multi-line statement indentation matches previous line
|
||||
if ($^V && $^V ge 5.10.0 &&
|
||||
$prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
|
||||
@@ -4291,7 +4387,7 @@ sub process {
|
||||
my $comp = $3;
|
||||
my $to = $4;
|
||||
my $newcomp = $comp;
|
||||
if ($lead !~ /$Operators\s*$/ &&
|
||||
if ($lead !~ /(?:$Operators|\.)\s*$/ &&
|
||||
$to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
|
||||
WARN("CONSTANT_COMPARISON",
|
||||
"Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
|
||||
@@ -5637,6 +5733,16 @@ sub process {
|
||||
}
|
||||
}
|
||||
|
||||
# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
|
||||
if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
|
||||
my $config = $1;
|
||||
if (WARN("PREFER_IS_ENABLED",
|
||||
"Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
|
||||
$fix) {
|
||||
$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
|
||||
}
|
||||
}
|
||||
|
||||
# check for case / default statements not preceded by break/fallthrough/switch
|
||||
if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
|
||||
my $has_break = 0;
|
||||
@@ -5827,6 +5933,28 @@ sub process {
|
||||
}
|
||||
}
|
||||
|
||||
# whine about ACCESS_ONCE
|
||||
if ($^V && $^V ge 5.10.0 &&
|
||||
$line =~ /\bACCESS_ONCE\s*$balanced_parens\s*(=(?!=))?\s*($FuncArg)?/) {
|
||||
my $par = $1;
|
||||
my $eq = $2;
|
||||
my $fun = $3;
|
||||
$par =~ s/^\(\s*(.*)\s*\)$/$1/;
|
||||
if (defined($eq)) {
|
||||
if (WARN("PREFER_WRITE_ONCE",
|
||||
"Prefer WRITE_ONCE(<FOO>, <BAR>) over ACCESS_ONCE(<FOO>) = <BAR>\n" . $herecurr) &&
|
||||
$fix) {
|
||||
$fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)\s*$eq\s*\Q$fun\E/WRITE_ONCE($par, $fun)/;
|
||||
}
|
||||
} else {
|
||||
if (WARN("PREFER_READ_ONCE",
|
||||
"Prefer READ_ONCE(<FOO>) over ACCESS_ONCE(<FOO>)\n" . $herecurr) &&
|
||||
$fix) {
|
||||
$fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)/READ_ONCE($par)/;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# check for lockdep_set_novalidate_class
|
||||
if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
|
||||
$line =~ /__lockdep_no_validate__\s*\)/ ) {
|
||||
@@ -5930,6 +6058,14 @@ sub process {
|
||||
}
|
||||
|
||||
if ($quiet == 0) {
|
||||
# If there were any defects found and not already fixing them
|
||||
if (!$clean and !$fix) {
|
||||
print << "EOM"
|
||||
|
||||
NOTE: For some of the reported defects, checkpatch may be able to
|
||||
mechanically convert to the typical style using --fix or --fix-inplace.
|
||||
EOM
|
||||
}
|
||||
# If there were whitespace errors which cleanpatch can fix
|
||||
# then suggest that.
|
||||
if ($rpt_cleaners) {
|
||||
|
||||
Reference in New Issue
Block a user