| 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 | 
|---|