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

Reply via email to