| [16] | 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 | 
|---|