[Cluster-devel] [GFS2 Patch] bz 450641 - fix gfs2 block allocation

Benjamin Marzinski bmarzins at redhat.com
Tue Jun 17 22:06:05 UTC 2008


This patch fixes bz 450641.

This patch changes the computation for zero_metapath_length(). When you
are
extending the metadata tree, The indirect blocks that point to the new
data
block must either diverge from the existing tree either at the inode, or
at the
first indirect block. They can diverge at the first indirect block
because the
inode has room for 483 pointers while the indirect blocks have room for
509
pointers, so when the tree is grown, there is some free space in the
first
indirect block. What zero_metapath_length now computes is the height
where the
first indirect block for the new data block is located.  It can either
be 1 (if
the indirect block diverges from the inode) or 2 (if it diverges from
the first
indirect block).

The previous computation for this was incorrect.

-Ben

Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
---
 bmap.c |    9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

-------------- next part --------------
Index: gfs2-2.6-nmw/fs/gfs2/bmap.c
===================================================================
--- gfs2-2.6-nmw.orig/fs/gfs2/bmap.c
+++ gfs2-2.6-nmw/fs/gfs2/bmap.c
@@ -249,12 +249,9 @@ static void find_metapath(const struct g
 static inline unsigned int zero_metapath_length(const struct metapath *mp,
 						unsigned height)
 {
-	unsigned int i;
-	for (i = 0; i < height - 1; i++) {
-		if (mp->mp_list[i] != 0)
-			return i;
-	}
-	return height;
+	if (mp->mp_list[0] == 0)
+		return 2;
+	return 1;
 }
 
 /**


More information about the Cluster-devel mailing list