All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] fsck.f2fs: avoid build warnings
@ 2014-09-03  5:03 Jaegeuk Kim
  2014-09-03  5:03 ` [PATCH 2/2] fsck.f2fs: add auto_fix feature Jaegeuk Kim
  0 siblings, 1 reply; 2+ messages in thread
From: Jaegeuk Kim @ 2014-09-03  5:03 UTC (permalink / raw)
  To: linux-f2fs-devel; +Cc: Jaegeuk Kim

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
 fsck/dump.c |  4 ++--
 fsck/fsck.c | 10 ++++++----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/fsck/dump.c b/fsck/dump.c
index 54f9a52..4bb906f 100644
--- a/fsck/dump.c
+++ b/fsck/dump.c
@@ -140,8 +140,8 @@ static void dump_node_blk(struct f2fs_sb_info *sbi, int ntype,
 {
 	struct node_info ni;
 	struct f2fs_node *node_blk;
-	u32 idx, skip = 0;
-	int i;
+	u32 skip = 0;
+	u32 i, idx;
 
 	switch (ntype) {
 	case TYPE_DIRECT_NODE:
diff --git a/fsck/fsck.c b/fsck/fsck.c
index 560b541..3fd9784 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -454,12 +454,13 @@ check:
 				(u32)i_blocks);
 
 	if (i_blocks != *blk_cnt) {
-		ASSERT_MSG("ino: 0x%x has i_blocks: %lu, but has %u blocks",
+		ASSERT_MSG("ino: 0x%x has i_blocks: %08"PRIx64", "
+				"but has %u blocks",
 				nid, i_blocks, *blk_cnt);
 		if (config.fix_cnt) {
 			node_blk->i.i_blocks = cpu_to_le64(*blk_cnt);
 			need_fix = 1;
-			FIX_MSG("[0x%x] i_blocks=0x%lx -> 0x%x",
+			FIX_MSG("[0x%x] i_blocks=0x%08"PRIx64" -> 0x%x",
 					nid, i_blocks, *blk_cnt);
 		}
 	}
@@ -788,7 +789,7 @@ void fsck_init(struct f2fs_sb_info *sbi)
 static void fix_nat_entries(struct f2fs_sb_info *sbi)
 {
 	struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
-	int i;
+	u32 i;
 
 	for (i = 0; i < fsck->nr_nat_entries; i++)
 		if (f2fs_test_bit(i, fsck->nat_area_bitmap) != 0)
@@ -801,7 +802,8 @@ static void fix_checkpoint(struct f2fs_sb_info *sbi)
 	struct f2fs_super_block *raw_sb = sbi->raw_super;
 	struct f2fs_checkpoint *ckp = F2FS_CKPT(sbi);
 	unsigned long long cp_blk_no;
-	int i, ret;
+	u32 i;
+	int ret;
 	u_int32_t crc = 0;
 
 	ckp->ckpt_flags = cpu_to_le32(CP_UMOUNT_FLAG);
-- 
1.8.5.2 (Apple Git-48)


------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCH 2/2] fsck.f2fs: add auto_fix feature
  2014-09-03  5:03 [PATCH 1/2] fsck.f2fs: avoid build warnings Jaegeuk Kim
@ 2014-09-03  5:03 ` Jaegeuk Kim
  0 siblings, 0 replies; 2+ messages in thread
From: Jaegeuk Kim @ 2014-09-03  5:03 UTC (permalink / raw)
  To: linux-f2fs-devel; +Cc: Jaegeuk Kim

This patch adds an auto_fix feature which fixes inconsistency of f2fs images.

E.g.,

With this option, -a, fsck.f2fs tries to fix inconsistency only if its valid
checkpoint has CP_FSCK_FLAG, written by previous bug_on cases.

