On Sun, Nov 25, 2018 at 04:36:06PM +0800, Xiaoguang Wang wrote: > This issue was found when I tried to put checkpoint work in a separate thread, > the deadlock below happened: > Thread1 | Thread2 > __jbd2_log_wait_for_space | > jbd2_log_do_checkpoint (hold j_checkpoint_mutex)| > if (jh->b_transaction != NULL) | > ... | > jbd2_log_start_commit(journal, tid); |jbd2_update_log_tail > | will lock j_checkpoint_mutex, > | but will be blocked here. > | > jbd2_log_wait_commit(journal, tid); | > wait_event(journal->j_wait_done_commit, | > !tid_gt(tid, journal->j_commit_sequence)); | > ... |wake_up(j_wait_done_commit) > } | > > then deadlock occurs, Thread1 will never be waken up. > > To fix this issue, drop j_checkpoint_mutex in jbd2_log_do_checkpoint() > when we are going to wait for transaction commit. > > Reviewed-by: Jan Kara <jack@xxxxxxx> > Signed-off-by: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx> Thanks, applied. - Ted