On Mon, Dec 15, 2014 at 02:51:09PM -0800, Andrew Morton wrote: > From: Junxiao Bi <[email protected]> > Subject: ocfs2: fix journal commit deadlock > > For buffer write, page lock will be got in write_begin and released in > write_end, in ocfs2_write_end_nolock(), before it unlock the page in > ocfs2_free_write_ctxt(), it calls ocfs2_run_deallocs(), this will ask for > the read lock of journal->j_trans_barrier. Holding page lock and ask for > journal->j_trans_barrier breaks the locking order. > > This will cause a deadlock with journal commit threads, ocfs2cmt will get > write lock of journal->j_trans_barrier first, then it wakes up kjournald2 > to do the commit work, at last it waits until done. To commit journal, > kjournald2 needs flushing data first, it needs get the cache page lock. > > Since some ocfs2 cluster locks are holding by write process, this > deadlock may hung the whole cluster. > > unlock pages before ocfs2_run_deallocs() can fix the locking order, also > put unlock before ocfs2_commit_trans() to make page lock is unlocked > before j_trans_barrier to preserve unlocking order. > > Signed-off-by: Junxiao Bi <[email protected]> > Reviewed-by: Wengang Wang <[email protected]> > Cc: <[email protected]> > Cc: Mark Fasheh <[email protected]> > Cc: Joel Becker <[email protected]> > Signed-off-by: Andrew Morton <[email protected]>
Reviewed-by: Mark Fasheh <[email protected]> --Mark -- Mark Fasheh -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
