source: gpfs_3.1_ker2.6.20/lpp/mmfs/bin/mmdumpfilocks @ 77

Last change on this file since 77 was 16, checked in by rock, 17 years ago
  • Property svn:executable set to *
File size: 5.3 KB
Line 
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
18sourceFile="mmdumpfilocks.sh"
19[[ -n $DEBUG || -n $DEBUGmmdumpfilocks ]] && set -x
20
21# full pathnames to dump commands
22crash=/usr/sbin/crash
23kdb=/usr/sbin/kdb
24lcrash=/sbin/lcrash
25
26if [[ $1 = '-?' || $1 = '-h' || $1 = '--help' || $1 = '--' ]]
27then
28  print -u2 "Usage:  mmdumpfilocks [dump [kernelfile]]"
29  exit 1
30fi
31
32if [[ -x $lcrash ]]
33then                               # 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
43elif [[ -x $crash ]]
44then                               # 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
77elif [[ -x $kdb ]]
78then                               # 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
123else
124  print "Could not locate an appropriate dump viewing facility."
125fi
126exit 0
Note: See TracBrowser for help on using the repository browser.