diff options
author | Theodore Ts'o <tytso@mit.edu> | 2014-03-09 06:46:23 +0100 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-03-09 06:46:23 +0100 |
commit | 6e4862a5bb9d12be87e4ea5d9a60836ebed71d28 (patch) | |
tree | ee71b5c4262480b07b34161d1eda8d8cb706074a /fs/jbd2 | |
parent | jbd2: check jh->b_transaction without taking j_list_lock (diff) | |
download | linux-6e4862a5bb9d12be87e4ea5d9a60836ebed71d28.tar.xz linux-6e4862a5bb9d12be87e4ea5d9a60836ebed71d28.zip |
jbd2: minimize region locked by j_list_lock in journal_get_create_access()
It's not needed until we start trying to modifying fields in the
journal_head which are protected by j_list_lock.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/jbd2')
-rw-r--r-- | fs/jbd2/transaction.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 78900a1252b2..357f3dc5201f 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -1073,7 +1073,6 @@ int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh) * reused here. */ jbd_lock_bh_state(bh); - spin_lock(&journal->j_list_lock); J_ASSERT_JH(jh, (jh->b_transaction == transaction || jh->b_transaction == NULL || (jh->b_transaction == journal->j_committing_transaction && @@ -1096,12 +1095,14 @@ int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh) jh->b_modified = 0; JBUFFER_TRACE(jh, "file as BJ_Reserved"); + spin_lock(&journal->j_list_lock); __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); } else if (jh->b_transaction == journal->j_committing_transaction) { /* first access by this transaction */ jh->b_modified = 0; JBUFFER_TRACE(jh, "set next transaction"); + spin_lock(&journal->j_list_lock); jh->b_next_transaction = transaction; } spin_unlock(&journal->j_list_lock); |