cluster: RHEL57 - gfs2_edit: display block allocation on rgrps and bitmaps
Bob Peterson
rpeterso at fedoraproject.org
Wed Feb 2 21:16:04 UTC 2011
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=dff0fe59568e9b4b09191f05ab7c718fc1b19b7e
Commit: dff0fe59568e9b4b09191f05ab7c718fc1b19b7e
Parent: eb9fa6b1817be8295e48a7c8a91b0dbaf3c04312
Author: Bob Peterson <rpeterso at redhat.com>
AuthorDate: Mon Dec 13 14:07:59 2010 -0600
Committer: Bob Peterson <rpeterso at redhat.com>
CommitterDate: Wed Feb 2 14:36:09 2011 -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
---
gfs2/edit/hexedit.c | 74 ++++++++++++++++++++++++++++++++++++++++++++------
gfs2/libgfs2/rgrp.c | 6 ++++
2 files changed, 71 insertions(+), 9 deletions(-)
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;
More information about the cluster-commits
mailing list