Re: [PATCH 4.4 13/16] ocfs2: should wait dio before inode lock in ocfs2_setattr()

From: Ben Hutchings
Date: Tue Dec 05 2017 - 10:50:14 EST


On Wed, 2017-11-22 at 11:12 +0100, Greg Kroah-Hartman wrote:
> 4.4-stable review patch.ÂÂIf anyone has any objections, please let me know.
>
> ------------------
>
> From: alex chen <alex.chen@xxxxxxxxxx>
>
> commit 28f5a8a7c033cbf3e32277f4cc9c6afd74f05300 upstream.
>
> we should wait dio requests to finish before inode lock in
> ocfs2_setattr(), otherwise the following deadlock will happen:
[...]

I looked at the kernel-doc for inode_dio_wait():

/**
Â* inode_dio_wait - wait for outstanding DIO requests to finish
Â* @inode: inode to wait for
Â*
Â* Waits for all pending direct I/O requests to finish so that we can
Â* proceed with a truncate or equivalent operation.
Â*
Â* Must be called under a lock that serializes taking new references
Â* to i_dio_count, usually by inode->i_mutex.
Â*/

Now that ocfs2_setattr() calls this outside of the inode locked region,
what prevents another task adding a new dio request immediately
afterward?

Also, ocfs2_dio_end_io_write() was introduced in 4.6 and it looks like
the dio completion path didn't previously take the inode lock. So it
doesn't look this fix is needed in 3.18 or 4.4.

Ben.

--
Ben Hutchings
Software Developer, Codethink Ltd.