From: Huajun Li <huajun...@intel.com> Normally we expect an empty partition after formatting by mkfs.f2fs. But in this case, when we format a dirty partition and mount it again. The former file will be recovered and available again! and kernel log shows a recovery procedure is evoked. This patch adds a new flag CP_EXIST_FLAG to indicate whether is a available CP, and do recovery only when this flag is set.
You can reproduce the bug by following script: =================================== TEST_DEV=/dev/sdb1 umount $TEST_DEV mkfs.f2fs $TEST_DEV > /dev/null mount -t f2fs $TEST_DEV /mnt dmesg -c > /dev/null echo echo "Small Vector Sync" echo "abcdefghijklmnopqrstuvwxyz" > /mnt/small_vector_async xfs_io -F -f -s -c "pread -v 0 1"\ -c "pwrite -S 0x61 4090 1"\ /mnt/small_vector_async umount $TEST_DEV mkfs.f2fs $TEST_DEV #After we format a partition, there should be nothing but root in it. #But in this case, when we format a used partition and mount it again, #the former created file small_vector_async will be recover! mount -t f2fs $TEST_DEV /mnt #We expect nothing after mkfs, but in this case small_vector_async will #be recovered when we mount the partition. ls /mnt dmesg Signed-off-by: Huajun Li <huajun...@intel.com> Reported-and-tested-by: Weihong Xu <weihong...@intel.com> --- fs/f2fs/checkpoint.c | 2 ++ fs/f2fs/super.c | 3 ++- include/linux/f2fs_fs.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index d430157..22b3972 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -767,6 +767,8 @@ static void do_checkpoint(struct f2fs_sb_info *sbi, bool is_umount) clear_prefree_segments(sbi); F2FS_RESET_SB_DIRT(sbi); } + if (!is_set_ckpt_flags(ckpt, CP_EXIST_FLAG)) + set_ckpt_flags(ckpt, CP_EXIST_FLAG); } /* diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index e42351c..963da7d 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -959,7 +959,8 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) } /* recover fsynced data */ - if (!test_opt(sbi, DISABLE_ROLL_FORWARD)) { + if (!test_opt(sbi, DISABLE_ROLL_FORWARD) && + is_set_ckpt_flags(F2FS_CKPT(sbi), CP_EXIST_FLAG)) { err = recover_fsync_data(sbi); if (err) f2fs_msg(sb, KERN_ERR, diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index bb942f6..6e48f22 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h @@ -80,6 +80,7 @@ struct f2fs_super_block { /* * For checkpoint */ +#define CP_EXIST_FLAG 0x00000010 #define CP_ERROR_FLAG 0x00000008 #define CP_COMPACT_SUM_FLAG 0x00000004 #define CP_ORPHAN_PRESENT_FLAG 0x00000002 -- 1.7.9.5 ------------------------------------------------------------------------------ Android is increasing in popularity, but the open development platform that developers love is also attractive to malware creators. Download this white paper to learn more about secure code signing practices that can help keep Android apps secure. http://pubads.g.doubleclick.net/gampad/clk?id=65839951&iu=/4140/ostg.clktrk _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel