]> Pileus Git - ~andy/linux/blobdiff - fs/btrfs/extent_map.c
Merge tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
[~andy/linux] / fs / btrfs / extent_map.c
index 1fe82cfc1d933986863608eb24dd586ba609a10b..b8cbc8d5c7f7cb39ed770fb2b256427f25bb9c69 100644 (file)
@@ -11,7 +11,7 @@ static struct kmem_cache *extent_map_cache;
 
 int __init extent_map_init(void)
 {
-       extent_map_cache = kmem_cache_create("extent_map",
+       extent_map_cache = kmem_cache_create("btrfs_extent_map",
                        sizeof(struct extent_map), 0,
                        SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, NULL);
        if (!extent_map_cache)
@@ -203,6 +203,8 @@ static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em)
                        em->block_start = merge->block_start;
                        merge->in_tree = 0;
                        if (merge->generation > em->generation) {
+                               em->mod_start = em->start;
+                               em->mod_len = em->len;
                                em->generation = merge->generation;
                                list_move(&em->list, &tree->modified_extents);
                        }
@@ -222,6 +224,7 @@ static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em)
                rb_erase(&merge->rb_node, &tree->map);
                merge->in_tree = 0;
                if (merge->generation > em->generation) {
+                       em->mod_len = em->len;
                        em->generation = merge->generation;
                        list_move(&em->list, &tree->modified_extents);
                }
@@ -247,6 +250,7 @@ int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len,
 {
        int ret = 0;
        struct extent_map *em;
+       bool prealloc = false;
 
        write_lock(&tree->lock);
        em = lookup_extent_mapping(tree, start, len);
@@ -259,8 +263,21 @@ int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len,
        list_move(&em->list, &tree->modified_extents);
        em->generation = gen;
        clear_bit(EXTENT_FLAG_PINNED, &em->flags);
+       em->mod_start = em->start;
+       em->mod_len = em->len;
+
+       if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) {
+               prealloc = true;
+               clear_bit(EXTENT_FLAG_PREALLOC, &em->flags);
+       }
 
        try_merge_map(tree, em);
+
+       if (prealloc) {
+               em->mod_start = em->start;
+               em->mod_len = em->len;
+       }
+
        free_extent_map(em);
 out:
        write_unlock(&tree->lock);
@@ -298,6 +315,9 @@ int add_extent_mapping(struct extent_map_tree *tree,
        }
        atomic_inc(&em->refs);
 
+       em->mod_start = em->start;
+       em->mod_len = em->len;
+
        try_merge_map(tree, em);
 out:
        return ret;
@@ -387,7 +407,8 @@ int remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em)
 
        WARN_ON(test_bit(EXTENT_FLAG_PINNED, &em->flags));
        rb_erase(&em->rb_node, &tree->map);
-       list_del_init(&em->list);
+       if (!test_bit(EXTENT_FLAG_LOGGING, &em->flags))
+               list_del_init(&em->list);
        em->in_tree = 0;
        return ret;
 }