fs: Use rename lock and RCU for multi-step operations
authorNick Piggin <npiggin@kernel.dk>
Fri, 7 Jan 2011 06:49:37 +0000 (17:49 +1100)
committerNick Piggin <npiggin@kernel.dk>
Fri, 7 Jan 2011 06:50:22 +0000 (17:50 +1100)
commit949854d02455080d20cd3e1db28a3a18daf7599d
tree9b13a6f86c1d0b91e462a471e53b0e717036b18e
parent9abca36087288fe28de4749c71ca003d4b9e3ed0
fs: Use rename lock and RCU for multi-step operations

The remaining usages for dcache_lock is to allow atomic, multi-step read-side
operations over the directory tree by excluding modifications to the tree.
Also, to walk in the leaf->root direction in the tree where we don't have
a natural d_lock ordering.

This could be accomplished by taking every d_lock, but this would mean a
huge number of locks and actually gets very tricky.

Solve this instead by using the rename seqlock for multi-step read-side
operations, retry in case of a rename so we don't walk up the wrong parent.
Concurrent dentry insertions are not serialised against.  Concurrent deletes
are tricky when walking up the directory: our parent might have been deleted
when dropping locks so also need to check and retry for that.

We can also use the rename lock in cases where livelock is a worry (and it
is introduced in subsequent patch).

Signed-off-by: Nick Piggin <npiggin@kernel.dk>
drivers/staging/pohmelfs/path_entry.c
fs/autofs4/waitq.c
fs/dcache.c
fs/nfs/namespace.c
include/linux/dcache.h