[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