extent-tree.c (4922f0920966c28d674b03479cdcb7f3939bfbbd) extent-tree.c (7a1636089acfee7562fe79aff7d1b4c57869896d)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2007 Oracle. All rights reserved.
4 */
5
6#include <linux/sched.h>
7#include <linux/sched/signal.h>
8#include <linux/pagemap.h>

--- 3261 unchanged lines hidden (view full) ---

3270 spin_unlock(&head->lock);
3271
3272out_delayed_unlock:
3273 spin_unlock(&delayed_refs->lock);
3274 return 0;
3275}
3276
3277void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2007 Oracle. All rights reserved.
4 */
5
6#include <linux/sched.h>
7#include <linux/sched/signal.h>
8#include <linux/pagemap.h>

--- 3261 unchanged lines hidden (view full) ---

3270 spin_unlock(&head->lock);
3271
3272out_delayed_unlock:
3273 spin_unlock(&delayed_refs->lock);
3274 return 0;
3275}
3276
3277void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
3278 struct btrfs_root *root,
3278 u64 root_id,
3279 struct extent_buffer *buf,
3280 u64 parent, int last_ref)
3281{
3279 struct extent_buffer *buf,
3280 u64 parent, int last_ref)
3281{
3282 struct btrfs_fs_info *fs_info = root->fs_info;
3282 struct btrfs_fs_info *fs_info = trans->fs_info;
3283 struct btrfs_ref generic_ref = { 0 };
3284 int ret;
3285
3286 btrfs_init_generic_ref(&generic_ref, BTRFS_DROP_DELAYED_REF,
3287 buf->start, buf->len, parent);
3288 btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf),
3283 struct btrfs_ref generic_ref = { 0 };
3284 int ret;
3285
3286 btrfs_init_generic_ref(&generic_ref, BTRFS_DROP_DELAYED_REF,
3287 buf->start, buf->len, parent);
3288 btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf),
3289 root->root_key.objectid, 0, false);
3289 root_id, 0, false);
3290
3290
3291 if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) {
3291 if (root_id != BTRFS_TREE_LOG_OBJECTID) {
3292 btrfs_ref_tree_mod(fs_info, &generic_ref);
3293 ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, NULL);
3294 BUG_ON(ret); /* -ENOMEM */
3295 }
3296
3297 if (last_ref && btrfs_header_generation(buf) == trans->transid) {
3298 struct btrfs_block_group *cache;
3299 bool must_pin = false;
3300
3292 btrfs_ref_tree_mod(fs_info, &generic_ref);
3293 ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, NULL);
3294 BUG_ON(ret); /* -ENOMEM */
3295 }
3296
3297 if (last_ref && btrfs_header_generation(buf) == trans->transid) {
3298 struct btrfs_block_group *cache;
3299 bool must_pin = false;
3300
3301 if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) {
3301 if (root_id != BTRFS_TREE_LOG_OBJECTID) {
3302 ret = check_ref_cleanup(trans, buf->start);
3303 if (!ret) {
3304 btrfs_redirty_list_add(trans->transaction, buf);
3305 goto out;
3306 }
3307 }
3308
3309 cache = btrfs_lookup_block_group(fs_info, buf->start);

--- 2157 unchanged lines hidden (view full) ---

5467 } else {
5468 if (wc->flags[level + 1] & BTRFS_BLOCK_FLAG_FULL_BACKREF)
5469 parent = path->nodes[level + 1]->start;
5470 else if (root->root_key.objectid !=
5471 btrfs_header_owner(path->nodes[level + 1]))
5472 goto owner_mismatch;
5473 }
5474
3302 ret = check_ref_cleanup(trans, buf->start);
3303 if (!ret) {
3304 btrfs_redirty_list_add(trans->transaction, buf);
3305 goto out;
3306 }
3307 }
3308
3309 cache = btrfs_lookup_block_group(fs_info, buf->start);

--- 2157 unchanged lines hidden (view full) ---

5467 } else {
5468 if (wc->flags[level + 1] & BTRFS_BLOCK_FLAG_FULL_BACKREF)
5469 parent = path->nodes[level + 1]->start;
5470 else if (root->root_key.objectid !=
5471 btrfs_header_owner(path->nodes[level + 1]))
5472 goto owner_mismatch;
5473 }
5474
5475 btrfs_free_tree_block(trans, root, eb, parent, wc->refs[level] == 1);
5475 btrfs_free_tree_block(trans, btrfs_root_id(root), eb, parent,
5476 wc->refs[level] == 1);
5476out:
5477 wc->refs[level] = 0;
5478 wc->flags[level] = 0;
5479 return 0;
5480
5481owner_mismatch:
5482 btrfs_err_rl(fs_info, "unexpected tree owner, have %llu expect %llu",
5483 btrfs_header_owner(eb), root->root_key.objectid);

--- 651 unchanged lines hidden ---
5477out:
5478 wc->refs[level] = 0;
5479 wc->flags[level] = 0;
5480 return 0;
5481
5482owner_mismatch:
5483 btrfs_err_rl(fs_info, "unexpected tree owner, have %llu expect %llu",
5484 btrfs_header_owner(eb), root->root_key.objectid);

--- 651 unchanged lines hidden ---