From ee0cb1c45e8f5f3ea388bdc477bb50ed4c934833 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Tue, 10 Jul 2018 20:29:08 +0800 Subject: [PATCH] fsck.f2fs: fix to do sanity check with extra_attr feature This patch tries to fix incorrect extra_attr bit or i_extra_isize value in fsck. Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim --- fsck/fsck.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/fsck/fsck.c b/fsck/fsck.c index 1c1a5bb..544e008 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -658,7 +658,7 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid, u32 i_links = le32_to_cpu(node_blk->i.i_links); u64 i_size = le64_to_cpu(node_blk->i.i_size); u64 i_blocks = le64_to_cpu(node_blk->i.i_blocks); - int ofs = get_extra_isize(node_blk); + int ofs; unsigned char *en; int namelen; unsigned int idx = 0; @@ -726,6 +726,22 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid, get_extent_info(&child.ei, &node_blk->i.i_ext); child.last_blk = 0; + if (f2fs_has_extra_isize(&node_blk->i)) { + if (c.feature & cpu_to_le32(F2FS_FEATURE_EXTRA_ATTR)) { + if (node_blk->i.i_extra_isize > + cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE)) { + node_blk->i.i_extra_isize = + cpu_to_le16(F2FS_TOTAL_EXTRA_ATTR_SIZE); + need_fix = 1; + } + } else { + /* we don't support tuning F2FS_FEATURE_EXTRA_ATTR now */ + node_blk->i.i_inline &= ~F2FS_EXTRA_ATTR; + need_fix = 1; + } + } + ofs = get_extra_isize(node_blk); + if ((node_blk->i.i_inline & F2FS_INLINE_DATA)) { if (le32_to_cpu(node_blk->i.i_addr[ofs]) != 0) { /* should fix this bug all the time */ -- 2.7.4