[Ocfs2-tools-devel] [PATCH 4/6] fsck.ocfs2: Add the clear journal flag function.v4

Tao Ma tao.ma at oracle.com
Tue Oct 7 00:29:02 PDT 2008


Add the clear journal flag function in fsck.ocfs2.

Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
 fsck.ocfs2/fsck.c            |    7 +++++--
 fsck.ocfs2/include/fsck.h    |    3 ++-
 fsck.ocfs2/include/journal.h |    4 +++-
 fsck.ocfs2/journal.c         |   38 +++++++++++++++++++++++++++++++++++++-
 4 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/fsck.ocfs2/fsck.c b/fsck.ocfs2/fsck.c
index 6669e56..ed275a3 100644
--- a/fsck.ocfs2/fsck.c
+++ b/fsck.ocfs2/fsck.c
@@ -449,12 +449,15 @@ static errcode_t maybe_replay_journals(o2fsck_state *ost, char *filename,
 				       int open_flags, uint64_t blkno,
 				       uint64_t blksize)
 {	
-	int replayed = 0, should = 0;
+	int replayed = 0, should = 0, has_dirty = 0;
 	errcode_t ret = 0;
 
-	ret = o2fsck_should_replay_journals(ost->ost_fs, &should);
+	ret = o2fsck_should_replay_journals(ost->ost_fs, &should, &has_dirty);
 	if (ret)
 		goto out;
+
+	ost->ost_has_journal_dirty = has_dirty ? 1 : 0;
+
 	if (!should)
 		goto out;
 
diff --git a/fsck.ocfs2/include/fsck.h b/fsck.ocfs2/include/fsck.h
index eccd7ab..eab7197 100644
--- a/fsck.ocfs2/include/fsck.h
+++ b/fsck.ocfs2/include/fsck.h
@@ -70,7 +70,8 @@ typedef struct _o2fsck_state {
  					  * errors as we exit */
  			ost_stale_mounts:1, /* set when reading publish blocks
  					     * that still indicated mounted */
-			ost_fix_fs_gen:1;
+			ost_fix_fs_gen:1,
+			ost_has_journal_dirty:1;
 } o2fsck_state;
 
 errcode_t o2fsck_state_reinit(ocfs2_filesys *fs, o2fsck_state *ost);
diff --git a/fsck.ocfs2/include/journal.h b/fsck.ocfs2/include/journal.h
index 46792ab..b9c6c46 100644
--- a/fsck.ocfs2/include/journal.h
+++ b/fsck.ocfs2/include/journal.h
@@ -27,7 +27,9 @@
 #include "fsck.h"
 
 errcode_t o2fsck_replay_journals(ocfs2_filesys *fs, int *replayed);
-errcode_t o2fsck_should_replay_journals(ocfs2_filesys *fs, int *should);
+errcode_t o2fsck_should_replay_journals(ocfs2_filesys *fs, int *should,
+					int *has_dirty);
+errcode_t o2fsck_clear_journal_flags(o2fsck_state *ost);
 errcode_t o2fsck_check_journals(o2fsck_state *ost);
 
 #endif /* __O2FSCK_JOURNAL_H__ */
diff --git a/fsck.ocfs2/journal.c b/fsck.ocfs2/journal.c
index 75f500b..9880bd4 100644
--- a/fsck.ocfs2/journal.c
+++ b/fsck.ocfs2/journal.c
@@ -516,7 +516,8 @@ out:
  * stop a second journal replay but leave the dirty bit set so that the kernel
  * will truncate the orphaned inodes. 
  */
-errcode_t o2fsck_should_replay_journals(ocfs2_filesys *fs, int *should)
+errcode_t o2fsck_should_replay_journals(ocfs2_filesys *fs, int *should,
+					int *has_dirty)
 {
 	uint16_t i, max_slots;
 	char *buf = NULL;
@@ -564,6 +565,8 @@ errcode_t o2fsck_should_replay_journals(ocfs2_filesys *fs, int *should)
 		verbosef("slot %d JOURNAL_DIRTY_FL: %d\n", i, is_dirty);
 		if (!is_dirty)
 			continue;
+		else
+			*has_dirty = 1;
 
 		ret = ocfs2_extent_map_get_blocks(cinode, 0, 1, &blkno,
 						  &contig, NULL);
@@ -804,3 +807,36 @@ out:
 	return ret;
 }
 
+static errcode_t ocfs2_clear_journal_flag(ocfs2_filesys *fs,
+					  struct ocfs2_dinode *di,
+					  int slot)
+{
+	errcode_t ret = 0;
+
+	if (!(di->i_flags & OCFS2_VALID_FL) ||
+	    !(di->i_flags & OCFS2_SYSTEM_FL) ||
+	    !(di->i_flags & OCFS2_JOURNAL_FL))
+		return OCFS2_ET_INVALID_ARGUMENT;
+
+	if (!(di->id1.journal1.ij_flags & OCFS2_JOURNAL_DIRTY_FL))
+		goto bail;
+
+	di->id1.journal1.ij_flags &= ~OCFS2_JOURNAL_DIRTY_FL;
+
+	ret = ocfs2_write_inode(fs, di->i_blkno, (char *)di);
+	if (!ret)
+		printf("Slot %d's journal dirty flag removed\n", slot);
+
+bail:
+	return ret;
+}
+
+errcode_t o2fsck_clear_journal_flags(o2fsck_state *ost)
+{
+	if (!ost->ost_has_journal_dirty)
+		return 0;
+
+	return handle_slots_system_file(ost->ost_fs,
+					JOURNAL_SYSTEM_INODE,
+					ocfs2_clear_journal_flag);
+}
-- 
1.5.4.GIT




More information about the Ocfs2-tools-devel mailing list