[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

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



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 redhat com>
---
 bmap.c |    9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

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

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]