fs: btrfs: Crossport open_ctree_fs_info() from btrfs-progs
[platform/kernel/u-boot.git] / fs / btrfs / root-tree.c
1 // SPDX-License-Identifier: GPL-2.0+
2
3 #include "ctree.h"
4
5 int btrfs_find_last_root(struct btrfs_root *root, u64 objectid,
6                         struct btrfs_root_item *item, struct btrfs_key *key)
7 {
8         struct btrfs_path *path;
9         struct btrfs_key search_key;
10         struct btrfs_key found_key;
11         struct extent_buffer *l;
12         int ret;
13         int slot;
14
15         path = btrfs_alloc_path();
16         if (!path)
17                 return -ENOMEM;
18
19         search_key.objectid = objectid;
20         search_key.type = BTRFS_ROOT_ITEM_KEY;
21         search_key.offset = (u64)-1;
22
23         ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
24         if (ret < 0)
25                 goto out;
26         if (path->slots[0] == 0) {
27                 ret = -ENOENT;
28                 goto out;
29         }
30
31         BUG_ON(ret == 0);
32         l = path->nodes[0];
33         slot = path->slots[0] - 1;
34         btrfs_item_key_to_cpu(l, &found_key, slot);
35         if (found_key.type != BTRFS_ROOT_ITEM_KEY ||
36             found_key.objectid != objectid) {
37                 ret = -ENOENT;
38                 goto out;
39         }
40         read_extent_buffer(l, item, btrfs_item_ptr_offset(l, slot),
41                            sizeof(*item));
42         memcpy(key, &found_key, sizeof(found_key));
43         ret = 0;
44 out:
45         btrfs_free_path(path);
46         return ret;
47 }