All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Price <anprice@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH] libgfs2: Remove gfs2_next_rg_meta
Date: Mon, 11 Mar 2013 16:09:34 +0000	[thread overview]
Message-ID: <513E01BE.5090906@redhat.com> (raw)
In-Reply-To: <1363017038.2698.24.camel@menhir>

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



      reply	other threads:[~2013-03-11 16:09 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=513E01BE.5090906@redhat.com \
    --to=anprice@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.