| From f46e8ef8bb7b452584f2e75337b619ac51a7cadf Mon Sep 17 00:00:00 2001 |
| From: Edward Adam Davis <eadavis@qq.com> |
| Date: Tue, 19 Aug 2025 21:41:02 +0800 |
| Subject: ocfs2: prevent release journal inode after journal shutdown |
| |
| From: Edward Adam Davis <eadavis@qq.com> |
| |
| commit f46e8ef8bb7b452584f2e75337b619ac51a7cadf upstream. |
| |
| Before calling ocfs2_delete_osb(), ocfs2_journal_shutdown() has already |
| been executed in ocfs2_dismount_volume(), so osb->journal must be NULL. |
| Therefore, the following calltrace will inevitably fail when it reaches |
| jbd2_journal_release_jbd_inode(). |
| |
| ocfs2_dismount_volume()-> |
| ocfs2_delete_osb()-> |
| ocfs2_free_slot_info()-> |
| __ocfs2_free_slot_info()-> |
| evict()-> |
| ocfs2_evict_inode()-> |
| ocfs2_clear_inode()-> |
| jbd2_journal_release_jbd_inode(osb->journal->j_journal, |
| |
| Adding osb->journal checks will prevent null-ptr-deref during the above |
| execution path. |
| |
| Link: https://lkml.kernel.org/r/tencent_357489BEAEE4AED74CBD67D246DBD2C4C606@qq.com |
| Fixes: da5e7c87827e ("ocfs2: cleanup journal init and shutdown") |
| Signed-off-by: Edward Adam Davis <eadavis@qq.com> |
| Reported-by: syzbot+47d8cb2f2cc1517e515a@syzkaller.appspotmail.com |
| Closes: https://syzkaller.appspot.com/bug?extid=47d8cb2f2cc1517e515a |
| Tested-by: syzbot+47d8cb2f2cc1517e515a@syzkaller.appspotmail.com |
| Reviewed-by: Mark Tinguely <mark.tinguely@oracle.com> |
| Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com> |
| Cc: Mark Fasheh <mark@fasheh.com> |
| Cc: Joel Becker <jlbec@evilplan.org> |
| Cc: Junxiao Bi <junxiao.bi@oracle.com> |
| Cc: Changwei Ge <gechangwei@live.cn> |
| Cc: Jun Piao <piaojun@huawei.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/ocfs2/inode.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/fs/ocfs2/inode.c |
| +++ b/fs/ocfs2/inode.c |
| @@ -1219,6 +1219,9 @@ static void ocfs2_clear_inode(struct ino |
| * the journal is flushed before journal shutdown. Thus it is safe to |
| * have inodes get cleaned up after journal shutdown. |
| */ |
| + if (!osb->journal) |
| + return; |
| + |
| jbd2_journal_release_jbd_inode(osb->journal->j_journal, |
| &oi->ip_jinode); |
| } |