commit dff0fe59568e9b4b09191f05ab7c718fc1b19b7e Author: Bob Peterson <rpeterso@redhat.com> Date: Mon Dec 13 14:07:59 2010 -0600 gfs2_edit: display block allocation on rgrps and bitmaps This patch displays the bit settings for bits as you walk your cursor through gfs2 bitmaps. rhbz#656371 diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c index 380845a..5a05114 100644 --- a/gfs2/edit/hexedit.c +++ b/gfs2/edit/hexedit.c @@ -70,7 +70,9 @@ extern void restoremeta(const char *in_fn, const char *out_device, /* for assigning string fields: */ #define checkassigns(strfield, struct, member, val) do { \ if (strcmp(#member, strfield) == 0) { \ - memcpy(struct->member, val, sizeof(struct->member)); \ + memset(struct->member, 0, sizeof(struct->member)); \ + strncpy((char *)struct->member, (char *)val, \ + sizeof(struct->member)); \ return 0; \ } \ } while(0) @@ -1106,7 +1108,7 @@ int display_block_type(int from_restore) break; case GFS2_METATYPE_RB: /* 3 */ print_gfs2("(rsrc grp bitblk)"); - struct_len = 512; + struct_len = sizeof(struct gfs2_meta_header); break; case GFS2_METATYPE_DI: /* 4 */ print_gfs2("(disk inode)"); @@ -1162,8 +1164,7 @@ int display_block_type(int from_restore) struct_len = sbd.bsize; break; } - } - else + } else struct_len = sbd.bsize; eol(0); if (from_restore) @@ -1175,8 +1176,11 @@ int display_block_type(int from_restore) rgd = gfs2_blk2rgrpd(&sbd, block); if (rgd) { gfs2_rgrp_read(&sbd, rgd); - type = gfs2_get_bitmap(&sbd, block, rgd); - gfs2_rgrp_relse(rgd); + if ((*(bh->b_data + 7) == GFS2_METATYPE_RG) || + (*(bh->b_data + 7) == GFS2_METATYPE_RB)) + type = 4; + else + type = gfs2_get_bitmap(&sbd, block, rgd); } else type = 4; screen_chunk_size = ((termlines - 4) * 16) >> 8 << 8; @@ -1188,7 +1192,60 @@ int display_block_type(int from_restore) sbd.bsize / screen_chunk_size + 1 : sbd.bsize / screen_chunk_size, allocdesc[gfs1][type]); /*eol(9);*/ - } + if ((*(bh->b_data + 7) == GFS2_METATYPE_RG)) { + int ptroffset = edit_row[dmode] * 16 + edit_col[dmode]; + + if (ptroffset >= struct_len || pgnum) { + int blknum, b, btype; + + blknum = pgnum * screen_chunk_size; + blknum += (ptroffset - struct_len); + blknum *= 4; + blknum += rgd->ri.ri_data0; + + print_gfs2(" blk "); + for (b = blknum; b < blknum + 4; b++) { + btype = gfs2_get_bitmap(&sbd, b, rgd); + print_gfs2("0x%x-%s ", b, + allocdesc[gfs1][btype]); + } + } + } else if ((*(bh->b_data + 7) == GFS2_METATYPE_RB)) { + int ptroffset = edit_row[dmode] * 16 + edit_col[dmode]; + + if (ptroffset >= struct_len || pgnum) { + int blknum, b, btype, rb_number; + + rb_number = block - rgd->ri.ri_addr; + blknum = 0; + /* count the number of bytes representing + blocks prior to the displayed screen. */ + for (b = 0; b < rb_number; b++) { + struct_len = (b ? + sizeof(struct gfs2_meta_header) : + sizeof(struct gfs2_rgrp)); + blknum += (sbd.bsize - struct_len); + } + struct_len = sizeof(struct gfs2_meta_header); + /* add the number of bytes on this screen */ + blknum += (ptroffset - struct_len); + /* factor in the page number */ + blknum += pgnum * screen_chunk_size; + /* convert bytes to blocks */ + blknum *= GFS2_NBBY; + /* add the starting offset for this rgrp */ + blknum += rgd->ri.ri_data0; + print_gfs2(" blk "); + for (b = blknum; b < blknum + 4; b++) { + btype = gfs2_get_bitmap(&sbd, b, rgd); + print_gfs2("0x%x-%s ", b, + allocdesc[gfs1][btype]); + } + } + } + if (rgd) + gfs2_rgrp_relse(rgd); + } if (block == sbd.sd_sb.sb_root_dir.no_addr) print_gfs2("--------------- Root directory ------------------"); else if (!gfs1 && block == sbd.sd_sb.sb_master_dir.no_addr) @@ -2572,7 +2629,6 @@ static void process_field(const char *field, const char *nstr) fblock = blockstack[blockhist % BLOCK_STACK_SIZE].block; rbh = bread(&sbd, fblock); type = get_block_type(rbh); - switch (type) { case GFS2_METATYPE_SB: gfs2_sb_in(&lsb, rbh); @@ -2581,7 +2637,7 @@ static void process_field(const char *field, const char *nstr) gfs2_sb_assigns(&lsb, field, nstr); else gfs2_sb_assignval(&lsb, field, newval); - gfs2_sb_out(&sb, rbh); + gfs2_sb_out(&lsb, rbh); if (!termlines) gfs2_sb_printval(&lsb, field); } else { diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c index bd36038..3cb049b 100644 --- a/gfs2/libgfs2/rgrp.c +++ b/gfs2/libgfs2/rgrp.c @@ -115,12 +115,18 @@ struct rgrp_list *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, uint64_t blk) ri = &prev_rgd->ri; if (ri->ri_data0 <= blk && blk < ri->ri_data0 + ri->ri_data) return prev_rgd; + if (blk >= ri->ri_addr && blk < ri->ri_addr + ri->ri_length) + return prev_rgd; } for (tmp = sdp->rglist.next; tmp != &sdp->rglist; tmp = tmp->next) { rgd = osi_list_entry(tmp, struct rgrp_list, list); ri = &rgd->ri; + if (blk >= ri->ri_addr && blk < ri->ri_addr + ri->ri_length) { + prev_rgd = rgd; + return rgd; + } if (ri->ri_data0 <= blk && blk < ri->ri_data0 + ri->ri_data) { prev_rgd = rgd; return rgd;