cluster: RHEL6 - gfs2_edit: display block allocation on rgrps and bitmaps
Bob Peterson
rpeterso at fedoraproject.org
Thu Oct 14 14:34:09 UTC 2010
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=3b0691b0cbead65ed91c9cf3e2d9cd833b9471ad
Commit: 3b0691b0cbead65ed91c9cf3e2d9cd833b9471ad
Parent: bfbe0c82f28a631a019c99c1ef0ef5c978ec6e93
Author: Bob Peterson <bob at krishna.(none)>
AuthorDate: Tue Oct 5 04:51:52 2010 -0500
Committer: Bob Peterson <rpeterso at redhat.com>
CommitterDate: Thu Oct 14 08:34:38 2010 -0500
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#634623
---
gfs2/edit/hexedit.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++---
gfs2/libgfs2/rgrp.c | 6 ++++
2 files changed, 66 insertions(+), 4 deletions(-)
diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index 1fd9e77..d900c93 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -1090,7 +1090,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)");
@@ -1158,8 +1158,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;
@@ -1171,7 +1174,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)
diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c
index d442633..d37ed1b 100644
--- a/gfs2/libgfs2/rgrp.c
+++ b/gfs2/libgfs2/rgrp.c
@@ -104,12 +104,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;
More information about the cluster-commits
mailing list