So, normally it does fix nothing, so that there is no performance regression.
But, if a sort of corruption was reported by the f2fs module, this tries to
fix potential corrupted partition.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
 fsck/main.c       | 26 ++++++++++++++++----------
 fsck/mount.c      | 14 +++++++++++++-
 include/f2fs_fs.h |  2 ++
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/fsck/main.c b/fsck/main.c
index 7e3bb49..e20eac2 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -40,23 +40,27 @@ void f2fs_parse_options(int argc, char *argv[])
 	char *prog = basename(argv[0]);
 
 	if (!strcmp("fsck.f2fs", prog)) {
-		const char *option_string = "d:tf";
+		const char *option_string = "ad:ft";
 
 		config.func = FSCK;
 		while ((option = getopt(argc, argv, option_string)) != EOF) {
 			switch (option) {
+			case 'a':
+				config.auto_fix = 1;
+				MSG(0, "Info: Fix the reported corruption.\n");
+				break;
 			case 'd':
 				config.dbg_lv = atoi(optarg);
 				MSG(0, "Info: Debug level = %d\n",
 							config.dbg_lv);
 				break;
-			case 't':
-				config.dbg_lv = -1;
-				break;
 			case 'f':
 				config.fix_on = 1;
 				MSG(0, "Info: Force to fix corruption\n");
 				break;
+			case 't':
+				config.dbg_lv = -1;
+				break;
 			default:
 				MSG(0, "\tError: Unknown option %c\n", option);
 				fsck_usage();
@@ -135,8 +139,6 @@ static void do_fsck(struct f2fs_sb_info *sbi)
 {
 	u32 blk_cnt;
 
-	config.bug_on = 0;
-
 	fsck_init(sbi);
 
 	fsck_chk_orphan_node(sbi);
@@ -192,7 +194,12 @@ fsck_again:
 	gfsck.sbi.fsck = &gfsck;
 	sbi = &gfsck.sbi;
 
-	if (f2fs_do_mount(sbi) < 0)
+	ret = f2fs_do_mount(sbi);
+	if (ret == 1) {
+		free(sbi->ckpt);
+		free(sbi->raw_super);
+		goto out;
+	} else if (ret < 0)
 		return -1;
 
 	switch (config.func) {
@@ -205,9 +212,9 @@ fsck_again:
 	}
 
 	f2fs_do_umount(sbi);
-
+out:
 	if (config.func == FSCK && config.bug_on) {
-		if (config.fix_on == 0) {
+		if (config.fix_on == 0 && !config.auto_fix) {
 			char ans[255] = {0};
 retry:
 			printf("Do you want to fix this partition? [Y/N] ");
@@ -226,7 +233,6 @@ retry:
 		if (config.fix_cnt > 0 && config.fix_cnt < 4)
 			goto fsck_again;
 	}
-
 	f2fs_finalize_device(&config);
 
 	printf("\nDone.\n");
diff --git a/fsck/mount.c b/fsck/mount.c
index 2bbd3c5..5a12bb1 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -1183,6 +1183,7 @@ void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
 int f2fs_do_mount(struct f2fs_sb_info *sbi)
 {
 	int ret;
+
 	sbi->active_logs = NR_CURSEG_TYPE;
 	ret = validate_super_block(sbi, 0);
 	if (ret) {
@@ -1208,6 +1209,17 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
 
 	print_ckpt_info(sbi);
 
+	if (config.auto_fix) {
+		u32 flag = le32_to_cpu(sbi->ckpt->ckpt_flags);
+
+		if (flag & CP_FSCK_FLAG)
+			config.fix_cnt = 1;
+		else
+			return 1;
+	}
+
+	config.bug_on = 0;
+
 	sbi->total_valid_node_count = le32_to_cpu(sbi->ckpt->valid_node_count);
 	sbi->total_valid_inode_count =
 			le32_to_cpu(sbi->ckpt->valid_inode_count);
@@ -1227,7 +1239,7 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
 		return -1;
 	}
 
-	return ret;
+	return 0;
 }
 
 void f2fs_do_umount(struct f2fs_sb_info *sbi)
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 7242690..6467791 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -185,6 +185,7 @@ struct f2fs_configuration {
 	int fix_on;
 	int fix_cnt;
 	int bug_on;
+	int auto_fix;
 } __attribute__((packed));
 
 #ifdef CONFIG_64BIT
@@ -290,6 +291,7 @@ struct f2fs_super_block {
 /*
  * For checkpoint
  */
+#define CP_FSCK_FLAG		0x00000010
 #define CP_ERROR_FLAG		0x00000008
 #define CP_COMPACT_SUM_FLAG	0x00000004
 #define CP_ORPHAN_PRESENT_FLAG	0x00000002
-- 
1.8.5.2 (Apple Git-48)


------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-09-03  5:03 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-03  5:03 [PATCH 1/2] fsck.f2fs: avoid build warnings Jaegeuk Kim
2014-09-03  5:03 ` [PATCH 2/2] fsck.f2fs: add auto_fix feature Jaegeuk Kim

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.