ref-verify.c (3212fa14e772913b69e85e080678472f8f1aecde) | ref-verify.c (29cbcf401793f4e2c871c846edc2191731df2c41) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2014 Facebook. All rights reserved. 4 */ 5 6#include <linux/sched.h> 7#include <linux/stacktrace.h> 8#include "ctree.h" --- 958 unchanged lines hidden (view full) --- 967 free_block_entry(be); 968 } 969 spin_unlock(&fs_info->ref_verify_lock); 970} 971 972/* Walk down all roots and build the ref tree, meant to be called at mount */ 973int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info) 974{ | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2014 Facebook. All rights reserved. 4 */ 5 6#include <linux/sched.h> 7#include <linux/stacktrace.h> 8#include "ctree.h" --- 958 unchanged lines hidden (view full) --- 967 free_block_entry(be); 968 } 969 spin_unlock(&fs_info->ref_verify_lock); 970} 971 972/* Walk down all roots and build the ref tree, meant to be called at mount */ 973int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info) 974{ |
975 struct btrfs_root *extent_root; |
|
975 struct btrfs_path *path; 976 struct extent_buffer *eb; 977 int tree_block_level = 0; 978 u64 bytenr = 0, num_bytes = 0; 979 int ret, level; 980 981 if (!btrfs_test_opt(fs_info, REF_VERIFY)) 982 return 0; 983 984 path = btrfs_alloc_path(); 985 if (!path) 986 return -ENOMEM; 987 | 976 struct btrfs_path *path; 977 struct extent_buffer *eb; 978 int tree_block_level = 0; 979 u64 bytenr = 0, num_bytes = 0; 980 int ret, level; 981 982 if (!btrfs_test_opt(fs_info, REF_VERIFY)) 983 return 0; 984 985 path = btrfs_alloc_path(); 986 if (!path) 987 return -ENOMEM; 988 |
988 eb = btrfs_read_lock_root_node(fs_info->extent_root); | 989 extent_root = btrfs_extent_root(fs_info, 0); 990 eb = btrfs_read_lock_root_node(extent_root); |
989 level = btrfs_header_level(eb); 990 path->nodes[level] = eb; 991 path->slots[level] = 0; 992 path->locks[level] = BTRFS_READ_LOCK; 993 994 while (1) { 995 /* 996 * We have to keep track of the bytenr/num_bytes we last hit 997 * because we could have run out of space for an inline ref, and 998 * would have had to added a ref key item which may appear on a 999 * different leaf from the original extent item. 1000 */ | 991 level = btrfs_header_level(eb); 992 path->nodes[level] = eb; 993 path->slots[level] = 0; 994 path->locks[level] = BTRFS_READ_LOCK; 995 996 while (1) { 997 /* 998 * We have to keep track of the bytenr/num_bytes we last hit 999 * because we could have run out of space for an inline ref, and 1000 * would have had to added a ref key item which may appear on a 1001 * different leaf from the original extent item. 1002 */ |
1001 ret = walk_down_tree(fs_info->extent_root, path, level, | 1003 ret = walk_down_tree(extent_root, path, level, |
1002 &bytenr, &num_bytes, &tree_block_level); 1003 if (ret) 1004 break; 1005 ret = walk_up_tree(path, &level); 1006 if (ret < 0) 1007 break; 1008 if (ret > 0) { 1009 ret = 0; 1010 break; 1011 } 1012 } 1013 if (ret) { 1014 btrfs_clear_opt(fs_info->mount_opt, REF_VERIFY); 1015 btrfs_free_ref_cache(fs_info); 1016 } 1017 btrfs_free_path(path); 1018 return ret; 1019} | 1004 &bytenr, &num_bytes, &tree_block_level); 1005 if (ret) 1006 break; 1007 ret = walk_up_tree(path, &level); 1008 if (ret < 0) 1009 break; 1010 if (ret > 0) { 1011 ret = 0; 1012 break; 1013 } 1014 } 1015 if (ret) { 1016 btrfs_clear_opt(fs_info->mount_opt, REF_VERIFY); 1017 btrfs_free_ref_cache(fs_info); 1018 } 1019 btrfs_free_path(path); 1020 return ret; 1021} |