Merge tag 'for-5.11/drivers-2020-12-14' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / fs / btrfs / extent-tree.c
index 5fd60b1..56ea380 100644 (file)
@@ -1465,7 +1465,6 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
        if (!path)
                return -ENOMEM;
 
-       path->leave_spinning = 1;
        /* this will setup the path even if it fails to insert the back ref */
        ret = insert_inline_extent_backref(trans, path, bytenr, num_bytes,
                                           parent, root_objectid, owner,
@@ -1489,7 +1488,6 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
        btrfs_mark_buffer_dirty(leaf);
        btrfs_release_path(path);
 
-       path->leave_spinning = 1;
        /* now insert the actual backref */
        if (owner < BTRFS_FIRST_FREE_OBJECTID) {
                BUG_ON(refs_to_add != 1);
@@ -1605,7 +1603,6 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,
        }
 
 again:
-       path->leave_spinning = 1;
        ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 1);
        if (ret < 0) {
                err = ret;
@@ -2132,25 +2129,6 @@ static u64 find_middle(struct rb_root *root)
 }
 #endif
 
-/*
- * Takes the number of bytes to be csumm'ed and figures out how many leaves it
- * would require to store the csums for that many bytes.
- */
-u64 btrfs_csum_bytes_to_leaves(struct btrfs_fs_info *fs_info, u64 csum_bytes)
-{
-       u64 csum_size;
-       u64 num_csums_per_leaf;
-       u64 num_csums;
-
-       csum_size = BTRFS_MAX_ITEM_SIZE(fs_info);
-       num_csums_per_leaf = div64_u64(csum_size,
-                       (u64)btrfs_super_csum_size(fs_info->super_copy));
-       num_csums = div64_u64(csum_bytes, fs_info->sectorsize);
-       num_csums += num_csums_per_leaf - 1;
-       num_csums = div64_u64(num_csums, num_csums_per_leaf);
-       return num_csums;
-}
-
 /*
  * this starts processing the delayed reference count updates and
  * extent insertions we have queued up so far.  count can be
@@ -2663,6 +2641,11 @@ static int __exclude_logged_extent(struct btrfs_fs_info *fs_info,
                BUG_ON(!btrfs_block_group_done(block_group));
                ret = btrfs_remove_free_space(block_group, start, num_bytes);
        } else {
+               /*
+                * We must wait for v1 caching to finish, otherwise we may not
+                * remove our space.
+                */
+               btrfs_wait_space_cache_v1_finished(block_group, caching_ctl);
                mutex_lock(&caching_ctl->mutex);
 
                if (start >= caching_ctl->progress) {
@@ -2730,31 +2713,6 @@ btrfs_inc_block_group_reservations(struct btrfs_block_group *bg)
        atomic_inc(&bg->reservations);
 }
 
-void btrfs_prepare_extent_commit(struct btrfs_fs_info *fs_info)
-{
-       struct btrfs_caching_control *next;
-       struct btrfs_caching_control *caching_ctl;
-       struct btrfs_block_group *cache;
-
-       down_write(&fs_info->commit_root_sem);
-
-       list_for_each_entry_safe(caching_ctl, next,
-                                &fs_info->caching_block_groups, list) {
-               cache = caching_ctl->block_group;
-               if (btrfs_block_group_done(cache)) {
-                       cache->last_byte_to_unpin = (u64)-1;
-                       list_del_init(&caching_ctl->list);
-                       btrfs_put_caching_control(caching_ctl);
-               } else {
-                       cache->last_byte_to_unpin = caching_ctl->progress;
-               }
-       }
-
-       up_write(&fs_info->commit_root_sem);
-
-       btrfs_update_global_block_rsv(fs_info);
-}
-
 /*
  * Returns the free cluster for the given space info and sets empty_cluster to
  * what it should be based on the mount options.
@@ -2816,11 +2774,13 @@ static int unpin_extent_range(struct btrfs_fs_info *fs_info,
                len = cache->start + cache->length - start;
                len = min(len, end + 1 - start);
 
-               if (start < cache->last_byte_to_unpin) {
-                       len = min(len, cache->last_byte_to_unpin - start);
-                       if (return_free_space)
-                               btrfs_add_free_space(cache, start, len);
+               down_read(&fs_info->commit_root_sem);
+               if (start < cache->last_byte_to_unpin && return_free_space) {
+                       u64 add_len = min(len, cache->last_byte_to_unpin - start);
+
+                       btrfs_add_free_space(cache, start, add_len);
                }
+               up_read(&fs_info->commit_root_sem);
 
                start += len;
                total_unpinned += len;
@@ -3040,8 +3000,6 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
        if (!path)
                return -ENOMEM;
 
-       path->leave_spinning = 1;
-
        is_data = owner_objectid >= BTRFS_FIRST_FREE_OBJECTID;
 
        if (!is_data && refs_to_drop != 1) {
@@ -3106,7 +3064,6 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
                                goto out;
                        }
                        btrfs_release_path(path);
-                       path->leave_spinning = 1;
 
                        /* Slow path to locate EXTENT/METADATA_ITEM */
                        key.objectid = bytenr;
