gfs2-utils: master - libgfs2: Remove gfs2_next_rg_meta

Andrew Price andyp at fedoraproject.org
Mon Mar 11 19:51:10 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=9c6977dae8082767f07f96f1c29672556fa062bf
Commit:        9c6977dae8082767f07f96f1c29672556fa062bf
Parent:        874f1c26c7398c085bd14fadc2c6b6d524346c92
Author:        Andrew Price <anprice at redhat.com>
AuthorDate:    Mon Mar 11 15:07:47 2013 +0000
Committer:     Andrew Price <anprice at redhat.com>
CommitterDate: Mon Mar 11 15:20:58 2013 +0000

libgfs2: Remove gfs2_next_rg_meta

This removes gfs2_next_rg_meta and gfs2_next_rg_metatype from libgfs2
and switches gfs2_edit to use lgfs2_bm_scan. The functions are pushed
into gfs2_convert rather switching it to lgfs2_bm_scan to provide
identical functionality in the absence of a gfs1 fs to test it with.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/convert/gfs2_convert.c |   52 +++++++++++++++++++++++++++-
 gfs2/edit/hexedit.c         |   54 +++++++++++++++++++----------
 gfs2/edit/savemeta.c        |   80 ++++++++++++++-----------------------------
 gfs2/libgfs2/libgfs2.h      |    5 ---
 gfs2/libgfs2/structures.c   |   76 ----------------------------------------
 5 files changed, 113 insertions(+), 154 deletions(-)

diff --git a/gfs2/convert/gfs2_convert.c b/gfs2/convert/gfs2_convert.c
index 235c95c..d286512 100644
--- a/gfs2/convert/gfs2_convert.c
+++ b/gfs2/convert/gfs2_convert.c
@@ -999,6 +999,56 @@ static int adjust_inode(struct gfs2_sbd *sbp, struct gfs2_buffer_head *bh)
 	return 0;
 } /* adjust_inode */
 
+static int next_rg_meta(struct rgrp_tree *rgd, uint64_t *block, int first)
+{
+	struct gfs2_bitmap *bits = NULL;
+	uint32_t length = rgd->ri.ri_length;
+	uint32_t blk = (first)? 0: (uint32_t)((*block + 1) - rgd->ri.ri_data0);
+	int i;
+
+	if (!first && (*block < rgd->ri.ri_data0)) {
+		fprintf(stderr, "next_rg_meta:  Start block is outside rgrp bounds.\n");
+		exit(1);
+	}
+	for (i = 0; i < length; i++){
+		bits = &rgd->bits[i];
+		if (blk < bits->bi_len * GFS2_NBBY)
+			break;
+		blk -= bits->bi_len * GFS2_NBBY;
+	}
+	for (; i < length; i++){
+		bits = &rgd->bits[i];
+		blk = gfs2_bitfit((unsigned char *)rgd->bh[i]->b_data +
+				  bits->bi_offset, bits->bi_len, blk, GFS2_BLKST_DINODE);
+		if(blk != BFITNOENT){
+			*block = blk + (bits->bi_start * GFS2_NBBY) +
+				rgd->ri.ri_data0;
+			break;
+		}
+		blk = 0;
+	}
+	if (i == length)
+		return -1;
+	return 0;
+}
+
+static int next_rg_metatype(struct gfs2_sbd *sdp, struct rgrp_tree *rgd,
+                            uint64_t *block, uint32_t type, int first)
+{
+	struct gfs2_buffer_head *bh = NULL;
+
+	do{
+		if (bh)
+			brelse(bh);
+		if (next_rg_meta(rgd, block, first))
+			return -1;
+		bh = bread(sdp, *block);
+		first = 0;
+	} while(gfs2_check_meta(bh, type));
+	brelse(bh);
+	return 0;
+}
+
 /* ------------------------------------------------------------------------- */
 /* inode_renumber - renumber the inodes                                      */
 /*                                                                           */
