On Sun, 2018-02-11 at 15:39 +0800, alex chen wrote: > Hi Ben, > > 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.
Thanks for the reminder. I'll drop this from the 3.2 and 3.16 patch queues. Ben. > Thanks, > Alex > > On 2018/2/11 12:20, Ben Hutchings wrote: > > 3.2.99-rc1 review patch. If anyone has any objections, please let me know. > > > > ------------------ > > > > From: alex chen <[email protected]> > > > > commit 28f5a8a7c033cbf3e32277f4cc9c6afd74f05300 upstream. > > > > we should wait dio requests to finish before inode lock in > > ocfs2_setattr(), otherwise the following deadlock will happen: > > > > process 1 process 2 process 3 > > truncate file 'A' end_io of writing file 'A' receiving the bast > > messages > > ocfs2_setattr > > ocfs2_inode_lock_tracker > > ocfs2_inode_lock_full > > inode_dio_wait > > __inode_dio_wait > > -->waiting for all dio > > requests finish > > > > dlm_proxy_ast_handler > > dlm_do_local_bast > > ocfs2_blocking_ast > > > > ocfs2_generic_handle_bast > > set > > OCFS2_LOCK_BLOCKED flag > > dio_end_io > > dio_bio_end_aio > > dio_complete > > ocfs2_dio_end_io > > ocfs2_dio_end_io_write > > ocfs2_inode_lock > > __ocfs2_cluster_lock > > ocfs2_wait_for_mask > > -->waiting for OCFS2_LOCK_BLOCKED > > flag to be cleared, that is waiting > > for 'process 1' unlocking the inode lock > > inode_dio_end > > -->here dec the i_dio_count, but will never > > be called, so a deadlock happened. > > > > Link: http://lkml.kernel.org/r/[email protected] > > Signed-off-by: Alex Chen <[email protected]> > > Reviewed-by: Jun Piao <[email protected]> > > Reviewed-by: Joseph Qi <[email protected]> > > Acked-by: Changwei Ge <[email protected]> > > Cc: Mark Fasheh <[email protected]> > > Cc: Joel Becker <[email protected]> > > Cc: Junxiao Bi <[email protected]> > > Signed-off-by: Andrew Morton <[email protected]> > > Signed-off-by: Linus Torvalds <[email protected]> > > Signed-off-by: Ben Hutchings <[email protected]> > > --- > > fs/ocfs2/file.c | 9 +++++++-- > > 1 file changed, 7 insertions(+), 2 deletions(-) > > > > --- a/fs/ocfs2/file.c > > +++ b/fs/ocfs2/file.c > > @@ -1130,6 +1130,13 @@ int ocfs2_setattr(struct dentry *dentry, > > dquot_initialize(inode); > > size_change = S_ISREG(inode->i_mode) && attr->ia_valid & ATTR_SIZE; > > if (size_change) { > > + /* > > + * Here we should wait dio to finish before inode lock > > + * to avoid a deadlock between ocfs2_setattr() and > > + * ocfs2_dio_end_io_write() > > + */ > > + inode_dio_wait(inode); > > + > > status = ocfs2_rw_lock(inode, 1); > > if (status < 0) { > > mlog_errno(status); > > @@ -1149,8 +1156,6 @@ int ocfs2_setattr(struct dentry *dentry, > > if (status) > > goto bail_unlock; > > > > - inode_dio_wait(inode); > > - > > if (i_size_read(inode) >= attr->ia_size) { > > if (ocfs2_should_order_data(inode)) { > > status = ocfs2_begin_ordered_truncate(inode, > > > > > > . > > > > -- Ben Hutchings Sturgeon's Law: Ninety percent of everything is crap.
signature.asc
Description: This is a digitally signed message part

