aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-04-13 18:10:35 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2009-09-14 01:18:01 -0400
commita412f9efdd6424bf4bf28c8e8c92060b5e975482 (patch)
treeb290d38a85c4b675af426dbd8593768bc5339fa1
parent8ebc423238341b52912c7295b045a32477b33f09 (diff)
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>
-rw-r--r--fs/reiserfs/journal.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index 438c71f0bc91..0ba98ca367c7 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -1826,7 +1826,7 @@ static int kupdate_transactions(struct super_block *s,
1826 struct reiserfs_journal *journal = SB_JOURNAL(s); 1826 struct reiserfs_journal *journal = SB_JOURNAL(s);
1827 chunk.nr = 0; 1827 chunk.nr = 0;
1828 1828
1829 mutex_lock(&journal->j_flush_mutex); 1829 reiserfs_mutex_lock_safe(&journal->j_flush_mutex, s);
1830 if (!journal_list_still_alive(s, orig_trans_id)) { 1830 if (!journal_list_still_alive(s, orig_trans_id)) {
1831 goto done; 1831 goto done;
1832 } 1832 }