@@ -4448,7 +4405,6 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
        if (!path)
                return -ENOMEM;
 
-       path->leave_spinning = 1;
        ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path,
                                      ins, size);
        if (ret) {
@@ -4533,7 +4489,6 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
        if (!path)
                return -ENOMEM;
 
-       path->leave_spinning = 1;
        ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path,
                                      &extent_key, size);
        if (ret) {
@@ -4662,7 +4617,7 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
        struct btrfs_fs_info *fs_info = root->fs_info;
        struct extent_buffer *buf;
 
-       buf = btrfs_find_create_tree_block(fs_info, bytenr);
+       buf = btrfs_find_create_tree_block(fs_info, bytenr, owner, level);
        if (IS_ERR(buf))
                return buf;
 
@@ -4679,12 +4634,16 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
                return ERR_PTR(-EUCLEAN);
        }
 
+       /*
+        * This needs to stay, because we could allocate a freed block from an
+        * old tree into a new tree, so we need to make sure this new block is
+        * set to the appropriate level and owner.
+        */
        btrfs_set_buffer_lockdep_class(owner, buf, level);
        __btrfs_tree_lock(buf, nest);
        btrfs_clean_tree_block(buf);
        clear_bit(EXTENT_BUFFER_STALE, &buf->bflags);
 
-       btrfs_set_lock_blocking_write(buf);
        set_extent_buffer_uptodate(buf);
 
        memzero_extent_buffer(buf, 0, sizeof(struct btrfs_header));
@@ -4905,7 +4864,7 @@ static noinline void reada_walk_down(struct btrfs_trans_handle *trans,
                                continue;
                }
 reada:
-               readahead_tree_block(fs_info, bytenr);
+               btrfs_readahead_node_child(eb, slot);
                nread++;
        }
        wc->reada_slot = slot;
@@ -5064,16 +5023,13 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
 
        next = find_extent_buffer(fs_info, bytenr);
        if (!next) {
-               next = btrfs_find_create_tree_block(fs_info, bytenr);
+               next = btrfs_find_create_tree_block(fs_info, bytenr,
+                               root->root_key.objectid, level - 1);
                if (IS_ERR(next))
                        return PTR_ERR(next);
-
-               btrfs_set_buffer_lockdep_class(root->root_key.objectid, next,
-                                              level - 1);
                reada = 1;
        }
        btrfs_tree_lock(next);
-       btrfs_set_lock_blocking_write(next);
 
        ret = btrfs_lookup_extent_info(trans, fs_info, bytenr, level - 1, 1,
                                       &wc->refs[level - 1],
@@ -5124,8 +5080,8 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
        if (!next) {
                if (reada && level == 1)
                        reada_walk_down(trans, root, wc, path);
-               next = read_tree_block(fs_info, bytenr, generation, level - 1,
-                                      &first_key);
+               next = read_tree_block(fs_info, bytenr, root->root_key.objectid,
+                                      generation, level - 1, &first_key);
                if (IS_ERR(next)) {
                        return PTR_ERR(next);
                } else if (!extent_buffer_uptodate(next)) {
@@ -5133,7 +5089,6 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
                        return -EIO;
                }
                btrfs_tree_lock(next);
-               btrfs_set_lock_blocking_write(next);
        }
 
        level--;
@@ -5145,7 +5100,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
        }
        path->nodes[level] = next;
        path->slots[level] = 0;
