backref.c (300aa896e1199bcd0dfb61aae86356714e017355) backref.c (38e3eebff643db725633657d1d87a3be019d1018)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2011 STRATO. All rights reserved.
4 */
5
6#include <linux/mm.h>
7#include <linux/rbtree.h>
8#include <trace/events/btrfs.h>

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

707 ulist_free(parents);
708 return ret;
709}
710
711/*
712 * read tree blocks and add keys where required.
713 */
714static int add_missing_keys(struct btrfs_fs_info *fs_info,
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2011 STRATO. All rights reserved.
4 */
5
6#include <linux/mm.h>
7#include <linux/rbtree.h>
8#include <trace/events/btrfs.h>

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

707 ulist_free(parents);
708 return ret;
709}
710
711/*
712 * read tree blocks and add keys where required.
713 */
714static int add_missing_keys(struct btrfs_fs_info *fs_info,
715 struct preftrees *preftrees)
715 struct preftrees *preftrees, bool lock)
716{
717 struct prelim_ref *ref;
718 struct extent_buffer *eb;
719 struct preftree *tree = &preftrees->indirect_missing_keys;
720 struct rb_node *node;
721
722 while ((node = rb_first_cached(&tree->root))) {
723 ref = rb_entry(node, struct prelim_ref, rbnode);

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

732 if (IS_ERR(eb)) {
733 free_pref(ref);
734 return PTR_ERR(eb);
735 } else if (!extent_buffer_uptodate(eb)) {
736 free_pref(ref);
737 free_extent_buffer(eb);
738 return -EIO;
739 }
716{
717 struct prelim_ref *ref;
718 struct extent_buffer *eb;
719 struct preftree *tree = &preftrees->indirect_missing_keys;
720 struct rb_node *node;
721
722 while ((node = rb_first_cached(&tree->root))) {
723 ref = rb_entry(node, struct prelim_ref, rbnode);

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

732 if (IS_ERR(eb)) {
733 free_pref(ref);
734 return PTR_ERR(eb);
735 } else if (!extent_buffer_uptodate(eb)) {
736 free_pref(ref);
737 free_extent_buffer(eb);
738 return -EIO;
739 }
740 btrfs_tree_read_lock(eb);
740 if (lock)
741 btrfs_tree_read_lock(eb);
741 if (btrfs_header_level(eb) == 0)
742 btrfs_item_key_to_cpu(eb, &ref->key_for_search, 0);
743 else
744 btrfs_node_key_to_cpu(eb, &ref->key_for_search, 0);
742 if (btrfs_header_level(eb) == 0)
743 btrfs_item_key_to_cpu(eb, &ref->key_for_search, 0);
744 else
745 btrfs_node_key_to_cpu(eb, &ref->key_for_search, 0);
745 btrfs_tree_read_unlock(eb);
746 if (lock)
747 btrfs_tree_read_unlock(eb);
746 free_extent_buffer(eb);
747 prelim_ref_insert(fs_info, &preftrees->indirect, ref, NULL);
748 cond_resched();
749 }
750 return 0;
751}
752
753/*

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

1222 &preftrees, sc);
1223 if (ret)
1224 goto out;
1225 }
1226 }
1227
1228 btrfs_release_path(path);
1229
748 free_extent_buffer(eb);
749 prelim_ref_insert(fs_info, &preftrees->indirect, ref, NULL);
750 cond_resched();
751 }
752 return 0;
753}
754
755/*

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

1224 &preftrees, sc);
1225 if (ret)
1226 goto out;
1227 }
1228 }
1229
1230 btrfs_release_path(path);
1231
1230 ret = add_missing_keys(fs_info, &preftrees);
1232 ret = add_missing_keys(fs_info, &preftrees, path->skip_locking == 0);
1231 if (ret)
1232 goto out;
1233
1234 WARN_ON(!RB_EMPTY_ROOT(&preftrees.indirect_missing_keys.root.rb_root));
1235
1236 ret = resolve_indirect_refs(fs_info, path, time_seq, &preftrees,
1237 extent_item_pos, total_refs, sc, ignore_offset);
1238 if (ret)

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

1283 if (IS_ERR(eb)) {
1284 ret = PTR_ERR(eb);
1285 goto out;
1286 } else if (!extent_buffer_uptodate(eb)) {
1287 free_extent_buffer(eb);
1288 ret = -EIO;
1289 goto out;
1290 }
1233 if (ret)
1234 goto out;
1235
1236 WARN_ON(!RB_EMPTY_ROOT(&preftrees.indirect_missing_keys.root.rb_root));
1237
1238 ret = resolve_indirect_refs(fs_info, path, time_seq, &preftrees,
1239 extent_item_pos, total_refs, sc, ignore_offset);
1240 if (ret)

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

1285 if (IS_ERR(eb)) {
1286 ret = PTR_ERR(eb);
1287 goto out;
1288 } else if (!extent_buffer_uptodate(eb)) {
1289 free_extent_buffer(eb);
1290 ret = -EIO;
1291 goto out;
1292 }
1291 btrfs_tree_read_lock(eb);
1292 btrfs_set_lock_blocking_read(eb);
1293
1294 if (!path->skip_locking) {
1295 btrfs_tree_read_lock(eb);
1296 btrfs_set_lock_blocking_read(eb);
1297 }
1293 ret = find_extent_in_eb(eb, bytenr,
1294 *extent_item_pos, &eie, ignore_offset);
1298 ret = find_extent_in_eb(eb, bytenr,
1299 *extent_item_pos, &eie, ignore_offset);
1295 btrfs_tree_read_unlock_blocking(eb);
1300 if (!path->skip_locking)
1301 btrfs_tree_read_unlock_blocking(eb);
1296 free_extent_buffer(eb);
1297 if (ret < 0)
1298 goto out;
1299 ref->inode_list = eie;
1300 }
1301 ret = ulist_add_merge_ptr(refs, ref->parent,
1302 ref->inode_list,
1303 (void **)&eie, GFP_NOFS);

--- 940 unchanged lines hidden ---
1302 free_extent_buffer(eb);
1303 if (ret < 0)
1304 goto out;
1305 ref->inode_list = eie;
1306 }
1307 ret = ulist_add_merge_ptr(refs, ref->parent,
1308 ref->inode_list,
1309 (void **)&eie, GFP_NOFS);

--- 940 unchanged lines hidden ---