reiserfs, kill-the-BKL: fix unsafe j_flush_mutex lock
commita412f9efdd6424bf4bf28c8e8c92060b5e975482
authorFrederic Weisbecker <fweisbec@gmail.com>
Mon, 13 Apr 2009 22:10:35 +0000 (14 00:10 +0200)
committerFrederic Weisbecker <fweisbec@gmail.com>
Mon, 14 Sep 2009 05:18:01 +0000 (14 07:18 +0200)
treeb290d38a85c4b675af426dbd8593768bc5339fa1
parent8ebc423238341b52912c7295b045a32477b33f09
reiserfs, kill-the-BKL: fix unsafe j_flush_mutex lock

Impact: fix a deadlock

The j_flush_mutex is acquired safely in journal.c:
if we can't take it, we free the reiserfs per superblock lock
and wait a bit.

But we have a remaining place in kupdate_transactions() where
j_flush_mutex is still acquired traditionnaly. Thus the following
scenario (warned by lockdep) can happen:

A B

mutex_lock(&write_lock) mutex_lock(&write_lock)
mutex_lock(&j_flush_mutex) mutex_lock(&j_flush_mutex) //block
mutex_unlock(&write_lock)
sleep...
mutex_lock(&write_lock) //deadlock

Fix this by using reiserfs_mutex_lock_safe() in kupdate_transactions().

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Alessio Igor Bogani <abogani@texware.it>
Cc: Jeff Mahoney <jeffm@suse.com>
LKML-Reference: <1239660635-12940-1-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
fs/reiserfs/journal.c