From mboxrd@z Thu Jan 1 00:00:00 1970 From: Benjamin Marzinski Date: Tue, 17 Jun 2008 17:06:05 -0500 Subject: [Cluster-devel] [GFS2 Patch] bz 450641 - fix gfs2 block allocation Message-ID: <20080617220605.GA18264@ether.msp.redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 --- 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; } /**