cluster: RHEL6 - Revert "gfs2_edit savemeta doesn't save all leaf blocks for large dirs"

Fabio M. Di Nitto fabbione at fedoraproject.org
Fri May 27 03:04:54 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=805b1f45df9de96b07eeb1708f8d3f5c4822292d
Commit:        805b1f45df9de96b07eeb1708f8d3f5c4822292d
Parent:        0ce6e0039cd6410a749842e0d963bfa9cdefe950
Author:        Fabio M. Di Nitto <fdinitto at redhat.com>
AuthorDate:    Fri May 27 05:04:06 2011 +0200
Committer:     Fabio M. Di Nitto <fdinitto at redhat.com>
CommitterDate: Fri May 27 05:04:06 2011 +0200

Revert "gfs2_edit savemeta doesn't save all leaf blocks for large dirs"

This reverts commit 0ce6e0039cd6410a749842e0d963bfa9cdefe950.

RHEL6 branch is not ready for 6.2 work yet.
---
 gfs2/edit/savemeta.c |   28 +++++++++-------------------
 1 files changed, 9 insertions(+), 19 deletions(-)

diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index 7840e03..655a3bc 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -116,8 +116,9 @@ static int get_gfs_struct_info(struct gfs2_buffer_head *lbh, int *block_type,
 			inode = inode_get(&sbd, lbh);
 		else
 			inode = gfs_inode_get(&sbd, lbh);
-		if (S_ISDIR(inode->i_di.di_mode) ||
-		     (gfs1 && inode->i_di.__pad1 == GFS_FILE_DIR))
+		if (inode->i_di.di_flags & GFS2_DIF_EXHASH &&
+		    (S_ISDIR(inode->i_di.di_mode) ||
+		     (gfs1 && inode->i_di.__pad1 == GFS_FILE_DIR)))
 			*gstruct_len = sbd.bsize;
 		else if (!inode->i_di.di_height && !block_is_systemfile() &&
 			 !S_ISDIR(inode->i_di.di_mode))
@@ -369,8 +370,8 @@ static void save_inode_data(int out_fd)
 	    (S_ISDIR(inode->i_di.di_mode) ||
 	     (gfs1 && inode->i_di.__pad1 == GFS_FILE_DIR)))
 		height++;
-	else if (height && !block_is_systemfile() &&
-		 !S_ISDIR(inode->i_di.di_mode))
+	else if (height && !(inode->i_di.di_flags & GFS2_DIF_SYSTEM) &&
+		 !block_is_systemfile() && !S_ISDIR(inode->i_di.di_mode))
 		height--;
 	osi_list_add(&metabh->b_altlist, &metalist[0]);
         for (i = 1; i <= height; i++){
@@ -395,21 +396,10 @@ static void save_inode_data(int out_fd)
 		}
 	}
 	/* Process directory exhash inodes */
-	if (S_ISDIR(inode->i_di.di_mode) &&
-	    inode->i_di.di_flags & GFS2_DIF_EXHASH) {
-		uint64_t  leaf_no, old_leaf = -1;
-		int li;
-
-		for (li = 0; li < (1 << inode->i_di.di_depth); li++) {
-			gfs2_get_leaf_nr(inode, li, &leaf_no);
-			if (leaf_no == old_leaf ||
-			    gfs2_check_range(&sbd, leaf_no) != 0)
-				continue;
-			old_leaf = leaf_no;
-			mybh = bread(&sbd, leaf_no);
-			if (gfs2_check_meta(mybh, GFS2_METATYPE_LF) == 0)
-				save_block(sbd.device_fd, out_fd, leaf_no);
-			brelse(mybh);
+	if (S_ISDIR(inode->i_di.di_mode)) {
+		if (inode->i_di.di_flags & GFS2_DIF_EXHASH) {
+			save_indirect_blocks(out_fd, cur_list, metabh,
+					     height, 0);
 		}
 	}
 	if (inode->i_di.di_eattr) { /* if this inode has extended attributes */


More information about the cluster-commits mailing list