jbd2: speedup jbd2_journal_get_[write|undo]_access()
authorJan Kara <jack@suse.cz>
Mon, 8 Jun 2015 16:46:37 +0000 (12:46 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 8 Jun 2015 16:46:37 +0000 (12:46 -0400)
commitde92c8caf16ca84926fa31b7a5590c0fb9c0d5ca
tree3fda30d72edf93965320abb2d3a689b04fbb9f46
parent8b00f400eedf91d074f831077003c0d4d9147377
jbd2: speedup jbd2_journal_get_[write|undo]_access()

jbd2_journal_get_write_access() and jbd2_journal_get_create_access() are
frequently called for buffers that are already part of the running
transaction - most frequently it is the case for bitmaps, inode table
blocks, and superblock. Since in such cases we have nothing to do, it is
unfortunate we still grab reference to journal head, lock the bh, lock
bh_state only to find out there's nothing to do.

Improving this is a bit subtle though since until we find out journal
head is attached to the running transaction, it can disappear from under
us because checkpointing / commit decided it's no longer needed. We deal
with this by protecting journal_head slab with RCU. We still have to be
careful about journal head being freed & reallocated within slab and
about exposing journal head in consistent state (in particular
b_modified and b_frozen_data must be in correct state before we allow
user to touch the buffer).

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/jbd2/journal.c
fs/jbd2/transaction.c