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}