From mboxrd@z Thu Jan 1 00:00:00 1970 From: rpeterso@sourceware.org Date: 24 Apr 2007 03:19:11 -0000 Subject: [Cluster-devel] cluster/gfs2/edit hexedit.c Message-ID: <20070424031911.16679.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: rpeterso at sourceware.org 2007-04-24 04:19:11 Modified files: gfs2/edit : hexedit.c Log message: Horrible kludge to allow display/print of the rgs themselves (but not yet the bitmaps) for easier debugging of bz 223893. Example: gfs2_edit -p rgs /dev/trin_vg/trin_lv Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.c.diff?cvsroot=cluster&r1=1.12&r2=1.13 --- cluster/gfs2/edit/hexedit.c 2007/03/28 22:10:29 1.12 +++ cluster/gfs2/edit/hexedit.c 2007/04/24 03:19:11 1.13 @@ -42,6 +42,8 @@ #include +#define RGLIST_DUMMY_BLOCK -2 + int display(int identify_only); extern void eol(int col); extern void do_indirect_extended(char *buf); @@ -341,7 +343,10 @@ if (edit_row[dmode] == -1) COLORS_HIGHLIGHT; } - print_gfs2("%lld (0x%"PRIx64")", block, block); + if (block == RGLIST_DUMMY_BLOCK) + print_gfs2("RG List "); + else + print_gfs2("%lld (0x%"PRIx64")", block, block); if (termlines) { if (edit_row[dmode] == -1) COLORS_NORMAL; @@ -355,9 +360,14 @@ else printf(" "); - if (*(lpBuffer+0)==0x01 && *(lpBuffer+1)==0x16 && *(lpBuffer+2)==0x19 && - *(lpBuffer+3)==0x70 && *(lpBuffer+4)==0x00 && *(lpBuffer+5)==0x00 && - *(lpBuffer+6)==0x00) { /* If magic number appears at the start */ + if (block == RGLIST_DUMMY_BLOCK) { + ret_type = GFS2_METATYPE_RG; + struct_len = sizeof(struct gfs2_rgrp); + } + else if (*(lpBuffer+0)==0x01 && *(lpBuffer+1)==0x16 && + *(lpBuffer+2)==0x19 && *(lpBuffer+3)==0x70 && + *(lpBuffer+4)==0x00 && *(lpBuffer+5)==0x00 && + *(lpBuffer+6)==0x00) { /* If magic number appears at the start */ ret_type = *(lpBuffer+7); switch (*(lpBuffer+7)) { case GFS2_METATYPE_SB: /* 1 */ @@ -431,6 +441,8 @@ print_gfs2("-------------------- Root directory ------------------"); else if (!gfs1 && block == sbd.sd_sb.sb_master_dir.no_addr) print_gfs2("------------------- Master directory -----------------"); + else if (!gfs1 && block == RGLIST_DUMMY_BLOCK) + print_gfs2("----------------------- RG List ----------------------"); else { if (gfs1) { if (block == sbd1->sb_rindex_di.no_addr) @@ -569,9 +581,9 @@ } /* ------------------------------------------------------------------------ */ -/* print_rindex - print the rgindex file. */ +/* parse_rindex - print the rgindex file. */ /* ------------------------------------------------------------------------ */ -int print_rindex(struct gfs2_inode *di) +int parse_rindex(struct gfs2_inode *di, int print_rindex) { int error, start_line; struct gfs2_rindex ri; @@ -587,8 +599,8 @@ memset(highlighted_addr, 0, sizeof(highlighted_addr)); for (print_entry_ndx=0; ; print_entry_ndx++) { error = gfs2_readi(di, (void *)&buf, - print_entry_ndx * sizeof(struct gfs2_rindex), - sizeof(struct gfs2_rindex)); + print_entry_ndx * sizeof(struct gfs2_rindex), + sizeof(struct gfs2_rindex)); gfs2_rindex_in(&ri, buf); if (!error) /* end of file */ break; @@ -602,10 +614,23 @@ ri.ri_addr); } print_gfs2("RG #%d", print_entry_ndx); + if (!print_rindex) + print_gfs2(" located at: %llu (0x%llx)", + ri.ri_addr, ri.ri_addr); eol(0); if (edit_row[dmode] == print_entry_ndx) COLORS_NORMAL; - gfs2_rindex_print(&ri); + if(print_rindex) + gfs2_rindex_print(&ri); + else { + struct gfs2_rgrp rg; + struct gfs2_buffer_head *tmp_bh; + + tmp_bh = bread(&sbd, ri.ri_addr); + gfs2_rgrp_in(&rg, tmp_bh->b_data); + gfs2_rgrp_print(&rg); + brelse(tmp_bh, not_updated); + } last_entry_onscreen[dmode] = print_entry_ndx; } } @@ -978,6 +1003,18 @@ } /* ------------------------------------------------------------------------ */ +/* block_is_rglist - there's no such block as the rglist. This is a */ +/* special case meant to parse the rindex and follow the */ +/* blocks to the real rgs. */ +/* ------------------------------------------------------------------------ */ +int block_is_rglist(void) +{ + if (block == RGLIST_DUMMY_BLOCK) + return TRUE; + return FALSE; +} + +/* ------------------------------------------------------------------------ */ /* block_is_jindex */ /* ------------------------------------------------------------------------ */ int block_is_jindex(void) @@ -1025,6 +1062,7 @@ { if (has_indirect_blocks() || block_is_rindex() || + block_is_rglist() || block_is_jindex() || block_is_inum_file() || block_is_statfs_file() || @@ -1047,7 +1085,13 @@ else if (block_is_rindex()) { tmp_bh = bread(&sbd, block); tmp_inode = inode_get(&sbd, tmp_bh); - print_rindex(tmp_inode); + parse_rindex(tmp_inode, TRUE); + brelse(tmp_bh, not_updated); + } + else if (block_is_rglist()) { + tmp_bh = bread(&sbd, masterblock("rindex")); + tmp_inode = inode_get(&sbd, tmp_bh); + parse_rindex(tmp_inode, FALSE); brelse(tmp_bh, not_updated); } else if (block_is_jindex()) { @@ -1136,16 +1180,22 @@ /* ------------------------------------------------------------------------ */ int display(int identify_only) { + uint64_t blk; + + if (block == RGLIST_DUMMY_BLOCK) + blk = masterblock("rindex"); + else + blk = block; if (termlines) { display_title_lines(); move(2,0); } - if (block_in_mem != block) { /* If we changed blocks from the last read */ - dev_offset = block * bufsize; + if (block_in_mem != blk) { /* If we changed blocks from the last read */ + dev_offset = blk * bufsize; ioctl(fd, BLKFLSBUF, 0); do_lseek(fd, dev_offset); do_read(fd, buf, bufsize); /* read in the desired block */ - block_in_mem = block; /* remember which block is in memory */ + block_in_mem = blk; /* remember which block is in memory */ } line = 1; gfs2_struct_type = display_block_type(buf); @@ -1153,7 +1203,7 @@ return 0; indirect_blocks = 0; lines_per_row[dmode] = 1; - if (gfs2_struct_type == GFS2_METATYPE_SB || block == 0x10) { + if (gfs2_struct_type == GFS2_METATYPE_SB || blk == 0x10) { gfs2_sb_in(&sbd.sd_sb, buf); /* parse it out into the sb structure */ memset(&indirect, 0, sizeof(indirect)); indirect[0].block = sbd.sd_sb.sb_master_dir.no_addr; @@ -1307,15 +1357,19 @@ else if (!strcmp(string, "quota")) temp_blk = gfs1_quota_di.no_addr; } - else - temp_blk = masterblock(string); + else { + if (!strcmp(string, "rgs")) + temp_blk = RGLIST_DUMMY_BLOCK; + else + temp_blk = masterblock(string); + } } else if (string[0] == '0' && string[1] == 'x') sscanf(string, "%"SCNx64, &temp_blk); /* retrieve in hex */ else sscanf(string, "%" PRIu64, &temp_blk); /* retrieve decimal */ - if (temp_blk < max_block) { + if (temp_blk == RGLIST_DUMMY_BLOCK || temp_blk < max_block) { offset = 0; block = temp_blk; push_block(block); @@ -1760,6 +1814,7 @@ fprintf(stderr," inum - prints the inum file.\n"); fprintf(stderr," statfs - prints the statfs file.\n"); fprintf(stderr," rindex - prints the rindex file.\n"); + fprintf(stderr," rgs - prints all the resource groups (rgs).\n"); fprintf(stderr," quota - prints the quota file.\n"); fprintf(stderr,"-x print in hexmode.\n"); fprintf(stderr,"-h prints this help.\n\n"); @@ -1856,6 +1911,10 @@ else push_block(masterblock("rindex")); } + else if (!strcmp(argv[i], "rgs")) { + if (!gfs1) + push_block(RGLIST_DUMMY_BLOCK); + } else if (!strcmp(argv[i], "quota")) { if (gfs1) push_block(gfs1_quota_di.no_addr);