--- /dev/null
+#!/usr/bin/perl
+
+use Getopt::Long;
+GetOptions("pid=i" => \$pid,
+ "trace!" => \$trace,
+ "nonet!" => \$nonet);
+
+# print "$pid\n";
+
+
+$subsys->{UNDEFINED} = 0;
+$subsys->{MDC} = 1;
+$subsys->{MDS} = 2;
+$subsys->{OSC} = 3;
+$subsys->{OST} = 4;
+$subsys->{CLASS} = 5;
+$subsys->{OBDFS} = 6;
+$subsys->{LLITE} = 7;
+$subsys->{RPC} = 8;
+$subsys->{EXT2OBD} = 9;
+$subsys->{PORTALS} = 10;
+$subsys->{SOCKNAL} = 11;
+$subsys->{QSWNAL} = 12;
+$subsys->{PINGER} = 13;
+$subsys->{FILTER} = 14;
+$subsys->{TRACE} = 15; # obdtrace, not to be confused with D_TRACE */
+$subsys->{ECHO} = 16;
+$subsys->{LDLM} = 17;
+$subsys->{LOV} = 18;
+$subsys->{GMNAL} = 19;
+$subsys->{PTLROUTER} = 20;
+
+
+$masks->{TRACE} = 1 << 0; # /* ENTRY/EXIT markers */
+$masks->{INODE} = 1 << 1; #
+$masks->{SUPER} = 1 << 2; #
+$masks->{EXT2} = 1 << 3; # /* anything from ext2_debug */
+$masks->{MALLOC} = 1 << 4; # /* print malloc, free information */
+$masks->{CACHE} = 1 << 5; # /* cache-related items */
+$masks->{INFO} = 1 << 6; # /* general information */
+$masks->{IOCTL} = 1 << 7; # /* ioctl related information */
+$masks->{BLOCKS} = 1 << 8; # /* ext2 block allocation */
+$masks->{NET} = 1 << 9; # /* network communications */
+$masks->{WARNING} = 1 << 10; #
+$masks->{BUFFS} = 1 << 11; #
+$masks->{OTHER} = 1 << 12; #
+$masks->{DENTRY} = 1 << 13; #
+$masks->{PORTALS} = 1 << 14; # /* ENTRY/EXIT markers */
+$masks->{PAGE} = 1 << 15; # /* bulk page handling */
+$masks->{DLMTRACE} = 1 << 16; #
+$masks->{ERROR} = 1 << 17; # /* CERROR} = ...) == CDEBUG} = D_ERROR, ...) */
+$masks->{EMERG} = 1 << 18; # /* CEMERG} = ...) == CDEBUG} = D_EMERG, ...) */
+$masks->{HA} = 1 << 19; # /* recovery and failover */
+
+
+
+sub extractpid
+{
+ $_ = shift;
+# print "$_\n";
+ /l. [0-9]* (.*)\):/;
+ return $1;
+}
+
+sub entering
+{
+ $_ = shift;
+ $entering = /Process entered/;
+}
+
+sub leaving
+{
+ $_ = shift;
+ $entering = /Process leaving/;
+}
+
+sub getsubsys
+{
+ my ($subsys, $mask) = split ":";
+ return $subsys;
+}
+
+sub getmask
+{
+ my ($subsys, $mask) = split ":";
+ return $mask;
+}
+
+while (<STDIN>) {
+ $linepid = extractpid($_);
+ $linemask = getmask($_);
+ $linesubsys = getsubsys($_);
+
+# printf "---> mask %x subsys %x\n", $linemask, $linesubsys;
+
+ if (leaving($_)) {
+ chop $prefix->{$linepid};
+ chop $prefix->{$linepid};
+ }
+ if ( !$pid || $linepid == $pid) {
+ next if ($trace && $linemask != $masks->{TRACE});
+ next if ($nonet &&
+ ( $linesubsys == $subsys->{RPC} ||
+ $linesubsys == $subsys->{NET} ||
+ $linesubsys == $subsys->{PORTALS} ||
+ $linesubsys == $subsys->{SOCKNAL} ||
+ $linesubsys == $subsys->{QSWNAL} ||
+ $linesubsys == $subsys->{GMNAL}));
+
+# printf "sub/mask: %s - %s\n", getsubsys($_), getmask($_);
+
+ printf "%s%s", $prefix->{$linepid}, $_;
+ last if $count++ > 100;
+ }
+ if (entering($_)) {
+ $prefix->{$linepid} .= ' ';
+ }
+}
+
+# printf "argv %s pid %d\n", $ARGV[0], extractpid($ARGV[0]);