[Ocfs2-tools-devel] [PATCH 1/1] fsck.ocfs2: Reinitialize o2fsck_state when we reset fs_blocks.

Tao Ma tao.ma at oracle.com
Mon Jul 28 14:17:01 PDT 2008


Hi joel,
	You are right, here is the revised patch. Please review. Thanks.

In fsck.ocfs2, when we find fs_blocks in super block isn't the
same as the number stored in global_bitmap, we choose to trust
global_bitmap. In this case, we have to reinitialize the bitmap
in o2fsck_state since they are fs_blocks based. This bug blocks
the test case of fsck-test.sh in ocfs2-test.

Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
 fsck.ocfs2/fsck.c         |   34 ++++++++++++++++++++++++++++++++++
 fsck.ocfs2/include/fsck.h |    2 ++
 fsck.ocfs2/pass0.c        |    6 ++++++
 fsck.ocfs2/pass1.c        |    2 +-
 4 files changed, 43 insertions(+), 1 deletions(-)

diff --git a/fsck.ocfs2/fsck.c b/fsck.ocfs2/fsck.c
index 4d6070b..6669e56 100644
--- a/fsck.ocfs2/fsck.c
+++ b/fsck.ocfs2/fsck.c
@@ -73,6 +73,8 @@ static char *whoami = "fsck.ocfs2";
 static o2fsck_state _ost;
 static int cluster_locked = 0;
 
+static void mark_magical_clusters(o2fsck_state *ost);
+
 static void handle_signal(int sig)
 {
 	switch (sig) {
@@ -194,6 +196,38 @@ static errcode_t o2fsck_state_init(ocfs2_filesys *fs, o2fsck_state *ost)
 	return 0;
 }
 
+errcode_t o2fsck_state_reinit(ocfs2_filesys *fs, o2fsck_state *ost)
+{
+	errcode_t ret;
+
+	ocfs2_bitmap_free(ost->ost_bad_inodes);
+	ost->ost_bad_inodes = NULL;
+
+	ocfs2_bitmap_free(ost->ost_dir_inodes);
+	ost->ost_dir_inodes = NULL;
+
+	ocfs2_bitmap_free(ost->ost_reg_inodes);
+	ost->ost_reg_inodes = NULL;
+
+	ocfs2_bitmap_free(ost->ost_allocated_clusters);
+	ost->ost_allocated_clusters = NULL;
+
+	o2fsck_icount_free(ost->ost_icount_in_inodes);
+	ost->ost_icount_in_inodes = NULL;
+
+	o2fsck_icount_free(ost->ost_icount_refs);
+	ost->ost_icount_refs = NULL;
+
+	ret = o2fsck_state_init(fs, ost);
+	if (ret) {
+		com_err(whoami, ret, "while intializing o2fsck_state.");
+		return ret;
+	}
+
+	mark_magical_clusters(ost);
+	return 0;
+}
+
 static errcode_t check_superblock(o2fsck_state *ost)
 {
 	struct ocfs2_dinode *di = ost->ost_fs->fs_super;
diff --git a/fsck.ocfs2/include/fsck.h b/fsck.ocfs2/include/fsck.h
index f3a8105..eccd7ab 100644
--- a/fsck.ocfs2/include/fsck.h
+++ b/fsck.ocfs2/include/fsck.h
@@ -73,6 +73,8 @@ typedef struct _o2fsck_state {
 			ost_fix_fs_gen:1;
 } o2fsck_state;
 
+errcode_t o2fsck_state_reinit(ocfs2_filesys *fs, o2fsck_state *ost);
+
 /* The idea is to let someone off-site run fsck and have it give us 
  * enough information to diagnose problems with */
 extern int verbose;
diff --git a/fsck.ocfs2/pass0.c b/fsck.ocfs2/pass0.c
index 68dd930..90c0ef9 100644
--- a/fsck.ocfs2/pass0.c
+++ b/fsck.ocfs2/pass0.c
@@ -1100,6 +1100,12 @@ errcode_t o2fsck_pass0(o2fsck_state *ost)
 			fs->fs_clusters = di->i_clusters;
 			fs->fs_blocks = ocfs2_clusters_to_blocks(fs,
 							 fs->fs_clusters);
+			ret = o2fsck_state_reinit(fs, ost);
+			if (ret) {
+				com_err(whoami, ret, "while reinit "
+					"o2fsck_state.");
+				goto out;
+			}
 		}
 	}
 
diff --git a/fsck.ocfs2/pass1.c b/fsck.ocfs2/pass1.c
index 175ac38..dddc1f9 100644
--- a/fsck.ocfs2/pass1.c
+++ b/fsck.ocfs2/pass1.c
@@ -762,7 +762,7 @@ static errcode_t o2fsck_check_blocks(ocfs2_filesys *fs, o2fsck_state *ost,
 				     uint64_t blkno, struct ocfs2_dinode *di)
 {
 	uint64_t expected = 0, unexpected = 0;
-	errcode_t ret;
+	errcode_t ret = 0;
 	struct verifying_blocks vb = {
 		.vb_ost = ost,
 		.vb_di = di,
-- 
1.5.4.GIT




More information about the Ocfs2-tools-devel mailing list