[Ocfs2-tools-devel] [PATCH 3/6] Fix index of directories

Goldwyn Rodrigues rgoldwyn at gmail.com
Tue Aug 16 15:17:16 PDT 2011


In case the i_size of the directory changes, reset the dx_root of the
inode, so it may be later detected for index directory rebuilds. In
pass2, if the filesystem supports directory indexing, rebuild directory
indexes.

I used this method because otherwise we will have to bounce
dirblock_data struct between passes. The dirblock_data is used only in
pass1.

This also helps the patchset - avoiding EROFS on index dir corruptions.
http://oss.oracle.com/pipermail/ocfs2-devel/2011-August/008312.html

Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.de>
---
 fsck.ocfs2/extent.c |    5 +++++
 fsck.ocfs2/pass2.c  |   13 ++++++++++---
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/fsck.ocfs2/extent.c b/fsck.ocfs2/extent.c
index f53e54b..b58311d 100644
--- a/fsck.ocfs2/extent.c
+++ b/fsck.ocfs2/extent.c
@@ -459,6 +459,11 @@ errcode_t o2fsck_check_extents(o2fsck_state *ost,
 				(uint64_t)di->i_blkno,
 				(uint64_t)di->i_size, expected)) {
 			di->i_size = expected;
+			/* Reset i_dx_root for later re-build */
+			if (di->i_dyn_features & OCFS2_INDEXED_DIR_FL) {
+				di->i_dx_root = 0ULL;
+				di->i_dyn_features &= ~OCFS2_INDEXED_DIR_FL;
+			}
 			changed = 1;
 		}
 	}
diff --git a/fsck.ocfs2/pass2.c b/fsck.ocfs2/pass2.c
index 4b43a22..d1133b2 100644
--- a/fsck.ocfs2/pass2.c
+++ b/fsck.ocfs2/pass2.c
@@ -732,6 +732,13 @@ static unsigned
pass2_dir_block_iterate(o2fsck_dirblock_entry *dbe,
 		verbosef("dir inode %"PRIu64" i_size %"PRIu64"\n",
 			 dbe->e_ino, (uint64_t)di->i_size);

+		/* Set the flag for index rebuilding */
+		if (ocfs2_supports_indexed_dirs(OCFS2_RAW_SB(dd->fs->fs_super))
+			&& !(di->i_dyn_features & OCFS2_INLINE_DATA_FL)
+			&& !(di->i_dyn_features & OCFS2_INDEXED_DIR_FL)) {
+			ret_flags |= OCFS2_DIRENT_CHANGED;
+		}
+
 	}

 	verbosef("dir block %"PRIu64" block offs %"PRIu64" in ino\n",
@@ -896,9 +903,9 @@ next:
 			goto out;
 		}

-		if (ocfs2_supports_indexed_dirs(OCFS2_RAW_SB(dd->fs->fs_super)) &&
-		    !(di->i_dyn_features & OCFS2_INLINE_DATA_FL) &&
-		    (di->i_dyn_features  & OCFS2_INDEXED_DIR_FL)) {
+		if (ocfs2_supports_indexed_dirs(OCFS2_RAW_SB(dd->fs->fs_super))
+			&& !(di->i_dyn_features & OCFS2_INLINE_DATA_FL)) {
+			di->i_dyn_features |= OCFS2_INDEXED_DIR_FL;
 			ret = o2fsck_try_add_reidx_dir(&dd->re_idx_dirs, dbe->e_ino);
 			if (ret) {
 				com_err(whoami, ret, "while adding block for "
-- 
1.7.6



More information about the Ocfs2-tools-devel mailing list