Hi Ben,
Thanks for your reply.
On 2017/12/5 23:49, Ben Hutchings wrote:
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@huawei.com
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?
In the kernel 4.6, firstly, we use the inode_lock() in do_truncate() to prevent another bio to be issued from this node. Furthermore, we use the ocfs2_rw_lock() and ocfs2_inode_lock() in ocfs2_setattr() to guarantee no more bio will be issued from the other nodes in this cluster.
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.
Yes, ocfs2_dio_end_io_write() was introduced in 4.6 and the problem this patch fixes is only exist in the kernel 4.6 and above 4.6.
I'm sorry that I don't clearly point out which the stable version of kernel this patch will fixes.
Thanks, Alex
Ben.