1
2
3#include "ctree.h"
4
5int 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;
44out:
45 btrfs_free_path(path);
46 return ret;
47}
48