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 --- |