diff options
Diffstat (limited to 'extent_io.c')
-rw-r--r-- | extent_io.c | 64 |
1 files changed, 33 insertions, 31 deletions
diff --git a/extent_io.c b/extent_io.c index 592acd61..464bd07e 100644 --- a/extent_io.c +++ b/extent_io.c @@ -48,13 +48,14 @@ static struct extent_state *alloc_extent_state(void) state = malloc(sizeof(*state)); if (!state) return NULL; + state->cache_node.objectid = 0; state->refs = 1; state->state = 0; state->xprivate = 0; return state; } -static void free_extent_state(struct extent_state *state) +static void btrfs_free_extent_state(struct extent_state *state) { state->refs--; BUG_ON(state->refs < 0); @@ -62,11 +63,17 @@ static void free_extent_state(struct extent_state *state) free(state); } -void extent_io_tree_cleanup(struct extent_io_tree *tree) +static void free_extent_state_func(struct cache_extent *cache) { struct extent_state *es; + + es = container_of(cache, struct extent_state, cache_node); + btrfs_free_extent_state(es); +} + +void extent_io_tree_cleanup(struct extent_io_tree *tree) +{ struct extent_buffer *eb; - struct cache_extent *cache; while(!list_empty(&tree->lru)) { eb = list_entry(tree->lru.next, struct extent_buffer, lru); @@ -78,14 +85,8 @@ void extent_io_tree_cleanup(struct extent_io_tree *tree) } free_extent_buffer(eb); } - while (1) { - cache = find_first_cache_extent(&tree->state, 0); - if (!cache) - break; - es = container_of(cache, struct extent_state, cache_node); - remove_cache_extent(&tree->state, &es->cache_node); - free_extent_state(es); - } + + cache_tree_free_extents(&tree->state, free_extent_state_func); } static inline void update_extent_state(struct extent_state *state) @@ -118,7 +119,7 @@ static int merge_state(struct extent_io_tree *tree, state->start = other->start; update_extent_state(state); remove_cache_extent(&tree->state, &other->cache_node); - free_extent_state(other); + btrfs_free_extent_state(other); } } other_node = next_cache_extent(&state->cache_node); @@ -130,7 +131,7 @@ static int merge_state(struct extent_io_tree *tree, other->start = state->start; update_extent_state(other); remove_cache_extent(&tree->state, &state->cache_node); - free_extent_state(state); + btrfs_free_extent_state(state); } } return 0; @@ -151,7 +152,7 @@ static int insert_state(struct extent_io_tree *tree, state->start = start; state->end = end; update_extent_state(state); - ret = insert_existing_cache_extent(&tree->state, &state->cache_node); + ret = insert_cache_extent(&tree->state, &state->cache_node); BUG_ON(ret); merge_state(tree, state); return 0; @@ -172,8 +173,7 @@ static int split_state(struct extent_io_tree *tree, struct extent_state *orig, update_extent_state(prealloc); orig->start = split; update_extent_state(orig); - ret = insert_existing_cache_extent(&tree->state, - &prealloc->cache_node); + ret = insert_cache_extent(&tree->state, &prealloc->cache_node); BUG_ON(ret); return 0; } @@ -189,7 +189,7 @@ static int clear_state_bit(struct extent_io_tree *tree, state->state &= ~bits; if (state->state == 0) { remove_cache_extent(&tree->state, &state->cache_node); - free_extent_state(state); + btrfs_free_extent_state(state); } else { merge_state(tree, state); } @@ -218,7 +218,7 @@ again: * this search will find the extents that end after * our range starts */ - node = find_first_cache_extent(&tree->state, start); + node = search_cache_extent(&tree->state, start); if (!node) goto out; state = container_of(node, struct extent_state, cache_node); @@ -280,7 +280,7 @@ again: goto search_again; out: if (prealloc) - free_extent_state(prealloc); + btrfs_free_extent_state(prealloc); return set; search_again: @@ -312,7 +312,7 @@ again: * this search will find the extents that end after * our range starts */ - node = find_first_cache_extent(&tree->state, start); + node = search_cache_extent(&tree->state, start); if (!node) { err = insert_state(tree, prealloc, start, end, bits); BUG_ON(err == -EEXIST); @@ -408,7 +408,7 @@ again: prealloc = NULL; out: if (prealloc) - free_extent_state(prealloc); + btrfs_free_extent_state(prealloc); return err; search_again: if (start > end) @@ -439,7 +439,7 @@ int find_first_extent_bit(struct extent_io_tree *tree, u64 start, * this search will find all the extents that end after * our range starts. */ - node = find_first_cache_extent(&tree->state, start); + node = search_cache_extent(&tree->state, start); if (!node) goto out; @@ -466,7 +466,7 @@ int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end, struct cache_extent *node; int bitset = 0; - node = find_first_cache_extent(&tree->state, start); + node = search_cache_extent(&tree->state, start); while (node && start <= end) { state = container_of(node, struct extent_state, cache_node); @@ -503,7 +503,7 @@ int set_state_private(struct extent_io_tree *tree, u64 start, u64 private) struct extent_state *state; int ret = 0; - node = find_first_cache_extent(&tree->state, start); + node = search_cache_extent(&tree->state, start); if (!node) { ret = -ENOENT; goto out; @@ -524,7 +524,7 @@ int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private) struct extent_state *state; int ret = 0; - node = find_first_cache_extent(&tree->state, start); + node = search_cache_extent(&tree->state, start); if (!node) { ret = -ENOENT; goto out; @@ -587,7 +587,7 @@ static struct extent_buffer *__alloc_extent_buffer(struct extent_io_tree *tree, eb->cache_node.size = blocksize; free_some_buffers(tree); - ret = insert_existing_cache_extent(&tree->cache, &eb->cache_node); + ret = insert_cache_extent(&tree->cache, &eb->cache_node); if (ret) { free(eb); return NULL; @@ -621,8 +621,9 @@ struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree, struct extent_buffer *eb = NULL; struct cache_extent *cache; - cache = find_cache_extent(&tree->cache, bytenr, blocksize); - if (cache && cache->start == bytenr && cache->size == blocksize) { + cache = lookup_cache_extent(&tree->cache, bytenr, blocksize); + if (cache && cache->start == bytenr && + cache->size == blocksize) { eb = container_of(cache, struct extent_buffer, cache_node); list_move_tail(&eb->lru, &tree->lru); eb->refs++; @@ -636,7 +637,7 @@ struct extent_buffer *find_first_extent_buffer(struct extent_io_tree *tree, struct extent_buffer *eb = NULL; struct cache_extent *cache; - cache = find_first_cache_extent(&tree->cache, start); + cache = search_cache_extent(&tree->cache, start); if (cache) { eb = container_of(cache, struct extent_buffer, cache_node); list_move_tail(&eb->lru, &tree->lru); @@ -651,8 +652,9 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree, struct extent_buffer *eb; struct cache_extent *cache; - cache = find_cache_extent(&tree->cache, bytenr, blocksize); - if (cache && cache->start == bytenr && cache->size == blocksize) { + cache = lookup_cache_extent(&tree->cache, bytenr, blocksize); + if (cache && cache->start == bytenr && + cache->size == blocksize) { eb = container_of(cache, struct extent_buffer, cache_node); list_move_tail(&eb->lru, &tree->lru); eb->refs++; |