diff options
author | Josef Bacik <jbacik@redhat.com> | 2008-10-29 14:49:05 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-10-29 14:49:05 -0400 |
commit | 2517920135b0d29e70453e5b03d70d7b94207df3 (patch) | |
tree | e0c526faa5c2c7bc3add340e5b7e8df26924dca9 /fs/btrfs/extent_io.h | |
parent | 80eb234af09dbe6c97b2e3d60a13ec391e98fbba (diff) |
Btrfs: nuke fs wide allocation mutex V2
This patch removes the giant fs_info->alloc_mutex and replaces it with a bunch
of little locks.
There is now a pinned_mutex, which is used when messing with the pinned_extents
extent io tree, and the extent_ins_mutex which is used with the pending_del and
extent_ins extent io trees.
The locking for the extent tree stuff was inspired by a patch that Yan Zheng
wrote to fix a race condition, I cleaned it up some and changed the locking
around a little bit, but the idea remains the same. Basically instead of
holding the extent_ins_mutex throughout the processing of an extent on the
extent_ins or pending_del trees, we just hold it while we're searching and when
we clear the bits on those trees, and lock the extent for the duration of the
operations on the extent.
Also to keep from getting hung up waiting to lock an extent, I've added a
try_lock_extent so if we cannot lock the extent, move on to the next one in the
tree and we'll come back to that one. I have tested this heavily and it does
not appear to break anything. This has to be applied on top of my
find_free_extent redo patch.
I tested this patch on top of Yan's space reblancing code and it worked fine.
The only thing that has changed since the last version is I pulled out all my
debugging stuff, apparently I forgot to run guilt refresh before I sent the
last patch out. Thank you,
Signed-off-by: Josef Bacik <jbacik@redhat.com>
Diffstat (limited to 'fs/btrfs/extent_io.h')
-rw-r--r-- | fs/btrfs/extent_io.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 86f859b87a6e..283110ec4ee0 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
@@ -128,6 +128,8 @@ int try_release_extent_state(struct extent_map_tree *map, | |||
128 | gfp_t mask); | 128 | gfp_t mask); |
129 | int lock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); | 129 | int lock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); |
130 | int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); | 130 | int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); |
131 | int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end, | ||
132 | gfp_t mask); | ||
131 | int extent_read_full_page(struct extent_io_tree *tree, struct page *page, | 133 | int extent_read_full_page(struct extent_io_tree *tree, struct page *page, |
132 | get_extent_t *get_extent); | 134 | get_extent_t *get_extent); |
133 | int __init extent_io_init(void); | 135 | int __init extent_io_init(void); |