Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 35adedb8830cf948b43b86231991124b > files > 129

gfs2-utils-0.1.62-39.el5.src.rpm

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;