Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 9383e745e23602bc45f9c92184feea59 > files > 75

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

commit 0c15d39b17f14f7300dfff16e89779dc8b544944
Author: Bob Peterson <bob@ganesha.peterson>
Date:   Mon Aug 31 10:07:12 2009 -0500

    Allow gfs2_edit printsavedmeta to print destination size and type
    
    When doing gfs2_edit printsavedmeta, the code will now print
    whether the metadata is gfs2 or gfs at the top of the output.
    At the end of the output, it will print the device size
    required to restore it.
    
    rhbz#503529

diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index 4559f6d..064eaef 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -653,10 +653,27 @@ void savemeta(char *out_fn, int saveoption)
 	exit(0);
 }
 
+/**
+ * anthropomorphize - make a uint64_t number more human
+ */
+static const char *anthropomorphize(unsigned long long inhuman_value)
+{
+	const char *symbols = " KMGTPE";
+	int i;
+	unsigned long long val = inhuman_value;
+	static char out_val[32];
+
+	memset(out_val, 0, sizeof(out_val));
+	for (i = 0; i < 6 && val > 1024; i++)
+		val /= 1024;
+	sprintf(out_val, "%llu%c", val, symbols[i]);
+	return out_val;
+}
+
 int restore_data(int fd, int in_fd, int printblocksonly)
 {
 	size_t rs;
-	uint64_t buf64, writes = 0;
+	uint64_t buf64, writes = 0, highest_valid_block = 0;
 	uint16_t buf16;
 	int first = 1, pos;
 	char buf[256];
@@ -722,9 +739,9 @@ int restore_data(int fd, int in_fd, int printblocksonly)
 				    sbd1->sb_header.mh_format ==
 				    GFS_FORMAT_SB &&
 				    sbd1->sb_multihost_format ==
-				    GFS_FORMAT_MULTI)
-					;
-				else if (check_sb(&sbd.sd_sb)) {
+				    GFS_FORMAT_MULTI) {
+					gfs1 = TRUE;
+				} else if (check_sb(&sbd.sd_sb)) {
 					fprintf(stderr,"Error: Invalid superblock data.\n");
 					return -1;
 				}
@@ -737,6 +754,9 @@ int restore_data(int fd, int in_fd, int printblocksonly)
 					       "%u bytes in the destination" \
 					       " file system.\n\n",
 					       last_fs_block, sbd.bsize);
+				} else {
+					printf("This is %s metadata\n", gfs1 ?
+					       "gfs (not gfs2)" : "gfs2");
 				}
 				first = 0;
 			}
@@ -744,6 +764,8 @@ int restore_data(int fd, int in_fd, int printblocksonly)
 				print_gfs2("%d (l=0x%x): ", blks_saved,
 					   savedata->siglen);
 				block = savedata->blk;
+				if (block > highest_valid_block)
+					highest_valid_block = block;
 				display_block_type(savedata->buf, TRUE);
 			} else {
 				warm_fuzzy_stuff(savedata->blk, FALSE, FALSE);
@@ -766,6 +788,11 @@ int restore_data(int fd, int in_fd, int printblocksonly)
 	}
 	if (!printblocksonly)
 		warm_fuzzy_stuff(savedata->blk, TRUE, FALSE);
+	else
+		printf("File system size: %lld (0x%llx) blocks, aka %sB\n",
+		       (unsigned long long)highest_valid_block,
+		       (unsigned long long)highest_valid_block,
+		       anthropomorphize(highest_valid_block * sbd.bsize));
 	return 0;
 }