From: Goffredo Baroncelli <kreij...@inwind.it> The function load_chunk_info() doesn't initialize correctly the sk->min/max_type when it calls the TREE_SEARCH ioctl: these keys are swapped. Moreover this function assumes that all the items contained in the tree BTRFS_CHUNK_TREE_OBJECTID are of type BTRFS_CHUNK_ITEM_KEY, however some items are of type DEV_ITEM. Add an if( ) to pick only the right ones.
Signed-off-by: G.Baroncelli <kreij...@inwind.it> --- cmds-fi-usage.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/cmds-fi-usage.c b/cmds-fi-usage.c index 6c846c15..52d63524 100644 --- a/cmds-fi-usage.c +++ b/cmds-fi-usage.c @@ -147,8 +147,8 @@ static int load_chunk_info(int fd, struct chunk_info **info_ptr, int *info_count sk->min_objectid = 0; sk->max_objectid = (u64)-1; - sk->max_type = 0; - sk->min_type = (u8)-1; + sk->min_type = 0; + sk->max_type = (u8)-1; sk->min_offset = 0; sk->max_offset = (u64)-1; sk->min_transid = 0; @@ -174,20 +174,21 @@ static int load_chunk_info(int fd, struct chunk_info **info_ptr, int *info_count off = 0; for (i = 0; i < sk->nr_items; i++) { struct btrfs_chunk *item; + u8 type; sh = (struct btrfs_ioctl_search_header *)(args.buf + off); - + type = btrfs_search_header_type(sh); off += sizeof(*sh); - item = (struct btrfs_chunk *)(args.buf + off); - - ret = add_info_to_list(info_ptr, info_count, item); - if (ret) { - *info_ptr = NULL; - return 1; + if (type == BTRFS_CHUNK_ITEM_KEY) { + item = (struct btrfs_chunk *)(args.buf + off); + ret = add_info_to_list(info_ptr, info_count, item); + if (ret) { + *info_ptr = NULL; + return 1; + } } off += btrfs_search_header_len(sh); - sk->min_objectid = btrfs_search_header_objectid(sh); sk->min_type = btrfs_search_header_type(sh); sk->min_offset = btrfs_search_header_offset(sh)+1; -- 2.14.1 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html