cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* [Cluster-devel] [PATCH] libgfs2: Remove gfs2_next_rg_meta
@ 2013-03-11 15:25 Andrew Price
  2013-03-11 15:50 ` Steven Whitehouse
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Price @ 2013-03-11 15:25 UTC (permalink / raw)
  To: cluster-devel.redhat.com

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@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;
-}
-- 
1.8.1.4



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [Cluster-devel] [PATCH] libgfs2: Remove gfs2_next_rg_meta
  2013-03-11 15:25 [Cluster-devel] [PATCH] libgfs2: Remove gfs2_next_rg_meta Andrew Price
@ 2013-03-11 15:50 ` Steven Whitehouse
  2013-03-11 16:09   ` Andrew Price
  0 siblings, 1 reply; 3+ messages in thread
From: Steven Whitehouse @ 2013-03-11 15:50 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Hi,

Looks good. Also possibly an opportunity to add readahead to the
savemeta thing?

Steve.

On Mon, 2013-03-11 at 15:25 +0000, Andrew Price wrote:
> 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@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;
> -}




^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Cluster-devel] [PATCH] libgfs2: Remove gfs2_next_rg_meta
  2013-03-11 15:50 ` Steven Whitehouse
@ 2013-03-11 16:09   ` Andrew Price
  0 siblings, 0 replies; 3+ messages in thread
From: Andrew Price @ 2013-03-11 16:09 UTC (permalink / raw)
  To: cluster-devel.redhat.com

On 11/03/13 15:50, Steven Whitehouse wrote:
> Hi,
>
> Looks good. Also possibly an opportunity to add readahead to the
> savemeta thing?

Sure, sounds like a good plan. I'll give it a shot in a separate patch.

Andy

> Steve.
>
> On Mon, 2013-03-11 at 15:25 +0000, Andrew Price wrote:
>> 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@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;
>> -}
>
>



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-03-11 16:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-11 15:25 [Cluster-devel] [PATCH] libgfs2: Remove gfs2_next_rg_meta Andrew Price
2013-03-11 15:50 ` Steven Whitehouse
2013-03-11 16:09   ` Andrew Price

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).