Merge branch 'x86-seccomp-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / ctree.c
index 44ee5d2e52a41935828ac954ebeefe8ce17568e6..19bc6162fb8e899cc51bd3d777fcbddf91589aa6 100644 (file)
@@ -258,9 +258,8 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans,
        else
                btrfs_node_key(buf, &disk_key, 0);
 
-       cow = btrfs_alloc_free_block(trans, root, buf->len, 0,
-                                    new_root_objectid, &disk_key, level,
-                                    buf->start, 0);
+       cow = btrfs_alloc_tree_block(trans, root, 0, new_root_objectid,
+                       &disk_key, level, buf->start, 0);
        if (IS_ERR(cow))
                return PTR_ERR(cow);
 
@@ -1133,9 +1132,9 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
        } else
                parent_start = 0;
 
-       cow = btrfs_alloc_free_block(trans, root, buf->len, parent_start,
-                                    root->root_key.objectid, &disk_key,
-                                    level, search_start, empty_size);
+       cow = btrfs_alloc_tree_block(trans, root, parent_start,
+                       root->root_key.objectid, &disk_key, level,
+                       search_start, empty_size);
        if (IS_ERR(cow))
                return PTR_ERR(cow);
 
@@ -1425,7 +1424,6 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
        struct tree_mod_root *old_root = NULL;
        u64 old_generation = 0;
        u64 logical;
-       u32 blocksize;
 
        eb_root = btrfs_read_lock_root_node(root);
        tm = __tree_mod_log_oldest_root(root->fs_info, eb_root, time_seq);
