From: Mohammed Anees pvmohammedanees2003@gmail.com
[ Upstream commit 7bf1823e010e8db2fb649c790bd1b449a75f52d8 ]
syzbot has found a possible deadlock in ocfs2_get_system_file_inode [1].
The scenario is depicted here,
CPU0 CPU1 lock(&ocfs2_file_ip_alloc_sem_key); lock(&osb->system_file_mutex); lock(&ocfs2_file_ip_alloc_sem_key); lock(&osb->system_file_mutex);
The function calls which could lead to this are:
CPU0 ocfs2_mknod - lock(&ocfs2_file_ip_alloc_sem_key); . . . ocfs2_get_system_file_inode - lock(&osb->system_file_mutex);
CPU1 - ocfs2_fill_super - lock(&osb->system_file_mutex); . . . ocfs2_read_virt_blocks - lock(&ocfs2_file_ip_alloc_sem_key);
This issue can be resolved by making the down_read -> down_read_try in the ocfs2_read_virt_blocks.
[1] https://syzkaller.appspot.com/bug?extid=e0055ea09f1f5e6fabdd
[ Backport to 5.15: context cleanly applied with no semantic changes. Build-tested. ]
Link: https://lkml.kernel.org/r/20240924093257.7181-1-pvmohammedanees2003@gmail.co... Signed-off-by: Mohammed Anees pvmohammedanees2003@gmail.com Reviewed-by: Joseph Qi joseph.qi@linux.alibaba.com Reported-by: syzbot+e0055ea09f1f5e6fabdd@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=e0055ea09f1f5e6fabdd Tested-by: syzbot+e0055ea09f1f5e6fabdd@syzkaller.appspotmail.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: Gang He ghe@suse.com Cc: Jun Piao piaojun@huawei.com Cc: stable@vger.kernel.org Signed-off-by: Andrew Morton akpm@linux-foundation.org Signed-off-by: Pranav Tyagi pranav.tyagi03@gmail.com --- fs/ocfs2/extent_map.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c index 70a768b623cf..f7672472fa82 100644 --- a/fs/ocfs2/extent_map.c +++ b/fs/ocfs2/extent_map.c @@ -973,7 +973,13 @@ int ocfs2_read_virt_blocks(struct inode *inode, u64 v_block, int nr, }
while (done < nr) { - down_read(&OCFS2_I(inode)->ip_alloc_sem); + if (!down_read_trylock(&OCFS2_I(inode)->ip_alloc_sem)) { + rc = -EAGAIN; + mlog(ML_ERROR, + "Inode #%llu ip_alloc_sem is temporarily unavailable\n", + (unsigned long long)OCFS2_I(inode)->ip_blkno); + break; + } rc = ocfs2_extent_map_get_blocks(inode, v_block + done, &p_block, &p_count, NULL); up_read(&OCFS2_I(inode)->ip_alloc_sem);
[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected. No action required from the submitter.
The upstream commit SHA1 provided is correct: 7bf1823e010e8db2fb649c790bd1b449a75f52d8
WARNING: Author mismatch between patch and upstream commit: Backport author: Pranav Tyagipranav.tyagi03@gmail.com Commit author: Mohammed Aneespvmohammedanees2003@gmail.com
Status in newer kernel trees: 6.15.y | Present (exact SHA1) 6.12.y | Present (exact SHA1) 6.6.y | Present (different SHA1: ec3e32de2d8a) 6.1.y | Not found
Note: The patch differs from the upstream commit: --- 1: 7bf1823e010e8 ! 1: 8b2350f85e550 ocfs2: fix deadlock in ocfs2_get_system_file_inode @@ Metadata ## Commit message ## ocfs2: fix deadlock in ocfs2_get_system_file_inode
+ [ Upstream commit 7bf1823e010e8db2fb649c790bd1b449a75f52d8 ] + syzbot has found a possible deadlock in ocfs2_get_system_file_inode [1].
The scenario is depicted here, @@ Commit message
[1] https://syzkaller.appspot.com/bug?extid=e0055ea09f1f5e6fabdd
+ [ Backport to 5.15: context cleanly applied with no semantic changes. + Build-tested. ] + Link: https://lkml.kernel.org/r/20240924093257.7181-1-pvmohammedanees2003@gmail.co... Signed-off-by: Mohammed Anees pvmohammedanees2003@gmail.com Reviewed-by: Joseph Qi joseph.qi@linux.alibaba.com @@ Commit message Cc: Jun Piao piaojun@huawei.com Cc: stable@vger.kernel.org Signed-off-by: Andrew Morton akpm@linux-foundation.org + Signed-off-by: Pranav Tyagi pranav.tyagi03@gmail.com
## fs/ocfs2/extent_map.c ## @@ fs/ocfs2/extent_map.c: int ocfs2_read_virt_blocks(struct inode *inode, u64 v_block, int nr, ---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-5.15.y | Success | Success |
linux-stable-mirror@lists.linaro.org