Hi Ritesh,

On 2018/11/19 14:02, Ritesh Harjani wrote:
> This is seen when CP_ERROR_FLAG is not set & FS may be corrupted.
> There is a case observed where dirty stale inode pointer data is still
> present in the gdirty_list causing panic on access while doing
> checkpoint operation.
> 
> WARNING: CPU: 3 PID: 1827 at
> kernel/msm-4.14/fs/f2fs/inode.c:567
> f2fs_evict_inode+0x364/0x37c
> <...>
> [42246.776289] BUG: spinlock bad magic on CPU#4, 1245
> [42246.782674] Unable to handle kernel paging request at virtual address 
> 6b6b6b6b6b713b
> <...>
> [42246.896370] task: ffffffc0f0434080 task.stack: ffffff8023ea0000
> [42246.902465] pc : spin_bug+0x80/0xb8
> [42246.906055] lr : spin_bug+0x64/0xb8
> <...>
> [42247.122346] Call trace:
> [42247.124876]  spin_bug+0x80/0xb8
> [42247.128110]  do_raw_spin_lock+0xe8/0x118
> [42247.132144]  _raw_spin_lock+0x24/0x30
> [42247.135916]  igrab+0x20/0x6c
> [42247.138894]  f2fs_sync_inode_meta+0x58/0xc0
> [42247.143199]  write_checkpoint+0x1c4/0xecc
> [42247.147322]  f2fs_sync_fs+0x118/0x170
> [42247.151096]  f2fs_do_sync_file+0x4f0/0x798
> [42247.155311]  f2fs_sync_file+0x54/0x6c
> [42247.159087]  vfs_fsync_range+0x90/0xac
> [42247.162950]  vfs_fsync+0x2c/0x38
> [42247.166278]  do_fsync+0x3c/0x78
> [42247.169515]  SyS_fdatasync+0x20/0x30
> 
> Signed-off-by: Ritesh Harjani <[email protected]>
> ---
>  fs/f2fs/inode.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
> index 91ceee0..c57f636 100644
> --- a/fs/f2fs/inode.c
> +++ b/fs/f2fs/inode.c
> @@ -702,11 +702,13 @@ void f2fs_evict_inode(struct inode *inode)
>       stat_dec_inline_dir(inode);
>       stat_dec_inline_inode(inode);
>  
> -     if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG) &&
> -                             !is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
> -             f2fs_bug_on(sbi, is_inode_flag_set(inode, FI_DIRTY_INODE));
> -     else
> +     if (unlikely(is_inode_flag_set(inode, FI_DIRTY_INODE))) {
>               f2fs_inode_synced(inode);
> +             f2fs_msg(sbi->sb, KERN_WARNING,
> +                      "inconsistent dirty inode:%u entry found during 
> eviction\n",
> +                      inode->i_ino);
> +             f2fs_bug_on(sbi, 1);

IIRC, Jaegeuk added below condition to avoid f2fs_bug_on during doing test
w/ checkpoint error injection, if we remove this, we may still encounter
such problem.

if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG)))

So I'd like to know what kind of case can make dirty inode during evict(),
can you explain more?

Thanks,

> +     }
>  
>       /* ino == 0, if f2fs_new_inode() was failed t*/
>       if (inode->i_ino)
> 



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to