Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
home:lafenghu
btrfsprogs
0123-btrfs-progs-In-find-root-dump-bytenr-for-e...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0123-btrfs-progs-In-find-root-dump-bytenr-for-every-slot.patch of Package btrfsprogs
From e8919ef79253ace49de01ba228290e4e0cafbfb7 Mon Sep 17 00:00:00 2001 From: David Marcin <djmarcin@google.com> Date: Mon, 21 Nov 2011 20:51:15 -0600 Subject: [PATCH 24/35] btrfs-progs: In find-root, dump bytenr for every slot. Signed-off-by: David Marcin <djmarcin@google.com> --- find-root.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 59 insertions(+), 1 deletions(-) diff --git a/find-root.c b/find-root.c index 2899632..bd44e1f 100644 --- a/find-root.c +++ b/find-root.c @@ -258,8 +258,63 @@ out: return NULL; } +static int dump_root_bytenr(struct btrfs_root *root, u64 bytenr, u64 gen) +{ + struct btrfs_root *tmp = malloc(sizeof(struct btrfs_root)); + struct btrfs_path *path; + struct btrfs_key key; + struct btrfs_root_item ri; + struct extent_buffer *leaf; + struct btrfs_disk_key disk_key; + struct btrfs_key found_key; + int slot; + int ret; + + if (!tmp) + return -ENOMEM; + + __setup_root(4096, 4096, 4096, 4096, tmp, + root->fs_info, BTRFS_ROOT_TREE_OBJECTID); + + tmp->node = read_tree_block(root, bytenr, 4096, gen); + + key.objectid = 0; + key.type = BTRFS_ROOT_ITEM_KEY; + key.offset = -1; + + path = btrfs_alloc_path(); + + /* Walk the slots of this root looking for BTRFS_ROOT_ITEM_KEYs. */ + ret = btrfs_search_slot(NULL, tmp, &key, path, 0, 0); + BUG_ON(ret < 0); + while (1) { + leaf = path->nodes[0]; + slot = path->slots[0]; + if (slot >= btrfs_header_nritems(leaf)) { + ret = btrfs_next_leaf(tmp, path); + if (ret != 0) + break; + leaf = path->nodes[0]; + slot = path->slots[0]; + } + btrfs_item_key(leaf, &disk_key, path->slots[0]); + btrfs_disk_key_to_cpu(&found_key, &disk_key); + if (btrfs_key_type(&found_key) == BTRFS_ROOT_ITEM_KEY) { + unsigned long offset; + + offset = btrfs_item_ptr_offset(leaf, slot); + read_extent_buffer(leaf, &ri, offset, sizeof(ri)); + printf("Generation: %Lu Root bytenr: %Lu\n", gen, btrfs_root_bytenr(&ri)); + } + path->slots[0]++; + } + btrfs_free_path(path); + free_extent_buffer(leaf); + return 0; +} + static int search_iobuf(struct btrfs_root *root, void *iobuf, - size_t iobuf_size, off_t offset) + size_t iobuf_size, off_t offset) { u64 gen = btrfs_super_generation(&root->fs_info->super_copy); u64 objectid = search_objectid; @@ -290,6 +345,9 @@ static int search_iobuf(struct btrfs_root *root, void *iobuf, h_byte); goto next; } + /* Found some kind of root and it's fairly valid. */ + if (dump_root_bytenr(root, h_byte, h_gen)) + break; if (h_gen != gen) { fprintf(stderr, "Well block %Lu seems great, " "but generation doesn't match, " -- 1.7.6.233.gd79bc
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor