diff options
author | Chao Yu <yuchao0@huawei.com> | 2018-07-28 18:41:35 +0800 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2018-08-27 23:52:39 -0700 |
commit | 91bb7b21f740d61cde2bb27da3dccb0afdd5a15b (patch) | |
tree | 2763161b6dbf3cc2541bff9052f85be80a18ae85 | |
parent | fae19d820024938cbabb3aef089d7c4479012f62 (diff) | |
download | f2fs-tools-91bb7b21f740d61cde2bb27da3dccb0afdd5a15b.tar.gz |
f2fs-tools: fix to reset i_gc_failures offline
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 <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fsck/dir.c | 5 | ||||
-rw-r--r-- | fsck/fsck.c | 16 | ||||
-rw-r--r-- | include/f2fs_fs.h | 8 | ||||
-rw-r--r-- | mkfs/f2fs_format.c | 2 |
4 files changed, 28 insertions, 3 deletions
@@ -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 21d93a4..6edddf4 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 ef13bf0..4ffc35f 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -785,7 +785,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 850b4d7..4b88d93 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)) { |