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

Reply via email to