@@ -1046,7 +1096,7 @@ static int inode_renumber(struct gfs2_sbd *sbp, uint64_t root_inode_addr, osi_li
 			/* be "11" (used meta) for both inodes and indirect blocks.     */
 			/* We need to process the inodes and change the indirect blocks */
 			/* to have a bitmap type of "01" (data).                        */
-			if (gfs2_next_rg_metatype(sbp, rgd, &block, 0, first))
+			if (next_rg_metatype(sbp, rgd, &block, 0, first))
 				break;
 			/* If this is the root inode block, remember it for later: */
 			if (block == root_inode_addr) {
diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index 4856181..281be5a 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -1569,6 +1569,31 @@ static uint64_t find_metablockoftype_slow(uint64_t startblk, int metatype, int p
 	return blk;
 }
 
+static int find_rg_metatype(struct rgrp_tree *rgd, uint64_t *blk, uint64_t startblk, int mtype)
+{
+	int found;
+	unsigned i, j, m;
+	struct gfs2_buffer_head *bhp = NULL;
+	uint64_t *ibuf = malloc(sbd.bsize * GFS2_NBBY * sizeof(uint64_t));
+
+	for (i = 0; i < rgd->ri.ri_length; i++) {
+		m = lgfs2_bm_scan(rgd, i, ibuf, GFS2_BLKST_DINODE);
+
+		for (j = 0; j < m; j++) {
+			*blk = ibuf[j];
+			bhp = bread(&sbd, *blk);
+			found = (*blk > startblk) && !gfs2_check_meta(bhp, mtype);
+			brelse(bhp);
+			if (found) {
+				free(ibuf);
+				return 0;
+			}
+		}
+	}
+	free(ibuf);
+	return -1;
+}
+
 /* ------------------------------------------------------------------------ */
 /* Find next "metadata in use" block AFTER a given point in the fs          */
 /*                                                                          */
@@ -1578,7 +1603,7 @@ static uint64_t find_metablockoftype_slow(uint64_t startblk, int metatype, int p
 /* ------------------------------------------------------------------------ */
 static uint64_t find_metablockoftype_rg(uint64_t startblk, int metatype, int print)
 {
-	struct osi_node *n, *next = NULL;
+	struct osi_node *next = NULL;
 	uint64_t blk, errblk;
 	int first = 1, found = 0;
 	struct rgrp_tree *rgd;
@@ -1586,9 +1611,8 @@ static uint64_t find_metablockoftype_rg(uint64_t startblk, int metatype, int pri
 
 	blk = 0;
 	/* Skip the rgs prior to the block we've been given */
-	for (n = osi_first(&sbd.rgtree); n; n = next) {
-		next = osi_next(n);
-		rgd = (struct rgrp_tree *)n;
+	for (next = osi_first(&sbd.rgtree); next; next = osi_next(next)) {
+		rgd = (struct rgrp_tree *)next;
 		ri = &rgd->ri;
 		if (first && startblk <= ri->ri_data0) {
 			startblk = ri->ri_data0;
@@ -1607,25 +1631,19 @@ static uint64_t find_metablockoftype_rg(uint64_t startblk, int metatype, int pri
 		if (print)
 			exit(-1);
 	}
-	for (; !found && n; n = next){
-		next = osi_next(n);
-		rgd = (struct rgrp_tree *)n;
+	for (; !found && next; next = osi_next(next)){
+		rgd = (struct rgrp_tree *)next;
 		errblk = gfs2_rgrp_read(&sbd, rgd);
 		if (errblk)
 			continue;
-		first = 1;
-		do {
-			if (gfs2_next_rg_metatype(&sbd, rgd, &blk, metatype,
-						  first))
-				break;
-			if (blk > startblk) {
-				found = 1;
-				break;
-			}
-			first = 0;
-		} while (blk <= startblk);
+
+		found = !find_rg_metatype(rgd, &blk, startblk, metatype);
+		if (found)
+			break;
+
 		gfs2_rgrp_relse(rgd);
 	}
+
 	if (!found)
 		blk = 0;
 	if (print) {
diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index cfe18eb..986fdbe 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -635,43 +635,34 @@ static void get_journal_inode_blocks(void)
 	}
 }
 
-static int next_rg_freemeta(struct gfs2_sbd *sdp, struct rgrp_tree *rgd,
-			    uint64_t *nrfblock, int first)
+static void save_allocated(struct rgrp_tree *rgd, struct metafd *mfd)
 {
-	struct gfs2_bitmap *bits = NULL;
-	uint32_t length = rgd->ri.ri_length;
-	uint32_t blk = (first)? 0: (uint32_t)((*nrfblock+1)-rgd->ri.ri_data0);
-	int i;
-	struct gfs2_buffer_head *lbh;
+	int blktype;
+	unsigned i, j, m;
+	uint64_t *ibuf = malloc(sbd.bsize * GFS2_NBBY * sizeof(uint64_t));
 
-	if(!first && (*nrfblock < rgd->ri.ri_data0)) {
-		log_err("next_rg_freemeta:  Start block is outside rgrp "
-			"bounds.\n");
-		exit(1);
-	}
-	for(i=0; i < length; i++){
-		bits = &rgd->bits[i];
-		if(blk < bits->bi_len*GFS2_NBBY)
-			break;
-		blk -= bits->bi_len*GFS2_NBBY;
-	}
-	for(; i < length; i++){
-		bits = &rgd->bits[i];
-		lbh = bread(sdp, rgd->ri.ri_addr + i);
-		blk = gfs2_bitfit((unsigned char *)lbh->b_data +
-				  bits->bi_offset, bits->bi_len, blk,
-				  GFS2_BLKST_UNLINKED);
-		brelse(lbh);
-		if(blk != BFITNOENT){
-			*nrfblock = blk + (bits->bi_start * GFS2_NBBY) +
-				rgd->ri.ri_data0;
-			break;
+	for (i = 0; i < rgd->ri.ri_length; i++) {
+		m = lgfs2_bm_scan(rgd, i, ibuf, GFS2_BLKST_DINODE);
+
+		for (j = 0; j < m; j++) {
+			block = ibuf[j];
+			warm_fuzzy_stuff(block, FALSE);
+			blktype = save_block(sbd.device_fd, mfd, block);
+			if (blktype == GFS2_METATYPE_DI)
+				save_inode_data(mfd);
+		}
+
+		if (!sbd.gfs1)
+			continue;
+
+		/* For gfs1, Save off the free/unlinked meta blocks too.
+		 * If we don't, we may run into metadata allocation issues. */
+		m = lgfs2_bm_scan(rgd, i, ibuf, GFS2_BLKST_UNLINKED);
+		for (j = 0; j < m; j++) {
+			blktype = save_block(sbd.device_fd, mfd, block);
 		}
-		blk=0;
 	}
-	if(i == length)
-		return -1;
-	return 0;
+	free(ibuf);
 }
 
 void savemeta(char *out_fn, int saveoption, int gziplevel)
@@ -771,7 +762,6 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
 	}
 	/* Walk through the resource groups saving everything within */
 	for (n = osi_first(&sbd.rgtree); n; n = next) {
-		int first;
 		struct rgrp_tree *rgd;
 
 		next = osi_next(n);
@@ -782,33 +772,15 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
 			  (unsigned long long)rgd->ri.ri_addr,
 			  (unsigned long long)rgd->ri.ri_addr,
 			  rgd->ri.ri_length);
-		first = 1;
 		/* Save off the rg and bitmaps */
 		for (block = rgd->ri.ri_addr;
 		     block < rgd->ri.ri_data0; block++) {
 			warm_fuzzy_stuff(block, FALSE);
 			save_block(sbd.device_fd, &mfd, block);
 		}
-		/* Save off the other metadata: inodes, etc. */
+		/* Save off the other metadata: inodes, etc. if mode is not 'savergs' */
 		if (saveoption != 2) {
-			int blktype;
-
-			while (!gfs2_next_rg_meta(rgd, &block, first)){
-				warm_fuzzy_stuff(block, FALSE);
-				blktype = save_block(sbd.device_fd, &mfd,
-						     block);
-				if (blktype == GFS2_METATYPE_DI)
-					save_inode_data(&mfd);
-				first = 0;
-			}
-			/* Save off the free/unlinked meta blocks too.
-			   If we don't, we may run into metadata
-			   allocation issues. */
-			while (!next_rg_freemeta(&sbd, rgd, &block, first)) {
-				blktype = save_block(sbd.device_fd,
-						     &mfd, block);
-				first = 0;
-			}
+			save_allocated(rgd, &mfd);
 		}
 		gfs2_rgrp_relse(rgd);
 	}
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 8dd8210..7d2d9ff 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -756,11 +756,6 @@ extern int do_init_statfs(struct gfs2_sbd *sdp);
 extern int gfs2_check_meta(struct gfs2_buffer_head *bh, int type);
 extern unsigned lgfs2_bm_scan(struct rgrp_tree *rgd, unsigned idx,
 			      uint64_t *buf, uint8_t state);
-extern int gfs2_next_rg_meta(struct rgrp_tree *rgd, uint64_t *block,
-			     int first);
-extern int gfs2_next_rg_metatype(struct gfs2_sbd *sdp, struct rgrp_tree *rgd,
-				 uint64_t *block, uint32_t type, int first);
-
 /* super.c */
 extern int check_sb(struct gfs2_sb *sb);
 extern int read_sb(struct gfs2_sbd *sdp);
diff --git a/gfs2/libgfs2/structures.c b/gfs2/libgfs2/structures.c
index c60f3e4..46fd8df 100644
--- a/gfs2/libgfs2/structures.c
+++ b/gfs2/libgfs2/structures.c
@@ -512,79 +512,3 @@ unsigned lgfs2_bm_scan(struct rgrp_tree *rgd, unsigned idx, uint64_t *buf, uint8
 
 	return n;
 }
-
-/**
- * gfs2_next_rg_meta
- * @rgd:
- * @block:
- * @first: if set, start at zero and ignore block
- *
- * The position to start looking from is *block.  When a block
- * is found, it is returned in block.
- *
- * Returns: 0 on success, -1 when finished
- */
-static int __gfs2_next_rg_meta(struct rgrp_tree *rgd, uint64_t *block,
-			       int first, unsigned char state)
-{
-	struct gfs2_bitmap *bits = NULL;
-	uint32_t length = rgd->ri.ri_length;
-	uint32_t blk = (first)? 0: (uint32_t)((*block + 1) - rgd->ri.ri_data0);
-	int i;
-
-	if (!first && (*block < rgd->ri.ri_data0)) {
-		fprintf(stderr, "next_rg_meta:  Start block is outside rgrp bounds.\n");
-		exit(1);
-	}
-	for (i = 0; i < length; i++){
-		bits = &rgd->bits[i];
-		if (blk < bits->bi_len * GFS2_NBBY)
-			break;
-		blk -= bits->bi_len * GFS2_NBBY;
-	}
-	for (; i < length; i++){
-		bits = &rgd->bits[i];
-		blk = gfs2_bitfit((unsigned char *)rgd->bh[i]->b_data +
-				  bits->bi_offset, bits->bi_len, blk, state);
-		if(blk != BFITNOENT){
-			*block = blk + (bits->bi_start * GFS2_NBBY) +
-				rgd->ri.ri_data0;
-			break;
-		}
-		blk = 0;
-	}
-	if (i == length)
-		return -1;
-	return 0;
-}
-
-int gfs2_next_rg_meta(struct rgrp_tree *rgd, uint64_t *block, int first)
-{
-	return __gfs2_next_rg_meta(rgd, block, first, GFS2_BLKST_DINODE);
-}
-
-/**
- * next_rg_metatype
- * @rgd:
- * @block:
- * @type: the type of metadata we're looking for
- * @first: if set we should start at block zero and block is ignored
- *
- * Returns: 0 on success, -1 on error or finished
- */
-int gfs2_next_rg_metatype(struct gfs2_sbd *sdp, struct rgrp_tree *rgd,
-			  uint64_t *block, uint32_t type, int first)
-{
-	struct gfs2_buffer_head *bh = NULL;
-
-	do{
-		if (bh)
-			brelse(bh);
-		if (gfs2_next_rg_meta(rgd, block, first))
-			return -1;
-		bh = bread(sdp, *block);
-		first = 0;
-	} while(gfs2_check_meta(bh, type));
-	brelse(bh);
-	return 0;
-}


More information about the cluster-commits mailing list