[lvc-project] [PATCH] ocfs2: uncache inode after ocfs2_search_dirblock() search failure

Joseph Qi joseph.qi at linux.alibaba.com
Sat Dec 28 15:27:02 MSK 2024



On 2024/12/27 21:07, Dmitry Antipov wrote:
> Syzbot has reported the following BUG:
> 
> kernel BUG at fs/ocfs2/uptodate.c:509!
> ...
> Call Trace:
>  <TASK>
>  ? __die_body+0x61/0xb0
>  ? die+0x9f/0xc0
>  ? do_trap+0x14a/0x3d0
>  ? ocfs2_set_new_buffer_uptodate+0x149/0x170
>  ? do_error_trap+0x1c2/0x280
>  ? ocfs2_set_new_buffer_uptodate+0x149/0x170
>  ? __pfx_do_error_trap+0x10/0x10
>  ? handle_invalid_op+0x34/0x40
>  ? ocfs2_set_new_buffer_uptodate+0x149/0x170
>  ? exc_invalid_op+0x39/0x50
>  ? asm_exc_invalid_op+0x1a/0x20
>  ? ocfs2_set_new_buffer_uptodate+0x148/0x170
>  ? ocfs2_set_new_buffer_uptodate+0x149/0x170
>  ? ocfs2_set_new_buffer_uptodate+0x148/0x170
>  ocfs2_group_add+0x318/0x1240
>  ? mnt_get_write_access+0x68/0x2a0
>  ? __pfx_ocfs2_group_add+0x10/0x10
>  ? mnt_get_write_access+0x68/0x2a0
>  ? __pfx_lock_release+0x10/0x10
>  ? rcu_read_lock_any_held+0xb4/0x130
>  ? __pfx_rcu_read_lock_any_held+0x10/0x10
>  ? __pfx_lock_release+0x10/0x10
>  ? mnt_get_write_access+0x223/0x2a0
>  ? mnt_want_write_file+0x172/0x200
>  ocfs2_ioctl+0x60b/0x750
>  ? __pfx_ocfs2_ioctl+0x10/0x10
>  ? lockdep_hardirqs_on_prepare+0x401/0x750
>  ? bpf_lsm_file_ioctl+0x9/0x20
>  ? __pfx_ocfs2_ioctl+0x10/0x10
>  __se_sys_ioctl+0xfc/0x170
>  do_syscall_64+0xf6/0x210
>  ? exc_page_fault+0x92/0x110
>  entry_SYSCALL_64_after_hwframe+0x77/0x7f
>  ...
>  </TASK>
> 
> In 'ocfs2_find_entry_id()', the buffer head remains cached (by
> 'ocfs2_read_blocks()') regardless of the search result returned
> by 'ocfs2_search_dirblock()'. In case of search failure, that
> buffer head is no longer used and should be uncached before
> calling 'brelse()'. This is very similar to commit 737f34137844
> ("ocfs2: uncache inode which has failed entering the group").
> 

Hi, don't see the relationship between above logic and the triggered
bug.
Could you please elobrate more how it happens?

Thanks,
Joseph

> Reported-by: syzbot+7aef76bdb53b83d62a9e at syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=7aef76bdb53b83d62a9e
> Fixes: 23193e513d1c ("ocfs2: Read support for directories with inline data")
> Signed-off-by: Dmitry Antipov <dmantipov at yandex.ru>
> ---
>  fs/ocfs2/dir.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c
> index 213206ebdd58..3bfbc166d1fe 100644
> --- a/fs/ocfs2/dir.c
> +++ b/fs/ocfs2/dir.c
> @@ -416,6 +416,9 @@ static struct buffer_head *ocfs2_find_entry_id(const char *name,
>  	if (found == 1)
>  		return di_bh;
>  
> +	/* Cached by ocfs2_read_blocks() so remove it. */
> +	ocfs2_remove_from_cache(INODE_CACHE(dir), di_bh);
> +
>  	brelse(di_bh);
>  out:
>  	return NULL;




More information about the lvc-project mailing list