[16] | 1 | /* @(#)27 1.2 src/avs/fs/mmfs/ts/kernext/gpl-linux/mmdumpfilocks.sial, mmfs, avs_rgpfs24, rgpfs240610b 10/17/02 21:25:23 */ |
---|
| 2 | |
---|
| 3 | /* lcrash sial script to display file_lock structures. |
---|
| 4 | * Loaded and executed from mmdumpfilock.sh to support |
---|
| 5 | * the "mmfsadm dump fillocks" command. |
---|
| 6 | */ |
---|
| 7 | string mmdumpfilocks_help() { return ""; } |
---|
| 8 | string mmdumpfilocks_opt() { return ""; } |
---|
| 9 | string mmdumpfilocks_usage() { return ""; } |
---|
| 10 | |
---|
| 11 | typedef struct list_head_t { |
---|
| 12 | struct list_head *next, *prev; |
---|
| 13 | } list_head_t; |
---|
| 14 | |
---|
| 15 | int |
---|
| 16 | mmdumpfilocks() |
---|
| 17 | { |
---|
| 18 | char *fsP; |
---|
| 19 | int ino, dev, nLocks; |
---|
| 20 | int link_offset, block_offset; |
---|
| 21 | list_head_t *lhP, *nextP; |
---|
| 22 | list_head_t *bhP, *blockP; |
---|
| 23 | struct file_lock *flP, *blP; |
---|
| 24 | |
---|
| 25 | printf("\n"); |
---|
| 26 | |
---|
| 27 | /* file_lock_list is the anchor of all locks */ |
---|
| 28 | if (exists("file_lock_list")) |
---|
| 29 | { |
---|
| 30 | lhP = (list_head_t *)file_lock_list; |
---|
| 31 | flP = (struct file_lock *)lhP->next; |
---|
| 32 | link_offset = (int)&flP->fl_link - (int)flP; |
---|
| 33 | block_offset = (int)&flP->fl_block - (int)flP; |
---|
| 34 | |
---|
| 35 | nLocks = 0; |
---|
| 36 | |
---|
| 37 | /* Loop through the fl_link.next chain (circular) */ |
---|
| 38 | while (flP != lhP) { |
---|
| 39 | |
---|
| 40 | /* Back-up to top of file_lock */ |
---|
| 41 | flP = (struct file_lock *) ((int)flP - link_offset); |
---|
| 42 | |
---|
| 43 | /* Only show GPFS locks */ |
---|
| 44 | fsP = flP->fl_file->f_dentry->d_sb->s_type->name; |
---|
| 45 | if (fsP[0] == 'g' && fsP[1] == 'p' && fsP[2] == 'f' && fsP[3] == 's') { |
---|
| 46 | |
---|
| 47 | if (!nLocks++) { |
---|
| 48 | /* Header line */ |
---|
| 49 | printf("file_lock maj:min inode pid type start end\n"); |
---|
| 50 | printf("---------- ------- -------- -------- ----- ---------- ----------\n"); |
---|
| 51 | } |
---|
| 52 | |
---|
| 53 | /* collect inode and dev to easily identify the file */ |
---|
| 54 | ino = flP->fl_file->f_dentry->d_inode->i_ino; |
---|
| 55 | dev = flP->fl_file->f_dentry->d_inode->i_dev; |
---|
| 56 | |
---|
| 57 | /* display some of the lock fields. */ |
---|
| 58 | printf("0x%8X %0.3d:%0.3d %8d %8d %5s %10d %10d\n", |
---|
| 59 | flP, dev>>8, dev & 0xFF, ino, flP->fl_pid, |
---|
| 60 | flP->fl_type==0? "READ": (flP->fl_type==1? "WRITE":"?"), |
---|
| 61 | flP->fl_start, flP->fl_end); |
---|
| 62 | |
---|
| 63 | /* Follow fl_block so we can match up "reclockSleepers" */ |
---|
| 64 | bhP = (list_head_t *)(&flP->fl_block); |
---|
| 65 | blP = (struct file_lock *)bhP->next; |
---|
| 66 | |
---|
| 67 | /* Loop through the fl_block.next chain (circular) */ |
---|
| 68 | while (blP != bhP) { |
---|
| 69 | |
---|
| 70 | /* Back-up to top of file_lock */ |
---|
| 71 | blP = (struct file_lock *) ((int)blP - block_offset); |
---|
| 72 | |
---|
| 73 | /* display some of the lock fields. One line per lock. */ |
---|
| 74 | printf("0x%8X %0.3d:%0.3d %8d %8d %5s %10d %10d waiting\n", |
---|
| 75 | blP, dev>>8, dev & 0xFF, ino, blP->fl_pid, |
---|
| 76 | blP->fl_type==0? "READ": (blP->fl_type==1? "WRITE":"?"), |
---|
| 77 | blP->fl_start, blP->fl_end); |
---|
| 78 | |
---|
| 79 | /* Move to the next file_lock in the block list. */ |
---|
| 80 | blockP = (list_head_t *)(&blP->fl_block); |
---|
| 81 | blP = (struct file_lock *)blockP->next; |
---|
| 82 | } /* Done with the fl_block chain. */ |
---|
| 83 | |
---|
| 84 | } |
---|
| 85 | /* Move to the next file_lock in the fl_link list and continue. */ |
---|
| 86 | nextP = (list_head_t *)(&flP->fl_link); |
---|
| 87 | flP = (struct file_lock *)nextP->next; |
---|
| 88 | } |
---|
| 89 | } |
---|
| 90 | else |
---|
| 91 | { |
---|
| 92 | printf("The \"file_lock_list\" symbol cannot be found in this memory image.\n"); |
---|
| 93 | printf("Did you give lcrash a /var/mmfs/tmp/complete.map?\n"); |
---|
| 94 | } |
---|
| 95 | return 0; |
---|
| 96 | } |
---|