summaryrefslogtreecommitdiff
path: root/extent_io.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fb.com>2014-10-10 16:57:07 -0400
committerDavid Sterba <dsterba@suse.cz>2014-10-14 10:39:38 +0200
commitd90d8d2323cdee2bdb3b130236c801ceeb8ea875 (patch)
tree7ad61eb1363ee1c6c940c55accf54ebac37662f1 /extent_io.c
parent6863bcf74fa8bf335d73c04248fc25ac6ada3121 (diff)
Btrfs-progs: pull back backref.c and fix it up
This patch pulls back backref.c, adds a couple of helpers everywhere that it needs, and cleans up backref.c to fit in btrfs-progs. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> [removed free_some_buffers after "do not reclaim extent buffer"] Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'extent_io.c')
-rw-r--r--extent_io.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/extent_io.c b/extent_io.c
index 425af8a0..de9e0ecc 100644
--- a/extent_io.c
+++ b/extent_io.c
@@ -539,7 +539,6 @@ static struct extent_buffer *__alloc_extent_buffer(struct extent_io_tree *tree,
u64 bytenr, u32 blocksize)
{
struct extent_buffer *eb;
- int ret;
eb = malloc(sizeof(struct extent_buffer) + blocksize);
if (!eb) {
@@ -559,16 +558,23 @@ static struct extent_buffer *__alloc_extent_buffer(struct extent_io_tree *tree,
eb->cache_node.size = blocksize;
INIT_LIST_HEAD(&eb->recow);
- ret = insert_cache_extent(&tree->cache, &eb->cache_node);
- if (ret) {
- free(eb);
- return NULL;
- }
- list_add_tail(&eb->lru, &tree->lru);
- tree->cache_size += blocksize;
return eb;
}
+struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)
+{
+ struct extent_buffer *new;
+
+ new = __alloc_extent_buffer(NULL, src->start, src->len);
+ if (new == NULL)
+ return NULL;
+
+ copy_extent_buffer(new, src, 0, 0, src->len);
+ new->flags |= EXTENT_BUFFER_DUMMY;
+
+ return new;
+}
+
void free_extent_buffer(struct extent_buffer *eb)
{
if (!eb)
@@ -581,9 +587,11 @@ void free_extent_buffer(struct extent_buffer *eb)
BUG_ON(eb->flags & EXTENT_DIRTY);
list_del_init(&eb->lru);
list_del_init(&eb->recow);
- remove_cache_extent(&tree->cache, &eb->cache_node);
- BUG_ON(tree->cache_size < eb->len);
- tree->cache_size -= eb->len;
+ if (!(eb->flags & EXTENT_BUFFER_DUMMY)) {
+ BUG_ON(tree->cache_size < eb->len);
+ remove_cache_extent(&tree->cache, &eb->cache_node);
+ tree->cache_size -= eb->len;
+ }
free(eb);
}
}
@@ -632,12 +640,23 @@ struct extent_buffer *alloc_extent_buffer(struct extent_io_tree *tree,
list_move_tail(&eb->lru, &tree->lru);
eb->refs++;
} else {
+ int ret;
+
if (cache) {
eb = container_of(cache, struct extent_buffer,
cache_node);
free_extent_buffer(eb);
}
eb = __alloc_extent_buffer(tree, bytenr, blocksize);
+ if (!eb)
+ return NULL;
+ ret = insert_cache_extent(&tree->cache, &eb->cache_node);
+ if (ret) {
+ free(eb);
+ return NULL;
+ }
+ list_add_tail(&eb->lru, &tree->lru);
+ tree->cache_size += blocksize;
}
return eb;
}