On 2017/10/31 9:38, Sheng Yong wrote: > f2fs_iget checks if i_mode is valid. If it is not, the file cannot be > accessed as well as deleted. To make sure such files can be removed, > fsck adds the same check, and removes incorrect inode blocks. > > Signed-off-by: Sheng Yong <shengyo...@huawei.com> > --- > fsck/fsck.c | 21 +++++++++++++++++++++ > fsck/mount.c | 4 ++-- > 2 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/fsck/fsck.c b/fsck/fsck.c > index 56a47be..77490d8 100644 > --- a/fsck/fsck.c > +++ b/fsck/fsck.c > @@ -458,6 +458,25 @@ static int sanity_check_nid(struct f2fs_sb_info *sbi, > u32 nid, > return 0; > } > > +static int sanity_check_inode(struct f2fs_sb_info *sbi, struct f2fs_node > *node) > +{ > + struct f2fs_fsck *fsck = F2FS_FSCK(sbi); > + struct f2fs_inode *fi = &node->i; > + > + if (!(le16_to_cpu(fi->i_mode) & S_IFMT)) { > + ASSERT_MSG("i_mode is not valid. [0x%x]", > le16_to_cpu(fi->i_mode)); > + goto remove_node; > + } > + > + return 0; > + > +remove_node:> + f2fs_set_bit(le32_to_cpu(node->footer.ino), > fsck->nat_area_bitmap); > + fsck->chk.valid_blk_cnt--; > + fsck->chk.valid_node_cnt--; > + return -EINVAL; > +} > + > static int fsck_chk_xattr_blk(struct f2fs_sb_info *sbi, u32 ino, > u32 x_nid, u32 *blk_cnt) > { > @@ -500,6 +519,8 @@ int fsck_chk_node_blk(struct f2fs_sb_info *sbi, struct > f2fs_inode *inode, > goto err; > > if (ntype == TYPE_INODE) { > + if (sanity_check_inode(sbi, node_blk)) > + goto err; > fsck_chk_inode_blk(sbi, nid, ftype, node_blk, blk_cnt, &ni); > } else { > switch (ntype) { > diff --git a/fsck/mount.c b/fsck/mount.c > index a9cd581..45341bc 100644 > --- a/fsck/mount.c > +++ b/fsck/mount.c > @@ -1985,7 +1985,7 @@ void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 > nid) > if (le32_to_cpu(nid_in_journal(journal, i)) == nid) { > memset(&nat_in_journal(journal, i), 0, > sizeof(struct f2fs_nat_entry)); > - FIX_MSG("Remove nid [0x%x] in nat journal\n", nid); > + FIX_MSG("Remove nid [0x%x] in nat journal", nid); > return; > } > } > @@ -2005,7 +2005,7 @@ void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 > nid) > } else { > memset(&nat_block->entries[entry_off], 0, > sizeof(struct f2fs_nat_entry)); > - FIX_MSG("Remove nid [0x%x] in NAT\n", nid); > + FIX_MSG("Remove nid [0x%x] in NAT", nid);
How about moving all message printing modification into one patch? Thanks, > } > > ret = dev_write_block(nat_block, block_addr); > ------------------------------------------------------------------------------ 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