1 | #!/bin/ksh |
---|
2 | # IBM_PROLOG_BEGIN_TAG |
---|
3 | # This is an automatically generated prolog. |
---|
4 | # |
---|
5 | # |
---|
6 | # |
---|
7 | # Licensed Materials - Property of IBM |
---|
8 | # |
---|
9 | # (C) COPYRIGHT International Business Machines Corp. 2002,2004 |
---|
10 | # All Rights Reserved |
---|
11 | # |
---|
12 | # US Government Users Restricted Rights - Use, duplication or |
---|
13 | # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. |
---|
14 | # |
---|
15 | # IBM_PROLOG_END_TAG |
---|
16 | # @(#)28 1.3 src/avs/fs/mmfs/ts/admin/mmdumpfilocks.sh, mmfs, avs_rgpfs24, rgpfs240610b 10/16/02 23:26:49 |
---|
17 | |
---|
18 | sourceFile="mmdumpfilocks.sh" |
---|
19 | [[ -n $DEBUG || -n $DEBUGmmdumpfilocks ]] && set -x |
---|
20 | |
---|
21 | # full pathnames to dump commands |
---|
22 | crash=/usr/sbin/crash |
---|
23 | kdb=/usr/sbin/kdb |
---|
24 | lcrash=/sbin/lcrash |
---|
25 | |
---|
26 | if [[ $1 = '-?' || $1 = '-h' || $1 = '--help' || $1 = '--' ]] |
---|
27 | then |
---|
28 | print -u2 "Usage: mmdumpfilocks [dump [kernelfile]]" |
---|
29 | exit 1 |
---|
30 | fi |
---|
31 | |
---|
32 | if [[ -x $lcrash ]] |
---|
33 | then # Linux lcrash debugger |
---|
34 | # All the smarts are in the sial script |
---|
35 | print "load /usr/lpp/mmfs/bin/mmdumpfilocks.sial\\nmmdumpfilocks\\nquit" \ |
---|
36 | | $lcrash 2>/dev/null \ |
---|
37 | | /bin/awk '{ if (NR>3) { \ |
---|
38 | print $0; \ |
---|
39 | } \ |
---|
40 | }' |
---|
41 | |
---|
42 | |
---|
43 | elif [[ -x $crash ]] |
---|
44 | then # AIX pre-rel5 crash debugger |
---|
45 | # Stage 1: Select the GPFS vnodes, extract the gnode address and |
---|
46 | # pass it forward as a comment to the next stage along |
---|
47 | # with the offset of gn_filocks. |
---|
48 | # Stage 2: Extract the value of gn_filocks passing it forward |
---|
49 | # along with the gnode pointer. |
---|
50 | # Stage 3: If gn_filocks is not NULL, display the gnode and use |
---|
51 | # the link command to follow the lock chain. |
---|
52 | print "vnode" | $crash $1 $2 2> /dev/null \ |
---|
53 | | /usr/bin/awk '{ if ($5=="mmfs") { \ |
---|
54 | print "! print", "gnode", $8; \ |
---|
55 | print "calc", $8"+3C"; \ |
---|
56 | } \ |
---|
57 | }' \ |
---|
58 | | $crash $1 $2 2> /dev/null \ |
---|
59 | | /usr/bin/awk '{ if ($1=="gnode") { \ |
---|
60 | print "! print", "gnode", $2; \ |
---|
61 | } else { \ |
---|
62 | print "od", $1, "1 h"; \ |
---|
63 | } \ |
---|
64 | }' \ |
---|
65 | | $crash $1 $2 2> /dev/null \ |
---|
66 | | /usr/bin/awk '{ if ($1=="gnode") { \ |
---|
67 | GNODEP=$2; \ |
---|
68 | } else if ($2!="00000000") { \ |
---|
69 | print "! print GNODE"; \ |
---|
70 | print "od", GNODEP, "24"; \ |
---|
71 | print "! print FILOCKS"; \ |
---|
72 | print "link", $2" 15 14 0"; \ |
---|
73 | } \ |
---|
74 | }' \ |
---|
75 | | $crash $1 $2 2> /dev/null |
---|
76 | |
---|
77 | elif [[ -x $kdb ]] |
---|
78 | then # AIX rel5 kdb debugger |
---|
79 | # Stage 1: Select the vnode pointers from the file output. |
---|
80 | # Note that we could start with "vnode" instead of going |
---|
81 | # through the files, but the file list can be substantially |
---|
82 | # shorter. Also, don't start with inodes because they |
---|
83 | # can be paged out. |
---|
84 | # Stage 2: Select the gnode pointers from the vnode output. |
---|
85 | # Use "sort -u" to remove duplicates caused by two files |
---|
86 | # associated with the same gnode. |
---|
87 | # Stage 3: It's hard to tell GPFS gnodes from others, but most |
---|
88 | # others have symbolic gn_ops values (eg., "jfs_vops"). |
---|
89 | # If gn_ops is an address only, continue looking for locks. |
---|
90 | # If gn_filocks is not NULL, display the gnode and use |
---|
91 | # the "ext" command to follow the lock chain. |
---|
92 | |
---|
93 | print "file " | $kdb $1 $2 2> /dev/null \ |
---|
94 | | /usr/bin/awk '{ if ($6=="VNODE" && $5!="00000000") { \ |
---|
95 | print "vnode", $5 } \ |
---|
96 | }' \ |
---|
97 | | $kdb $1 $2 2> /dev/null \ |
---|
98 | | /usr/bin/awk '{ if ($3=="v_gnode..." && $4!="00000000") { \ |
---|
99 | print "gnode", $4} \ |
---|
100 | }' \ |
---|
101 | | /usr/bin/sort -u \ |
---|
102 | | $kdb $1 $2 2> /dev/null \ |
---|
103 | | /usr/bin/awk '{ if ($1=="GNODE............") { \ |
---|
104 | GNODEP=$2; \ |
---|
105 | getline; \ |
---|
106 | } else if ($5=="gn_ops........") { \ |
---|
107 | VOPS=$6; \ |
---|
108 | getline; \ |
---|
109 | } else if ($3=="gn_filocks...." && $4!="00000000" && \ |
---|
110 | VOPS !~ /[g-z]/) { \ |
---|
111 | print "! print GNODE"; \ |
---|
112 | print "dw", GNODEP" 18"; \ |
---|
113 | print "! print FILOCKS"; \ |
---|
114 | print "ext -p", $4, "38 F 10"; \ |
---|
115 | } \ |
---|
116 | }' \ |
---|
117 | | $kdb $1 $2 2> /dev/null \ |
---|
118 | | /usr/bin/awk '{ if (NR>20 && $1!="(0)>") { \ |
---|
119 | print $0; \ |
---|
120 | } \ |
---|
121 | }' |
---|
122 | |
---|
123 | else |
---|
124 | print "Could not locate an appropriate dump viewing facility." |
---|
125 | fi |
---|
126 | exit 0 |
---|