Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 735cf1cd authored by Ritesh Harjani's avatar Ritesh Harjani
Browse files

f2fs: remove stale inode entry before eviction from gdirty_list



This is seen when CP_ERROR_FLAG is not set & F2FS 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

Change-Id: Iccbb308eb24ed46d0d0ac5d169f80e00b80dfda4
Signed-off-by: default avatarRitesh Harjani <riteshh@codeaurora.org>
parent 4c314540
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -563,10 +563,14 @@ 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)))
		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);
		if (!is_set_ckpt_flags(sbi, CP_ERROR_FLAG))
			f2fs_bug_on(sbi, 1);
	}

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