@@ -1444,8 +1442,7 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
        if (old_root && tm && tm->op != MOD_LOG_KEY_REMOVE_WHILE_FREEING) {
                btrfs_tree_read_unlock(eb_root);
                free_extent_buffer(eb_root);
-               blocksize = btrfs_level_size(root, old_root->level);
-               old = read_tree_block(root, logical, blocksize, 0);
+               old = read_tree_block(root, logical, 0);
                if (WARN_ON(!old || !extent_buffer_uptodate(old))) {
                        free_extent_buffer(old);
                        btrfs_warn(root->fs_info,
@@ -1506,10 +1503,9 @@ static inline int should_cow_block(struct btrfs_trans_handle *trans,
                                   struct btrfs_root *root,
                                   struct extent_buffer *buf)
 {
-#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
-       if (unlikely(test_bit(BTRFS_ROOT_DUMMY_ROOT, &root->state)))
+       if (btrfs_test_is_dummy_root(root))
                return 0;
-#endif
+
        /* ensure we can see the force_cow */
        smp_rmb();
 
@@ -1651,7 +1647,7 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,
        WARN_ON(trans->transid != root->fs_info->generation);
 
        parent_nritems = btrfs_header_nritems(parent);
-       blocksize = btrfs_level_size(root, parent_level - 1);
+       blocksize = root->nodesize;
        end_slot = parent_nritems;
 
        if (parent_nritems == 1)
@@ -1685,15 +1681,14 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,
                        continue;
                }
 
-               cur = btrfs_find_tree_block(root, blocknr, blocksize);
+               cur = btrfs_find_tree_block(root, blocknr);
                if (cur)
                        uptodate = btrfs_buffer_uptodate(cur, gen, 0);
                else
                        uptodate = 0;
                if (!cur || !uptodate) {
                        if (!cur) {
-                               cur = read_tree_block(root, blocknr,
-                                                        blocksize, gen);
+                               cur = read_tree_block(root, blocknr, gen);
                                if (!cur || !extent_buffer_uptodate(cur)) {
                                        free_extent_buffer(cur);
                                        return -EIO;
@@ -1872,7 +1867,6 @@ static noinline struct extent_buffer *read_node_slot(struct btrfs_root *root,
        BUG_ON(level == 0);
 
        eb = read_tree_block(root, btrfs_node_blockptr(parent, slot),
-                            btrfs_level_size(root, level - 1),
                             btrfs_node_ptr_generation(parent, slot));
        if (eb && !extent_buffer_uptodate(eb)) {
                free_extent_buffer(eb);
@@ -2267,8 +2261,8 @@ static void reada_for_search(struct btrfs_root *root,
        node = path->nodes[level];
 
        search = btrfs_node_blockptr(node, slot);
-       blocksize = btrfs_level_size(root, level - 1);
-       eb = btrfs_find_tree_block(root, search, blocksize);
+       blocksize = root->nodesize;
+       eb = btrfs_find_tree_block(root, search);
        if (eb) {
                free_extent_buffer(eb);
                return;
@@ -2298,7 +2292,7 @@ static void reada_for_search(struct btrfs_root *root,
                if ((search <= target && target - search <= 65536) ||
                    (search > target && search - target <= 65536)) {
                        gen = btrfs_node_ptr_generation(node, nr);
-                       readahead_tree_block(root, search, blocksize, gen);
+                       readahead_tree_block(root, search, blocksize);
                        nread += blocksize;
                }
                nscan++;
@@ -2325,12 +2319,12 @@ static noinline void reada_for_balance(struct btrfs_root *root,
 
        nritems = btrfs_header_nritems(parent);
        slot = path->slots[level + 1];
-       blocksize = btrfs_level_size(root, level);
+       blocksize = root->nodesize;
 
        if (slot > 0) {
                block1 = btrfs_node_blockptr(parent, slot - 1);
                gen = btrfs_node_ptr_generation(parent, slot - 1);
-               eb = btrfs_find_tree_block(root, block1, blocksize);
+               eb = btrfs_find_tree_block(root, block1);
                /*
                 * if we get -eagain from btrfs_buffer_uptodate, we
                 * don't want to return eagain here.  That will loop
@@ -2343,16 +2337,16 @@ static noinline void reada_for_balance(struct btrfs_root *root,
        if (slot + 1 < nritems) {
                block2 = btrfs_node_blockptr(parent, slot + 1);
                gen = btrfs_node_ptr_generation(parent, slot + 1);
-               eb = btrfs_find_tree_block(root, block2, blocksize);
+               eb = btrfs_find_tree_block(root, block2);
                if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0)
                        block2 = 0;
                free_extent_buffer(eb);
        }
 
        if (block1)
-               readahead_tree_block(root, block1, blocksize, 0);
+               readahead_tree_block(root, block1, blocksize);
        if (block2)
-               readahead_tree_block(root, block2, blocksize, 0);
+               readahead_tree_block(root, block2, blocksize);
 }
 
 
@@ -2454,16 +2448,14 @@ read_block_for_search(struct btrfs_trans_handle *trans,
 {
        u64 blocknr;
        u64 gen;
-       u32 blocksize;
        struct extent_buffer *b = *eb_ret;
        struct extent_buffer *tmp;
        int ret;
 
        blocknr = btrfs_node_blockptr(b, slot);
        gen = btrfs_node_ptr_generation(b, slot);
-       blocksize = btrfs_level_size(root, level - 1);
 
-       tmp = btrfs_find_tree_block(root, blocknr, blocksize);
+       tmp = btrfs_find_tree_block(root, blocknr);
        if (tmp) {
                /* first we do an atomic uptodate check */
                if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) {
@@ -2507,7 +2499,7 @@ read_block_for_search(struct btrfs_trans_handle *trans,
        btrfs_release_path(p);
 
        ret = -EAGAIN;
-       tmp = read_tree_block(root, blocknr, blocksize, 0);
+       tmp = read_tree_block(root, blocknr, 0);
        if (tmp) {
                /*
                 * If the read above didn't mark this buffer up to date,
@@ -2792,8 +2784,6 @@ again:
                        if (!should_cow_block(trans, root, b))
                                goto cow_done;
 
-                       btrfs_set_path_blocking(p);
-
                        /*
                         * must have write locks on this node and the
                         * parent
@@ -2807,6 +2797,7 @@ again:
                                goto again;
                        }
 
+                       btrfs_set_path_blocking(p);
                        err = btrfs_cow_block(trans, root, b,
                                              p->nodes[level + 1],
                                              p->slots[level + 1], &b);
@@ -3362,9 +3353,8 @@ static noinline int insert_new_root(struct btrfs_trans_handle *trans,
        else
                btrfs_node_key(lower, &lower_key, 0);
 
-       c = btrfs_alloc_free_block(trans, root, root->nodesize, 0,
-                                  root->root_key.objectid, &lower_key,
-                                  level, root->node->start, 0);
+       c = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
+                                  &lower_key, level, root->node->start, 0);
        if (IS_ERR(c))
                return PTR_ERR(c);
 
@@ -3502,9 +3492,8 @@ static noinline int split_node(struct btrfs_trans_handle *trans,
        mid = (c_nritems + 1) / 2;
        btrfs_node_key(c, &disk_key, mid);
 
-       split = btrfs_alloc_free_block(trans, root, root->nodesize, 0,
-                                       root->root_key.objectid,
-                                       &disk_key, level, c->start, 0);
+       split = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
+                       &disk_key, level, c->start, 0);
        if (IS_ERR(split))
                return PTR_ERR(split);
 
@@ -4282,13 +4271,12 @@ again:
        else
                btrfs_item_key(l, &disk_key, mid);
 
-       right = btrfs_alloc_free_block(trans, root, root->leafsize, 0,
-                                       root->root_key.objectid,
-                                       &disk_key, 0, l->start, 0);
+       right = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
+                       &disk_key, 0, l->start, 0);
        if (IS_ERR(right))
                return PTR_ERR(right);
 
-       root_add_used(root, root->leafsize);
+       root_add_used(root, root->nodesize);
 
        memset_extent_buffer(right, 0, 0, sizeof(struct btrfs_header));
        btrfs_set_header_bytenr(right, right->start);
@@ -4626,8 +4614,7 @@ void btrfs_truncate_item(struct btrfs_root *root, struct btrfs_path *path,
                                ptr = btrfs_item_ptr_offset(leaf, slot);
                                memmove_extent_buffer(leaf, ptr,
                                      (unsigned long)fi,
-                                     offsetof(struct btrfs_file_extent_item,
-                                                disk_bytenr));
+                                     BTRFS_FILE_EXTENT_INLINE_DATA_START);
                        }
                }
 
@@ -4738,6 +4725,12 @@ void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path,
        int slot;
        struct btrfs_map_token token;
 
+       if (path->slots[0] == 0) {
+               btrfs_cpu_key_to_disk(&disk_key, cpu_key);
+               fixup_low_keys(root, path, &disk_key, 1);
+       }
+       btrfs_unlock_up_safe(path, 1);
+
        btrfs_init_map_token(&token);
 
        leaf = path->nodes[0];
@@ -4798,12 +4791,6 @@ void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path,
        }
 
        btrfs_set_header_nritems(leaf, nritems + nr);
-
-       if (slot == 0) {
-               btrfs_cpu_key_to_disk(&disk_key, cpu_key);
-               fixup_low_keys(root, path, &disk_key, 1);
-       }
-       btrfs_unlock_up_safe(path, 1);
        btrfs_mark_buffer_dirty(leaf);
 
        if (btrfs_leaf_free_space(root, leaf) < 0) {
@@ -5145,8 +5132,9 @@ int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
        u32 nritems;
        int level;
        int ret = 1;
+       int keep_locks = path->keep_locks;
 
-       WARN_ON(!path->keep_locks);
+       path->keep_locks = 1;
 again:
        cur = btrfs_read_lock_root_node(root);
        level = btrfs_header_level(cur);
@@ -5210,7 +5198,6 @@ find_next_key:
                path->slots[level] = slot;
                if (level == path->lowest_level) {
                        ret = 0;
-                       unlock_up(path, level, 1, 0, NULL);
                        goto out;
                }
                btrfs_set_path_blocking(path);
@@ -5225,9 +5212,12 @@ find_next_key:
                btrfs_clear_path_blocking(path, NULL, 0);
        }
 out:
-       if (ret == 0)
+       path->keep_locks = keep_locks;
+       if (ret == 0) {
+               btrfs_unlock_up_safe(path, path->lowest_level + 1);
+               btrfs_set_path_blocking(path);
                memcpy(min_key, &found_key, sizeof(found_key));
-       btrfs_set_path_blocking(path);
+       }
        return ret;
 }
 
@@ -5375,7 +5365,7 @@ int btrfs_compare_trees(struct btrfs_root *left_root,
                goto out;
        }
 
-       tmp_buf = kmalloc(left_root->leafsize, GFP_NOFS);
+       tmp_buf = kmalloc(left_root->nodesize, GFP_NOFS);
        if (!tmp_buf) {
                ret = -ENOMEM;
                goto out;
@@ -5520,18 +5510,18 @@ int btrfs_compare_trees(struct btrfs_root *left_root,
                                        goto out;
                                advance_right = ADVANCE;
                        } else {
-                               enum btrfs_compare_tree_result cmp;
+                               enum btrfs_compare_tree_result result;
 
                                WARN_ON(!extent_buffer_uptodate(left_path->nodes[0]));
                                ret = tree_compare_item(left_root, left_path,
                                                right_path, tmp_buf);
                                if (ret)
-                                       cmp = BTRFS_COMPARE_TREE_CHANGED;
+                                       result = BTRFS_COMPARE_TREE_CHANGED;
                                else
-                                       cmp = BTRFS_COMPARE_TREE_SAME;
+                                       result = BTRFS_COMPARE_TREE_SAME;
                                ret = changed_cb(left_root, right_root,
                                                 left_path, right_path,
-                                                &left_key, cmp, ctx);
+                                                &left_key, result, ctx);
                                if (ret < 0)
                                        goto out;
                                advance_left = ADVANCE;