gfs2-utils: master - libgfs2: Don't release rgrp buffers which are still in use

Andrew Price andyp at fedoraproject.org
Tue Apr 9 17:53:31 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=6649ab418b25992eb707ab821f2fdcb317c27dd9
Commit:        6649ab418b25992eb707ab821f2fdcb317c27dd9
Parent:        b1b751868059ebc1188de3e13db1eadbb5ede16c
Author:        Andrew Price <anprice at redhat.com>
AuthorDate:    Tue Apr 9 18:41:22 2013 +0100
Committer:     Andrew Price <anprice at redhat.com>
CommitterDate: Tue Apr 9 18:48:33 2013 +0100

libgfs2: Don't release rgrp buffers which are still in use

lgfs2_dinode_alloc currently releases rgrp buffers unconditionally,
which breaks things for fsck.gfs2 which requires that they persist. This
patch moves the gfs2_rgrp_relse calls into blk_alloc_in_rg and only
releases the buffers when blk_alloc_in_rg itself allocated them.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/libgfs2/fs_ops.c |   23 ++++++++++++++++-------
 1 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/gfs2/libgfs2/fs_ops.c b/gfs2/libgfs2/fs_ops.c
index 4ea6dd3..51e6abf 100644
--- a/gfs2/libgfs2/fs_ops.c
+++ b/gfs2/libgfs2/fs_ops.c
@@ -122,6 +122,7 @@ static int blk_alloc_in_rg(struct gfs2_sbd *sdp, unsigned int type, struct rgrp_
 	struct gfs2_rgrp *rg;
 	unsigned int block, bn = 0, x = 0, y = 0;
 	unsigned int state;
+	unsigned int release = 0;
 	struct gfs2_buffer_head *bh;
 
 	if (rl == NULL || rl->rg.rg_free == 0) {
@@ -129,8 +130,11 @@ static int blk_alloc_in_rg(struct gfs2_sbd *sdp, unsigned int type, struct rgrp_
 		return -1;
 	}
 
-	if (rl->bh[0] == NULL && gfs2_rgrp_read(sdp, rl) != 0)
-		return -1;
+	if (rl->bh[0] == NULL) {
+		if (gfs2_rgrp_read(sdp, rl) != 0)
+			return -1;
+		release = 1;
+	}
 
 	ri = &rl->ri;
 	rg = &rl->rg;
@@ -149,7 +153,7 @@ static int blk_alloc_in_rg(struct gfs2_sbd *sdp, unsigned int type, struct rgrp_
 
 	fprintf(stderr, "allocation is broken (1): %"PRIu64" %u\n",
 	    (uint64_t)rl->ri.ri_addr, rl->rg.rg_free);
-	return -1;
+	goto out_err;
 
 found:
 	if (bn >= ri->ri_bitbytes * GFS2_NBBY) {
@@ -157,7 +161,7 @@ found:
 		    " (0x%" PRIx64 ") Free:%u\n",
 		    bn, ri->ri_bitbytes * GFS2_NBBY, (uint64_t)rl->ri.ri_addr,
 		    (uint64_t)rl->ri.ri_addr, rl->rg.rg_free);
-		return -1;
+		goto out_err;
 	}
 
 	switch (type) {
@@ -171,7 +175,7 @@ found:
 		break;
 	default:
 		fprintf(stderr, "bad state\n");
-		return -1;
+		goto out_err;
 	}
 
 	bh->b_data[x] &= ~(0x03 << (GFS2_BIT_SIZE * y));
@@ -186,7 +190,14 @@ found:
 
 	sdp->blks_alloced++;
 	*blkno = ri->ri_data0 + bn;
+	if (release)
+		gfs2_rgrp_relse(rl);
 	return 0;
+out_err:
+	if (release)
+		gfs2_rgrp_relse(rl);
+	return -1;
+
 }
 
 /**
@@ -251,8 +262,6 @@ int lgfs2_dinode_alloc(struct gfs2_sbd *sdp, const uint64_t blksreq, uint64_t *b
 		return -1;
 
 	ret = blk_alloc_in_rg(sdp, DINODE, rgt, blkno);
-	gfs2_rgrp_relse(rgt);
-
 	if (ret == 0)
 		sdp->dinodes_alloced++;
 


More information about the cluster-commits mailing list