diff options
author | Josef Bacik <josef@redhat.com> | 2010-02-03 14:33:23 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2010-03-15 11:00:13 -0400 |
commit | 2ac55d41b5d6bf49e76bc85db5431240617e2f8f (patch) | |
tree | ee8e2a716ef0b50388ef5e4a86387ec0499bca89 /fs/btrfs/extent_io.h | |
parent | 5a1a3df1f6c86926cfe8657e6f9b4b4c2f467d60 (diff) |
Btrfs: cache the extent state everywhere we possibly can V2
This patch just goes through and fixes everybody that does
lock_extent()
blah
unlock_extent()
to use
lock_extent_bits()
blah
unlock_extent_cached()
and pass around a extent_state so we only have to do the searches once per
function. This gives me about a 3 mb/s boots on my random write test. I have
not converted some things, like the relocation and ioctl's, since they aren't
heavily used and the relocation stuff is in the middle of being re-written. I
also changed the clear_extent_bit() to only unset the cached state if we are
clearing EXTENT_LOCKED and related stuff, so we can do things like this
lock_extent_bits()
clear delalloc bits
unlock_extent_cached()
without losing our cached state. I tested this thoroughly and turned on
LEAK_DEBUG to make sure we weren't leaking extent states, everything worked out
fine.
Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent_io.h')
-rw-r--r-- | fs/btrfs/extent_io.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 36de250a7b2b..bbab4813646f 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
@@ -163,6 +163,8 @@ int lock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); | |||
163 | int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, | 163 | int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, |
164 | int bits, struct extent_state **cached, gfp_t mask); | 164 | int bits, struct extent_state **cached, gfp_t mask); |
165 | int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); | 165 | int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); |
166 | int unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end, | ||
167 | struct extent_state **cached, gfp_t mask); | ||
166 | int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end, | 168 | int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end, |
167 | gfp_t mask); | 169 | gfp_t mask); |
168 | int extent_read_full_page(struct extent_io_tree *tree, struct page *page, | 170 | int extent_read_full_page(struct extent_io_tree *tree, struct page *page, |
@@ -196,7 +198,7 @@ int clear_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end, | |||
196 | int clear_extent_ordered_metadata(struct extent_io_tree *tree, u64 start, | 198 | int clear_extent_ordered_metadata(struct extent_io_tree *tree, u64 start, |
197 | u64 end, gfp_t mask); | 199 | u64 end, gfp_t mask); |
198 | int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, | 200 | int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, |
199 | gfp_t mask); | 201 | struct extent_state **cached_state, gfp_t mask); |
200 | int set_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end, | 202 | int set_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end, |
201 | gfp_t mask); | 203 | gfp_t mask); |
202 | int find_first_extent_bit(struct extent_io_tree *tree, u64 start, | 204 | int find_first_extent_bit(struct extent_io_tree *tree, u64 start, |
@@ -281,9 +283,11 @@ int test_extent_buffer_dirty(struct extent_io_tree *tree, | |||
281 | int set_extent_buffer_uptodate(struct extent_io_tree *tree, | 283 | int set_extent_buffer_uptodate(struct extent_io_tree *tree, |
282 | struct extent_buffer *eb); | 284 | struct extent_buffer *eb); |
283 | int clear_extent_buffer_uptodate(struct extent_io_tree *tree, | 285 | int clear_extent_buffer_uptodate(struct extent_io_tree *tree, |
284 | struct extent_buffer *eb); | 286 | struct extent_buffer *eb, |
287 | struct extent_state **cached_state); | ||
285 | int extent_buffer_uptodate(struct extent_io_tree *tree, | 288 | int extent_buffer_uptodate(struct extent_io_tree *tree, |
286 | struct extent_buffer *eb); | 289 | struct extent_buffer *eb, |
290 | struct extent_state *cached_state); | ||
287 | int map_extent_buffer(struct extent_buffer *eb, unsigned long offset, | 291 | int map_extent_buffer(struct extent_buffer *eb, unsigned long offset, |
288 | unsigned long min_len, char **token, char **map, | 292 | unsigned long min_len, char **token, char **map, |
289 | unsigned long *map_start, | 293 | unsigned long *map_start, |