diff options
author | Dave Chinner <dchinner@redhat.com> | 2011-03-22 12:23:38 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-03-25 02:16:31 +0100 |
commit | 02afc410f363f98ac4f186341e38dcec13fc0e60 (patch) | |
tree | 2c5d5b2f1556806da135f2323b4df4d7d72d3734 /fs/logfs/inode.c | |
parent | fs: factor inode disposal (diff) | |
download | linux-02afc410f363f98ac4f186341e38dcec13fc0e60.tar.xz linux-02afc410f363f98ac4f186341e38dcec13fc0e60.zip |
fs: Lock the inode LRU list separately
Introduce the inode_lru_lock to protect the inode_lru list. This
lock is nested inside the inode->i_lock to allow the inode to be
added to the LRU list in iput_final without needing to deal with
lock inversions. This keeps iput_final() clean and neat.
Further, where marking the inode I_FREEING and removing it from the
LRU, move the LRU list manipulation within the inode->i_lock to keep
the list manipulation consistent with iput_final. This also means
that most of the open coded LRU list removal + unused inode
accounting can now use the inode_lru_list_del() wrappers which
cleans the code up further.
However, this locking change means what the LRU traversal in
prune_icache() inverts this lock ordering and needs to use trylock
semantics on the inode->i_lock to avoid deadlocking. In these cases,
if we fail to lock the inode we move it to the back of the LRU to
prevent spinning on it.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to '')
0 files changed, 0 insertions, 0 deletions