btrfs_search_slot: reduce lock contention by cowing in two stages
authorChris Mason <chris.mason@oracle.com>
Fri, 1 Aug 2008 19:11:20 +0000 (15:11 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:06 +0000 (11:04 -0400)
commit65b51a009e29e64c0951f21ea17fdc66bbb0fbd7
tree800926527fad4c12ca64083816f33be3d716ec13
parent18e35e0ab337ec99c7e03e9ae917745a352c0bb1
btrfs_search_slot: reduce lock contention by cowing in two stages

A btree block cow has two parts, the first is to allocate a destination
block and the second is to copy the old bock over.

The first part needs locks in the extent allocation tree, and may need to
do IO.  This changeset splits that into a separate function that can be
called without any tree locks held.

btrfs_search_slot is changed to drop its path and start over if it has
to COW a contended block.  This often means that many writers will
pre-alloc a new destination for a the same contended block, but they
cache their prealloc for later use on lower levels in the tree.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c
fs/btrfs/ctree.h
fs/btrfs/extent-tree.c
fs/btrfs/locking.c
fs/btrfs/locking.h
fs/btrfs/transaction.c