2021-12-10 08:38:28

by Jia-Ju Bai

[permalink] [raw]
Subject: [BUG] fs: ocfs2: possible ABBA deadlock in ocfs2_dio_end_io_write() and ocfs2_move_extents()

Hello,

My static analysis tool reports a possible ABBA deadlock in the ocfs2
module in Linux 5.10:

ocfs2_dio_end_io_write()
  down_write(&oi->ip_alloc_sem); --> Line 2322 (Lock A)
  ocfs2_del_inode_from_orphan()
    inode_lock(orphan_dir_inode);  --> Line 2701 (Lock B)

ocfs2_move_extents()
  inode_lock(inode); --> Line 916 (Lock B)
  down_write(&OCFS2_I(inode)->ip_alloc_sem); --> Line 936 (Lock A)

When ocfs2_dio_end_io_write() and ocfs2_move_extents() are concurrently
executed, the deadlocks can occur.

I am not quite sure whether this possible deadlock is real and how to
fix it if it is real.
Any feedback would be appreciated, thanks :)

Reported-by: TOTE Robot <[email protected]>


Best wishes,
Jia-Ju Bai


2021-12-14 07:08:45

by Joseph Qi

[permalink] [raw]
Subject: Re: [BUG] fs: ocfs2: possible ABBA deadlock in ocfs2_dio_end_io_write() and ocfs2_move_extents()

Hi,

Thanks for the report. But I don't think this is a possible deadlock in
practice. Please see my comments below.

On 12/10/21 4:38 PM, Jia-Ju Bai wrote:
> Hello,
>
> My static analysis tool reports a possible ABBA deadlock in the ocfs2 module in Linux 5.10:
>
> ocfs2_dio_end_io_write()
>   down_write(&oi->ip_alloc_sem); --> Line 2322 (Lock A)
>   ocfs2_del_inode_from_orphan()
>     inode_lock(orphan_dir_inode);  --> Line 2701 (Lock B)

Just as the variable name indicates, it is orphan dir inode, which is a
system file (something hidden inside the filesystem) and not visible for
end user.

>
> ocfs2_move_extents()
>   inode_lock(inode); --> Line 916 (Lock B)

This is called from a ioctl from user, it a normal file inode.

Thanks,
Joseph

>   down_write(&OCFS2_I(inode)->ip_alloc_sem); --> Line 936 (Lock A)
>
> When ocfs2_dio_end_io_write() and ocfs2_move_extents() are concurrently executed, the deadlocks can occur.
>
> I am not quite sure whether this possible deadlock is real and how to fix it if it is real.
> Any feedback would be appreciated, thanks :)
>
> Reported-by: TOTE Robot <[email protected]>
>
>
> Best wishes,
> Jia-Ju Bai

2021-12-14 07:19:52

by Jia-Ju Bai

[permalink] [raw]
Subject: Re: [BUG] fs: ocfs2: possible ABBA deadlock in ocfs2_dio_end_io_write() and ocfs2_move_extents()



On 2021/12/14 15:08, Joseph Qi wrote:
> Hi,
>
> Thanks for the report. But I don't think this is a possible deadlock in
> practice. Please see my comments below.
>
> On 12/10/21 4:38 PM, Jia-Ju Bai wrote:
>> Hello,
>>
>> My static analysis tool reports a possible ABBA deadlock in the ocfs2 module in Linux 5.10:
>>
>> ocfs2_dio_end_io_write()
>>   down_write(&oi->ip_alloc_sem); --> Line 2322 (Lock A)
>>   ocfs2_del_inode_from_orphan()
>>     inode_lock(orphan_dir_inode);  --> Line 2701 (Lock B)
> Just as the variable name indicates, it is orphan dir inode, which is a
> system file (something hidden inside the filesystem) and not visible for
> end user.
>
>> ocfs2_move_extents()
>>   inode_lock(inode); --> Line 916 (Lock B)
> This is called from a ioctl from user, it a normal file inode.

Okay, thanks for the explanation :)


Best wishes,
Jia-Ju Bai