-       path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
+       path->locks[level] = BTRFS_WRITE_LOCK;
        wc->level = level;
        if (wc->level == 1)
                wc->reada_slot = 0;
@@ -5273,8 +5228,7 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans,
                if (!path->locks[level]) {
                        BUG_ON(level == 0);
                        btrfs_tree_lock(eb);
-                       btrfs_set_lock_blocking_write(eb);
-                       path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
+                       path->locks[level] = BTRFS_WRITE_LOCK;
 
                        ret = btrfs_lookup_extent_info(trans, fs_info,
                                                       eb->start, level, 1,
@@ -5317,8 +5271,7 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans,
                if (!path->locks[level] &&
                    btrfs_header_generation(eb) == trans->transid) {
                        btrfs_tree_lock(eb);
-                       btrfs_set_lock_blocking_write(eb);
-                       path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
+                       path->locks[level] = BTRFS_WRITE_LOCK;
                }
                btrfs_clean_tree_block(eb);
        }
@@ -5486,9 +5439,8 @@ int btrfs_drop_snapshot(struct btrfs_root *root, int update_ref, int for_reloc)
        if (btrfs_disk_key_objectid(&root_item->drop_progress) == 0) {
                level = btrfs_header_level(root->node);
                path->nodes[level] = btrfs_lock_root_node(root);
-               btrfs_set_lock_blocking_write(path->nodes[level]);
                path->slots[level] = 0;
-               path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
+               path->locks[level] = BTRFS_WRITE_LOCK;
                memset(&wc->update_progress, 0,
                       sizeof(wc->update_progress));
        } else {
@@ -5496,7 +5448,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, int update_ref, int for_reloc)
                memcpy(&wc->update_progress, &key,
                       sizeof(wc->update_progress));
 
-               level = root_item->drop_level;
+               level = btrfs_root_drop_level(root_item);
                BUG_ON(level == 0);
                path->lowest_level = level;
                ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
@@ -5516,8 +5468,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, int update_ref, int for_reloc)
                level = btrfs_header_level(root->node);
                while (1) {
                        btrfs_tree_lock(path->nodes[level]);
-                       btrfs_set_lock_blocking_write(path->nodes[level]);
-                       path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
+                       path->locks[level] = BTRFS_WRITE_LOCK;
 
                        ret = btrfs_lookup_extent_info(trans, fs_info,
                                                path->nodes[level]->start,
@@ -5529,7 +5480,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, int update_ref, int for_reloc)
                        }
                        BUG_ON(wc->refs[level] == 0);
 
-                       if (level == root_item->drop_level)
+                       if (level == btrfs_root_drop_level(root_item))
                                break;
 
                        btrfs_tree_unlock(path->nodes[level]);
@@ -5574,7 +5525,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, int update_ref, int for_reloc)
                }
                btrfs_cpu_key_to_disk(&root_item->drop_progress,
                                      &wc->drop_progress);
-               root_item->drop_level = wc->drop_level;
+               btrfs_set_root_drop_level(root_item, wc->drop_level);
 
                BUG_ON(wc->level == 0);
                if (btrfs_should_end_transaction(trans) ||
@@ -5704,7 +5655,7 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans,
        level = btrfs_header_level(node);
        path->nodes[level] = node;
        path->slots[level] = 0;
-       path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
+       path->locks[level] = BTRFS_WRITE_LOCK;
 
        wc->refs[parent_level] = 1;
        wc->flags[parent_level] = BTRFS_BLOCK_FLAG_FULL_BACKREF;