Add a tool to find lock ID numbers
authorJeffrey Hutzelman <jhutz@cmu.edu>
Sun, 16 Jun 2013 23:16:05 +0000 (19:16 -0400)
committerDerrick Brashear <shadow@your-file-system.com>
Fri, 12 Jul 2013 15:00:17 +0000 (08:00 -0700)
This adds a Perl program, src/afs/findlocks, which grovels through the
kernel module source tree, finds every location where a lock is obtained,
and produces an index of lock site ID numbers.  This can be used to find
a lock when debugging, or when picking a new number.

Run it as ./src/afs/findlocks src/afs

Change-Id: I7fdcfb807a92dbb1938a0c37637e9122b52addd7
Reviewed-on: http://gerrit.openafs.org/9982
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Simon Wilkinson <simonxwilkinson@gmail.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>

src/afs/findlocks [new file with mode: 0755]

diff --git a/src/afs/findlocks b/src/afs/findlocks
new file mode 100755 (executable)
index 0000000..85f6f59
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/perl
+
+use File::Find;
+use IO::File;
+
+use strict;
+use vars qw($Pat @Locks $DupOnly);
+
+# This pattern matches the function names we are looking for
+$Pat = qr/(?:NB)?Obtain(?:Write|Shared|)Lock|UpgradeSToWLock/;
+
+if (@ARGV[0] eq '-d') {
+  $DupOnly = 1;
+  shift @ARGV;
+}
+
+find(
+  sub {
+    return unless -f $_;
+
+    my $path = $File::Find::name;
+    my $F = new IO::File($_, O_RDONLY) or die "$path: $!\n";
+    while (<$F>) {
+      next unless /\b(?:$Pat)\(.*,\s*(\d+)\)/o;
+      $Locks[$1] ||= [];
+      push(@{$Locks[$1]}, sprintf("%s:%d", $path, $.));
+    }
+    $F->close;
+  }, @ARGV);
+
+foreach my $id (0 .. @Locks) {
+  next unless defined $Locks[$id];
+  next if $DupOnly && @{$Locks[$id]} < 2;
+  printf("%5d  %s", $id, join("       ", map("$_\n", @{$Locks[$id]})))
+}