When collecting data segment(gc_data_segment), there is a race condition between evict and phases of gc: 0) ra_node_page(dnode) 1) ra_node_page(inode) <--- evict the inode 2) f2fs_iget get the inode and add it to gc_list 3) move_data_page
In step 2), f2fs_iget does NOT find the inode and allocs a new inode as result, which is not resonable. This patch changes f2fs_iget to ilookup. when no inode is found, no new inode is created. Signed-off-by: Hou Pengyang <houpengy...@huawei.com> --- fs/f2fs/gc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 38d56f6..6e73193 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -717,8 +717,8 @@ next_step: ofs_in_node = le16_to_cpu(entry->ofs_in_node); if (phase == 2) { - inode = f2fs_iget(sb, dni.ino); - if (IS_ERR(inode) || is_bad_inode(inode)) + inode = ilookup(sb, dni.ino); + if (!inode || IS_ERR(inode) || is_bad_inode(inode)) continue; /* if encrypted inode, let's go phase 3 */ -- 1.9.1