btrfs: Remove special handling of EXTENT_BUFFER_UNMAPPED while freeing
authorNikolay Borisov <nborisov@suse.com>
Wed, 15 Aug 2018 15:26:57 +0000 (18:26 +0300)
committerDavid Sterba <dsterba@suse.com>
Mon, 17 Dec 2018 13:51:31 +0000 (14:51 +0100)
Now that the whole of btrfs code has been audited for eb reference count
management it's time to remove the hunk in free_extent_buffer that
essentially considered the condition

  "eb->ref == 2 && EXTENT_BUFFER_DUMMY"

to equal "eb->ref = 1". Also remove the last location
which takes an extra reference count in alloc_test_extent_buffer.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c
fs/btrfs/tests/btrfs-tests.c

index 160efb201ef3491ab2a3bf9bf8b8060d39eb1cea..39a41e8777fc5dbd4062ad1026cfc7f171500117 100644 (file)
@@ -4893,13 +4893,6 @@ again:
        check_buffer_tree_ref(eb);
        set_bit(EXTENT_BUFFER_IN_TREE, &eb->bflags);
 
-       /*
-        * We will free dummy extent buffer's if they come into
-        * free_extent_buffer with a ref count of 2, but if we are using this we
-        * want the buffers to stay in memory until we're done with them, so
-        * bump the ref count again.
-        */
-       atomic_inc(&eb->refs);
        return eb;
 free_eb:
        btrfs_release_extent_buffer(eb);
@@ -5089,10 +5082,6 @@ void free_extent_buffer(struct extent_buffer *eb)
        }
 
        spin_lock(&eb->refs_lock);
-       if (atomic_read(&eb->refs) == 2 &&
-           test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags))
-               atomic_dec(&eb->refs);
-
        if (atomic_read(&eb->refs) == 2 &&
            test_bit(EXTENT_BUFFER_STALE, &eb->bflags) &&
            !extent_buffer_under_io(eb) &&
index db72b3b6209e000e8d4a1a94507ed9185715dd28..4cb8fcfd3ec41e822727b5db56fdd3964f2cd582 100644 (file)
@@ -174,8 +174,12 @@ void btrfs_free_dummy_root(struct btrfs_root *root)
        /* Will be freed by btrfs_free_fs_roots */
        if (WARN_ON(test_bit(BTRFS_ROOT_IN_RADIX, &root->state)))
                return;
-       if (root->node)
+       if (root->node) {
+               /* One for allocate_extent_buffer */
                free_extent_buffer(root->node);
+               /* One for get_exent_buffer */
+               free_extent_buffer(root->node);
+       }
        kfree(root);
 }