X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmds-inspect-dump-tree.c;h=5e20634543f32afe6168b8ec0ca65a2f96eed94f;hb=dad817d3bad44619c355d11e39512b413da6939c;hp=6ce6edc1d2548ba195ee2ef356be2aa2d9602689;hpb=6398ed78f9d52769954ba5fe3c15452c390397a7;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c index 6ce6edc..5e20634 100644 --- a/cmds-inspect-dump-tree.c +++ b/cmds-inspect-dump-tree.c @@ -47,7 +47,7 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) return; } - size = btrfs_level_size(root, btrfs_header_level(eb) - 1); + size = root->nodesize; nr = btrfs_header_nritems(eb); for (i = 0; i < nr; i++) { struct extent_buffer *next = read_tree_block(root, @@ -106,16 +106,87 @@ static void print_old_roots(struct btrfs_super_block *super) } } +/* + * Convert a tree name from various forms to the numerical id if possible + * Accepted forms: + * - case does not matter + * - same as the key name, BTRFS_ROOT_TREE_OBJECTID + * - dtto shortened, BTRFS_ROOT_TREE + * - dtto without prefix, ROOT_TREE + * - common name, ROOT, CHUNK, EXTENT, ... + * - dtto alias, DEVICE for DEV, CHECKSUM for CSUM + * + * Returns 0 if the tree id was not recognized. + */ +static u64 treeid_from_string(const char *str, const char **end) +{ + int match = 0; + int i; + u64 id; + static struct treename { + const char *name; + u64 id; + } tn[] = { + { "ROOT", BTRFS_ROOT_TREE_OBJECTID }, + { "EXTENT", BTRFS_EXTENT_TREE_OBJECTID }, + { "CHUNK", BTRFS_CHUNK_TREE_OBJECTID }, + { "DEVICE", BTRFS_DEV_TREE_OBJECTID }, + { "DEV", BTRFS_DEV_TREE_OBJECTID }, + { "FS_TREE", BTRFS_FS_TREE_OBJECTID }, + { "CSUM", BTRFS_CSUM_TREE_OBJECTID }, + { "CHECKSUM", BTRFS_CSUM_TREE_OBJECTID }, + { "QUOTA", BTRFS_QUOTA_TREE_OBJECTID }, + { "UUID", BTRFS_UUID_TREE_OBJECTID }, + { "FREE_SPACE", BTRFS_FREE_SPACE_TREE_OBJECTID }, + { "TREE_LOG_FIXUP", BTRFS_TREE_LOG_FIXUP_OBJECTID }, + { "TREE_LOG", BTRFS_TREE_LOG_OBJECTID }, + { "TREE_RELOC", BTRFS_TREE_RELOC_OBJECTID }, + { "DATA_RELOC", BTRFS_DATA_RELOC_TREE_OBJECTID } + }; + + if (strncasecmp("BTRFS_", str, strlen("BTRFS_")) == 0) + str += strlen("BTRFS_"); + + for (i = 0; i < ARRAY_SIZE(tn); i++) { + int len = strlen(tn[i].name); + + if (strncasecmp(tn[i].name, str, len) == 0) { + id = tn[i].id; + match = 1; + str += len; + break; + } + } + + if (!match) + return 0; + + if (strncasecmp("_TREE", str, strlen("_TREE")) == 0) + str += strlen("_TREE"); + + if (strncasecmp("_OBJECTID", str, strlen("_OBJECTID")) == 0) + str += strlen("_OBJECTID"); + + *end = str; + + return id; +} + const char * const cmd_inspect_dump_tree_usage[] = { "btrfs inspect-internal dump-tree [options] device", - "Dump structures from a device", - "-e|--extents print detailed extents info", - "-d|--device print info of btrfs device and root tree dir only", - "-r|--roots print info of roots only", - "-R|--backups print info of roots and root backups", - "-u|--uuid print info of uuid tree only", - "-b|--block print info of the specified block only", - "-t|--tree print only the tree with the given id", + "Dump tree structures from a given device", + "Dump tree structures from a given device in textual form, expand keys to human", + "readable equivalents where possible.", + "Note: contains file names, consider that if you're asked to send the dump", + "for analysis.", + "", + "-e|--extents print only extent info: extent and device trees", + "-d|--device print only device info: tree root, chunk and device trees", + "-r|--roots print only short root node info", + "-R|--backups same as --roots plus print backup root info", + "-u|--uuid print only the uuid tree", + "-b|--block print info from the specified block only", + "-t|--tree print only tree with the given id (string or number)", NULL }; @@ -178,40 +249,57 @@ int cmd_inspect_dump_tree(int argc, char **argv) block_only = arg_strtou64(optarg); break; case 't': - tree_id = arg_strtou64(optarg); + if (string_is_numerical(optarg)) { + tree_id = arg_strtou64(optarg); + } else { + const char *end = NULL; + + tree_id = treeid_from_string(optarg, &end); + + if (*end) { + error("unexpected tree id suffix of '%s': %s\n", + optarg, end); + exit(1); + } + } + if (!tree_id) { + error("unrecognized tree id: %s\n", + optarg); + exit(1); + } break; default: usage(cmd_inspect_dump_tree_usage); } } - argc = argc - optind; - if (check_argc_exact(argc, 1)) + if (check_argc_exact(argc - optind, 1)) usage(cmd_inspect_dump_tree_usage); ret = check_arg_type(argv[optind]); if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { - fprintf(stderr, "'%s' is not a block device or regular file\n", - argv[optind]); + error("not a block device or regular file: %s", argv[optind]); goto out; } - info = open_ctree_fs_info(argv[optind], 0, 0, OPEN_CTREE_PARTIAL); + printf("%s\n", PACKAGE_STRING); + + info = open_ctree_fs_info(argv[optind], 0, 0, 0, OPEN_CTREE_PARTIAL); if (!info) { - fprintf(stderr, "unable to open %s\n", argv[optind]); + error("unable to open %s", argv[optind]); goto out; } root = info->fs_root; if (!root) { - fprintf(stderr, "unable to open %s\n", argv[optind]); + error("unable to open %s", argv[optind]); goto out; } if (block_only) { leaf = read_tree_block(root, block_only, - root->leafsize, 0); + root->nodesize, 0); if (extent_buffer_uptodate(leaf) && btrfs_header_level(leaf) != 0) { @@ -225,7 +313,7 @@ int cmd_inspect_dump_tree(int argc, char **argv) root->nodesize, 0); } if (!extent_buffer_uptodate(leaf)) { - fprintf(stderr, "failed to read %llu\n", + error("failed to read %llu", (unsigned long long)block_only); goto close_root; } @@ -312,8 +400,7 @@ again: read_extent_buffer(leaf, &ri, offset, sizeof(ri)); buf = read_tree_block(tree_root_scan, btrfs_root_bytenr(&ri), - btrfs_level_size(tree_root_scan, - btrfs_root_level(&ri)), + tree_root_scan->nodesize, 0); if (!extent_buffer_uptodate(buf)) goto next; @@ -414,6 +501,9 @@ again: } } if (extent_only && !skip) { + printf(" tree "); + btrfs_print_key(&disk_key); + printf("\n"); print_extents(tree_root_scan, buf); } else if (!skip) { printf(" tree "); @@ -454,7 +544,6 @@ no_node: uuidbuf[BTRFS_UUID_UNPARSED_SIZE - 1] = '\0'; uuid_unparse(info->super_copy->fsid, uuidbuf); printf("uuid %s\n", uuidbuf); - printf("%s\n", PACKAGE_STRING); close_root: ret = close_ctree(root); out: