-my %dep_functions = (
- 'alloca', 'malloc',
- 'CFS_ATOMIC_INIT', 'ATOMIC_INIT',
- 'cfs_atomic_add', 'atomic_add',
- 'cfs_atomic_add_return', 'atomic_add_return',
- 'cfs_atomic_add_unless', 'atomic_add_unless',
- 'cfs_atomic_cmpxchg', 'atomic_cmpxchg',
- 'cfs_atomic_dec', 'atomic_dec',
- 'cfs_atomic_dec_and_lock', 'atomic_dec_and_lock',
- 'cfs_atomic_dec_and_test', 'atomic_dec_and_test',
- 'cfs_atomic_dec_return', 'atomic_dec_return',
- 'cfs_atomic_inc', 'atomic_inc',
- 'cfs_atomic_inc_and_test', 'atomic_inc_and_test',
- 'cfs_atomic_inc_not_zero', 'atomic_inc_not_zero',
- 'cfs_atomic_inc_return', 'atomic_inc_return',
- 'cfs_atomic_read', 'atomic_read',
- 'cfs_atomic_set', 'atomic_set',
- 'cfs_atomic_sub', 'atomic_sub',
- 'cfs_atomic_sub_and_test', 'atomic_sub_and_test',
- 'cfs_atomic_sub_return', 'atomic_sub_return',
- 'cfs_atomic_t', 'atomic_t',
-
- 'CFS_HLIST_HEAD', 'HLIST_HEAD',
- 'CFS_HLIST_HEAD_INIT', 'HLIST_HEAD_INIT',
- 'CFS_INIT_HLIST_HEAD', 'INIT_HLIST_HEAD',
- 'CFS_INIT_HLIST_NODE', 'INIT_HLIST_NODE',
- 'cfs_hlist_add_after', 'hlist_add_after',
- 'cfs_hlist_add_before', 'hlist_add_before',
- 'cfs_hlist_add_head', 'hlist_add_head',
- 'cfs_hlist_del', 'hlist_del',
- 'cfs_hlist_del_init', 'hlist_del_init',
- 'cfs_hlist_empty', 'hlist_empty',
- 'cfs_hlist_entry', 'hlist_entry',
- 'cfs_hlist_for_each', 'hlist_for_each',
- 'cfs_hlist_for_each_safe', 'hlist_for_each_safe',
- 'cfs_hlist_head_t', 'struct hlist_head',
- 'cfs_hlist_node_t', 'struct hlist_node',
- 'cfs_hlist_unhashed', 'hlist_unhashed',
-
- 'cfs_inode_t', 'struct inode',
-
- 'CFS_INIT_LIST_HEAD', 'INIT_LIST_HEAD',
- 'CFS_LIST_HEAD', 'struct list_head foo = LIST_HEAD_INIT(foo);',
- 'CFS_LIST_HEAD_INIT', 'LIST_HEAD_INIT',
- 'cfs_list_add', 'list_add',
- 'cfs_list_add_tail', 'list_add_tail',
- 'cfs_list_del', 'list_del',
- 'cfs_list_del_init', 'list_del_init',
- 'cfs_list_empty', 'list_empty',
- 'cfs_list_empty_careful', 'list_empty_careful',
- 'cfs_list_entry', 'list_entry',
- 'cfs_list_for_each', 'list_for_each',
- 'cfs_list_for_each_entry', 'list_for_each_entry',
- 'cfs_list_for_each_entry_continue',
- 'list_for_each_entry_continue',
- 'cfs_list_for_each_entry_reverse',
- 'list_for_each_entry_reverse',
- 'cfs_list_for_each_entry_safe',
- 'list_for_each_entry_safe',
- 'cfs_list_for_each_entry_safe_from',
- 'list_for_each_entry_safe_from',
- 'cfs_list_for_each_entry_safe_reverse',
- 'list_for_each_entry_safe_reverse',
- 'cfs_list_for_each_entry_safe_typed',
- 'list_for_each_entry_safe_typed',
- 'cfs_list_for_each_entry_typed',
- 'list_for_each_entry_typed',
- 'cfs_list_for_each_prev', 'list_for_each_prev',
- 'cfs_list_for_each_safe', 'list_for_each_safe',
- 'cfs_list_move', 'list_move',
- 'cfs_list_move_tail', 'list_move_tail',
- 'cfs_list_splice', 'list_splice',
- 'cfs_list_splice_init', 'list_splice_init',
- 'cfs_list_splice_tail', 'list_splice_tail',
- 'cfs_list_t', 'struct list_head',
-
- 'CFS_PAGE_MASK', 'PAGE_MASK',
- 'CFS_PAGE_SIZE', 'PAGE_SIZE',
- 'PAGE_CACHE_MASK', 'PAGE_MASK',
- 'PAGE_CACHE_SIZE', 'PAGE_SIZE',
- 'PAGE_CACHE_SHIFT', 'PAGE_SHIFT',
-
- 'page_cache_release', 'put_page',
- 'page_cache_get', 'get_page',
-
- 'cfs_proc_dir_entry_t', 'struct proc_dir_entry',
-
- 'cfs_rcu_head_t', 'struct rcu_head',
-
- 'cfs_hash_lock_t', 'union cfs_hash_lock',
- 'cfs_hash_bucket_t', 'struct cfs_hash_bucket',
- 'cfs_hash_bd_t', 'struct cfs_hash_bd',
- 'cfs_hash_t', 'struct cfs_hash',
- 'cfs_hash_lock_ops_t', 'struct cfs_hash_lock_ops',
- 'cfs_hash_hlist_ops_t', 'struct cfs_hash_hlist_ops',
- 'cfs_hash_ops_t', 'struct cfs_hash_ops',
- 'cfs_hash_head_t', 'struct cfs_hash_head',
- 'cfs_hash_head_dep_t', 'struct cfs_hash_head_dep',
- 'cfs_hash_dhead_t', 'struct cfs_hash_dhead',
- 'cfs_hash_dhead_dep_t', 'struct cfs_hash_dhead_dep',
- 'cfs_hash_lookup_intent_t', 'enum cfs_hash_lookup_intent',
- 'cfs_hash_cond_arg_t', 'struct cfs_hash_cond_arg',
-
- 'lnet_ni_status_t', 'struct lnet_ni_status',
- 'lnet_ping_info_t', 'struct lnet_ping_info',
- 'lnet_process_id_packed_t', 'struct lnet_process_id_packed',
- 'lnet_handle_wire_t', 'struct lnet_handle_wire',
- 'lnet_hdr_t', 'struct lnet_hdr',
- 'lnet_magicversion_t', 'struct lnet_magicversion',
- 'lnet_acceptor_connreq_t', 'struct lnet_acceptor_connreq',
- 'lnet_counters_t', 'struct lnet_counters',
-
- 'ldlm_appetite_t', 'enum ldlm_appetite',
- 'ldlm_cancel_flags_t', 'enum ldlm_cancel_flags',
- 'ldlm_error_t', 'enum ldlm_error',
- 'ldlm_ns_hash_def_t', 'struct ldlm_ns_hash_def',
- 'ldlm_mode_t', 'enum ldlm_mode',
- 'ldlm_ns_type_t', 'enum ldlm_ns_type',
- 'ldlm_policy_data_t', 'enum ldlm_policy_data',
- 'ldlm_policy_res_t', 'enum ldlm_policy_res',
- 'ldlm_side_t', 'enum ldlm_side',
- 'ldlm_type_t', 'enum ldlm_type',
- 'ldlm_wire_policy_data_t', 'union ldlm_wire_policy_data',
-
- 'LPU64', '%llu',
- 'LPD64', '%lld',
- 'LPX64', '%#llx',
- 'LPX64i', '%llx',
- 'LPO64', '%#llo',
-
- 'LPLU', '%lu',
- 'LPLD', '%ld',
- 'LPLX', '%#lx',
- 'LPPID', '%d',
-
- 'LPROCFS', 'CONFIG_PROC_FS',
- 'mktemp', 'mkstemp',
- 'sprintf', 'snprintf',
- 'strcpy', 'strncpy',
- 'strcat', 'strncat',
- 'tempnam', 'mkstemp',
- 'f_dentry', 'f_path.dentry',
- '= seq_printf', 'seq_printf',
- 'return seq_printf', 'seq_printf',
-);
+ local $/;
+
+ open(my $include_file, '<', "$file")
+ or warn "$P: Can't read '$file' $!\n";
+ my $text = <$include_file>;
+ close($include_file);
+
+ my @lines = split('\n', $text);
+
+ foreach my $line (@lines) {
+ next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
+ if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
+ $camelcase{$1} = 1;
+ } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
+ $camelcase{$1} = 1;
+ } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
+ $camelcase{$1} = 1;
+ }
+ }
+}
+
+sub is_maintained_obsolete {
+ my ($filename) = @_;
+
+ return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
+
+ my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
+
+ return $status =~ /obsolete/i;
+}
+
+my $camelcase_seeded = 0;
+sub seed_camelcase_includes {
+ return if ($camelcase_seeded);
+
+ my $files;
+ my $camelcase_cache = "";
+ my @include_files = ();
+
+ $camelcase_seeded = 1;
+
+ if (-e ".git") {
+ my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
+ chomp $git_last_include_commit;
+ $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
+ } else {
+ my $last_mod_date = 0;
+ $files = `find $root/include -name "*.h"`;
+ @include_files = split('\n', $files);
+ foreach my $file (@include_files) {
+ my $date = POSIX::strftime("%Y%m%d%H%M",
+ localtime((stat $file)[9]));
+ $last_mod_date = $date if ($last_mod_date < $date);
+ }
+ $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
+ }
+
+ if ($camelcase_cache ne "" && -f $camelcase_cache) {
+ open(my $camelcase_file, '<', "$camelcase_cache")
+ or warn "$P: Can't read '$camelcase_cache' $!\n";
+ while (<$camelcase_file>) {
+ chomp;
+ $camelcase{$_} = 1;
+ }
+ close($camelcase_file);
+
+ return;
+ }
+
+ if (-e ".git") {
+ $files = `git ls-files "include/*.h"`;
+ @include_files = split('\n', $files);
+ }
+
+ foreach my $file (@include_files) {
+ seed_camelcase_file($file);
+ }
+
+ if ($camelcase_cache ne "") {
+ unlink glob ".checkpatch-camelcase.*";
+ open(my $camelcase_file, '>', "$camelcase_cache")
+ or warn "$P: Can't write '$camelcase_cache' $!\n";
+ foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
+ print $camelcase_file ("$_\n");
+ }
+ close($camelcase_file);
+ }
+}
+
+sub git_commit_info {
+ my ($commit, $id, $desc) = @_;
+
+ return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
+
+ my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
+ $output =~ s/^\s*//gm;
+ my @lines = split("\n", $output);
+
+ return ($id, $desc) if ($#lines < 0);
+
+ if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
+# Maybe one day convert this block of bash into something that returns
+# all matching commit ids, but it's very slow...
+#
+# echo "checking commits $1..."
+# git rev-list --remotes | grep -i "^$1" |
+# while read line ; do
+# git log --format='%H %s' -1 $line |
+# echo "commit $(cut -c 1-12,41-)"
+# done
+ } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
+ $id = undef;
+ } else {
+ $id = substr($lines[0], 0, 12);
+ $desc = substr($lines[0], 41);
+ }
+
+ return ($id, $desc);
+}
+
+$chk_signoff = 0 if ($file);