This patch synchronize f2fs_inode structure from kernel side, in addition, it adds to check .i_gc_failures and do resetting in fsck.
Signed-off-by: Chao Yu <yuch...@huawei.com> --- fsck/dir.c | 5 ++++- fsck/fsck.c | 16 ++++++++++++++++ include/f2fs_fs.h | 8 +++++++- mkfs/f2fs_format.c | 2 +- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/fsck/dir.c b/fsck/dir.c index 567a4e9c9b83..98a0b7a89601 100644 --- a/fsck/dir.c +++ b/fsck/dir.c @@ -445,7 +445,10 @@ static void init_inode_block(struct f2fs_sb_info *sbi, node_blk->i.i_ctime_nsec = 0; node_blk->i.i_mtime_nsec = 0; node_blk->i.i_generation = 0; - node_blk->i.i_current_depth = cpu_to_le32(1); + if (de->file_type == F2FS_FT_DIR) + node_blk->i.i_current_depth = cpu_to_le32(1); + else + node_blk->i.i_current_depth = cpu_to_le32(0); node_blk->i.i_xattr_nid = 0; node_blk->i.i_flags = 0; node_blk->i.i_inline = F2FS_INLINE_XATTR; diff --git a/fsck/fsck.c b/fsck/fsck.c index 20a569228516..d550403e3e10 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -662,6 +662,7 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid, unsigned char *en; u32 namelen; unsigned int idx = 0; + unsigned short i_gc_failures; int need_fix = 0; int ret; @@ -939,6 +940,21 @@ skip_blkcnt_fix: } } + i_gc_failures = le16_to_cpu(node_blk->i.i_gc_failures); + if (ftype == F2FS_FT_REG_FILE && i_gc_failures) { + + DBG(1, "Regular Inode: 0x%x [%s] depth: %d\n\n", + le32_to_cpu(node_blk->footer.ino), en, + i_gc_failures); + + if (c.fix_on) { + node_blk->i.i_gc_failures = cpu_to_le16(0); + need_fix = 1; + FIX_MSG("Regular: 0x%x reset i_gc_failures from 0x%x to 0x00", + nid, i_gc_failures); + } + } + free(en); if (ftype == F2FS_FT_SYMLINK && i_blocks && i_size == 0) { diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index fe1e31ba1a46..53fa002c5520 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -788,7 +788,13 @@ struct f2fs_inode { __le32 i_ctime_nsec; /* change time in nano scale */ __le32 i_mtime_nsec; /* modification time in nano scale */ __le32 i_generation; /* file version (for NFS) */ - __le32 i_current_depth; /* only for directory depth */ + union { + __le32 i_current_depth; /* only for directory depth */ + __le16 i_gc_failures; /* + * # of gc failures on pinned file. + * only for regular files. + */ + }; __le32 i_xattr_nid; /* nid to save xattr */ __le32 i_flags; /* file attributes */ __le32 i_pino; /* parent inode number */ diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c index f2880eb06460..01a73e858d73 100644 --- a/mkfs/f2fs_format.c +++ b/mkfs/f2fs_format.c @@ -1251,7 +1251,7 @@ static int f2fs_write_qf_inode(int qtype) raw_node->i.i_generation = 0; raw_node->i.i_xattr_nid = 0; raw_node->i.i_flags = FS_IMMUTABLE_FL; - raw_node->i.i_current_depth = cpu_to_le32(1); + raw_node->i.i_current_depth = cpu_to_le32(0); raw_node->i.i_dir_level = DEF_DIR_LEVEL; if (c.feature & cpu_to_le32(F2FS_FEATURE_EXTRA_ATTR)) { -- 2.18.0.rc1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel