uboot/fs/btrfs/root-tree.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   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