btrfs-progs: Remove btrfs_read_super_device as there is no implementation
[platform/upstream/btrfs-progs.git] / cmds-check.c
index bc937af..c5faa2b 100644 (file)
@@ -1967,6 +1967,7 @@ out:
 static void reada_walk_down(struct btrfs_root *root,
                            struct extent_buffer *node, int slot)
 {
+       struct btrfs_fs_info *fs_info = root->fs_info;
        u64 bytenr;
        u64 ptr_gen;
        u32 nritems;
@@ -1979,11 +1980,11 @@ static void reada_walk_down(struct btrfs_root *root,
                return;
 
        nritems = btrfs_header_nritems(node);
-       blocksize = root->fs_info->nodesize;
+       blocksize = fs_info->nodesize;
        for (i = slot; i < nritems; i++) {
                bytenr = btrfs_node_blockptr(node, i);
                ptr_gen = btrfs_node_ptr_generation(node, i);
-               readahead_tree_block(root, bytenr, blocksize, ptr_gen);
+               readahead_tree_block(fs_info, bytenr, blocksize, ptr_gen);
        }
 }
 
@@ -2104,6 +2105,7 @@ static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
        enum btrfs_tree_block_status status;
        u64 bytenr;
        u64 ptr_gen;
+       struct btrfs_fs_info *fs_info = root->fs_info;
        struct extent_buffer *next;
        struct extent_buffer *cur;
        u32 blocksize;
@@ -2155,7 +2157,7 @@ static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
                }
                bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
                ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
-               blocksize = root->fs_info->nodesize;
+               blocksize = fs_info->nodesize;
 
                if (bytenr == nrefs->bytenr[*level - 1]) {
                        refs = nrefs->refs[*level - 1];
@@ -2179,11 +2181,11 @@ static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path,
                        }
                }
 
-               next = btrfs_find_tree_block(root, bytenr, blocksize);
+               next = btrfs_find_tree_block(fs_info, bytenr, blocksize);
                if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
                        free_extent_buffer(next);
                        reada_walk_down(root, cur, path->slots[*level]);
-                       next = read_tree_block(root, bytenr, blocksize,
+                       next = read_tree_block(root->fs_info, bytenr, blocksize,
                                               ptr_gen);
                        if (!extent_buffer_uptodate(next)) {
                                struct btrfs_key node_key;
@@ -2242,6 +2244,7 @@ static int walk_down_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
        enum btrfs_tree_block_status status;
        u64 bytenr;
        u64 ptr_gen;
+       struct btrfs_fs_info *fs_info = root->fs_info;
        struct extent_buffer *next;
        struct extent_buffer *cur;
        u32 blocksize;
@@ -2284,7 +2287,7 @@ static int walk_down_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
                }
                bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
                ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
-               blocksize = root->fs_info->nodesize;
+               blocksize = fs_info->nodesize;
 
                ret = update_nodes_refs(root, bytenr, nrefs, *level - 1);
                if (ret)
@@ -2294,11 +2297,11 @@ static int walk_down_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
                        continue;
                }
 
-               next = btrfs_find_tree_block(root, bytenr, blocksize);
+               next = btrfs_find_tree_block(fs_info, bytenr, blocksize);
                if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
                        free_extent_buffer(next);
                        reada_walk_down(root, cur, path->slots[*level]);
-                       next = read_tree_block(root, bytenr, blocksize,
+                       next = read_tree_block(fs_info, bytenr, blocksize,
                                               ptr_gen);
                        if (!extent_buffer_uptodate(next)) {
                                struct btrfs_key node_key;
@@ -2306,10 +2309,10 @@ static int walk_down_tree_v2(struct btrfs_root *root, struct btrfs_path *path,
                                btrfs_node_key_to_cpu(path->nodes[*level],
                                                      &node_key,
                                                      path->slots[*level]);
-                               btrfs_add_corrupt_extent_record(root->fs_info,
+                               btrfs_add_corrupt_extent_record(fs_info,
                                                &node_key,
                                                path->nodes[*level]->start,
-                                               root->fs_info->nodesize,
+                                               fs_info->nodesize,
                                                *level);
                                ret = -EIO;
                                break;
@@ -6623,7 +6626,7 @@ static int process_chunk_item(struct cache_tree *chunk_cache,
         * wrong onwer(3) out of chunk tree, to pass both chunk tree check
         * and owner<->key_type check.
         */
-       ret = btrfs_check_chunk_valid(global_info->tree_root, eb, chunk, slot,
+       ret = btrfs_check_chunk_valid(global_info, eb, chunk, slot,
                                      key->offset);
        if (ret < 0) {
                error("chunk(%llu, %llu) is not valid, ignore it",
@@ -6929,7 +6932,7 @@ static int check_cache_range(struct btrfs_root *root,
 
        for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
                bytenr = btrfs_sb_offset(i);
-               ret = btrfs_rmap_block(&root->fs_info->mapping_tree,
+               ret = btrfs_rmap_block(root->fs_info,
                                       cache->key.objectid, bytenr, 0,
                                       &logical, &nr, &stripe_len);
                if (ret)
@@ -7166,8 +7169,9 @@ static int check_extent_csums(struct btrfs_root *root, u64 bytenr,
                        u64 num_bytes, unsigned long leaf_offset,
                        struct extent_buffer *eb) {
 
+       struct btrfs_fs_info *fs_info = root->fs_info;
        u64 offset = 0;
-       u16 csum_size = btrfs_super_csum_size(root->fs_info->super_copy);
+       u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
        char *data;
        unsigned long csum_offset;
        u32 csum;
@@ -7179,7 +7183,7 @@ static int check_extent_csums(struct btrfs_root *root, u64 bytenr,
        int mirror;
        int num_copies;
 
-       if (num_bytes % root->fs_info->sectorsize)
+       if (num_bytes % fs_info->sectorsize)
                return -EINVAL;
 
        data = malloc(num_bytes);
@@ -7191,7 +7195,7 @@ static int check_extent_csums(struct btrfs_root *root, u64 bytenr,
 again:
                read_len = num_bytes - offset;
                /* read as much space once a time */
-               ret = read_extent_data(root, data + offset,
+               ret = read_extent_data(fs_info, data + offset,
                                bytenr + offset, &read_len, mirror);
                if (ret)
                        goto out;
@@ -7202,11 +7206,11 @@ again:
                        tmp = offset + data_checked;
 
                        csum = btrfs_csum_data((char *)data + tmp,
-                                              csum, root->fs_info->sectorsize);
+                                              csum, fs_info->sectorsize);
                        btrfs_csum_final(csum, (u8 *)&csum);
 
                        csum_offset = leaf_offset +
-                                tmp / root->fs_info->sectorsize * csum_size;
+                                tmp / fs_info->sectorsize * csum_size;
                        read_extent_buffer(eb, (char *)&csum_expected,
                                           csum_offset, csum_size);
                        /* try another mirror */
@@ -7214,15 +7218,14 @@ again:
                                fprintf(stderr, "mirror %d bytenr %llu csum %u expected csum %u\n",
                                                mirror, bytenr + tmp,
                                                csum, csum_expected);
-                               num_copies = btrfs_num_copies(
-                                               &root->fs_info->mapping_tree,
+                               num_copies = btrfs_num_copies(root->fs_info,
                                                bytenr, num_bytes);
                                if (mirror < num_copies - 1) {
                                        mirror += 1;
                                        goto again;
                                }
                        }
-                       data_checked += root->fs_info->sectorsize;
+                       data_checked += fs_info->sectorsize;
                }
                offset += read_len;
        }
@@ -7608,6 +7611,7 @@ static int run_next_block(struct btrfs_root *root,
                          struct device_extent_tree *dev_extent_cache,
                          struct root_item_record *ri)
 {
+       struct btrfs_fs_info *fs_info = root->fs_info;
        struct extent_buffer *buf;
        struct extent_record *rec = NULL;
        u64 bytenr;
@@ -7637,7 +7641,7 @@ static int run_next_block(struct btrfs_root *root,
                                continue;
 
                        /* fixme, get the parent transid */
-                       readahead_tree_block(root, bits[i].start,
+                       readahead_tree_block(fs_info, bits[i].start,
                                             bits[i].size, 0);
                }
        }
@@ -7667,7 +7671,7 @@ static int run_next_block(struct btrfs_root *root,
        }
 
        /* fixme, get the real parent transid */
-       buf = read_tree_block(root, bytenr, size, gen);
+       buf = read_tree_block(root->fs_info, bytenr, size, gen);
        if (!extent_buffer_uptodate(buf)) {
                record_bad_block_io(root->fs_info,
                                    extent_cache, bytenr, size);
@@ -9780,7 +9784,7 @@ static int deal_root_from_list(struct list_head *list,
                rec = list_entry(list->next,
                                 struct root_item_record, list);
                last = 0;
-               buf = read_tree_block(root->fs_info->tree_root,
+               buf = read_tree_block(root->fs_info,
                                      rec->bytenr, rec->level_size, 0);
                if (!extent_buffer_uptodate(buf)) {
                        free_extent_buffer(buf);
@@ -10426,7 +10430,7 @@ static int query_tree_block_level(struct btrfs_fs_info *fs_info, u64 bytenr)
        btrfs_release_path(&path);
 
        /* Get level from tree block as an alternative source */
-       eb = read_tree_block_fs_info(fs_info, bytenr, nodesize, transid);
+       eb = read_tree_block(fs_info, bytenr, nodesize, transid);
        if (!extent_buffer_uptodate(eb)) {
                free_extent_buffer(eb);
                return -EIO;
@@ -10479,7 +10483,7 @@ static int check_tree_block_backref(struct btrfs_fs_info *fs_info, u64 root_id,
        }
 
        /* Read out the tree block to get item/node key */
-       eb = read_tree_block(root, bytenr, root->fs_info->nodesize, 0);
+       eb = read_tree_block(fs_info, bytenr, root->fs_info->nodesize, 0);
        if (!extent_buffer_uptodate(eb)) {
                err |= REFERENCER_MISSING;
                free_extent_buffer(eb);
@@ -10581,7 +10585,7 @@ static int check_shared_block_backref(struct btrfs_fs_info *fs_info,
        int found_parent = 0;
        int i;
 
-       eb = read_tree_block_fs_info(fs_info, parent, nodesize, 0);
+       eb = read_tree_block(fs_info, parent, nodesize, 0);
        if (!extent_buffer_uptodate(eb))
                goto out;
 
@@ -10735,7 +10739,7 @@ static int check_shared_data_backref(struct btrfs_fs_info *fs_info,
        int found_parent = 0;
        int i;
 
-       eb = read_tree_block_fs_info(fs_info, parent, nodesize, 0);
+       eb = read_tree_block(fs_info, parent, nodesize, 0);
        if (!extent_buffer_uptodate(eb))
                goto out;
 
@@ -10923,7 +10927,12 @@ static int check_dev_extent_item(struct btrfs_fs_info *fs_info,
 
        l = path.nodes[0];
        chunk = btrfs_item_ptr(l, path.slots[0], struct btrfs_chunk);
-       if (btrfs_chunk_length(l, chunk) != length)
+       ret = btrfs_check_chunk_valid(fs_info, l, chunk, path.slots[0],
+                                     chunk_key.offset);
+       if (ret < 0)
+               goto out;
+
+       if (btrfs_stripe_length(fs_info, l, chunk) != length)
                goto out;
 
        num_stripes = btrfs_chunk_num_stripes(l, chunk);
@@ -11161,11 +11170,10 @@ static int check_chunk_item(struct btrfs_fs_info *fs_info,
        struct btrfs_block_group_item *bi;
        struct btrfs_block_group_item bg_item;
        struct btrfs_dev_extent *ptr;
-       u32 sectorsize = btrfs_super_sectorsize(fs_info->super_copy);
        u64 length;
        u64 chunk_end;
+       u64 stripe_len;
        u64 type;
-       u64 profile;
        int num_stripes;
        u64 offset;
        u64 objectid;
@@ -11177,25 +11185,15 @@ static int check_chunk_item(struct btrfs_fs_info *fs_info,
        chunk = btrfs_item_ptr(eb, slot, struct btrfs_chunk);
        length = btrfs_chunk_length(eb, chunk);
        chunk_end = chunk_key.offset + length;
-       if (!IS_ALIGNED(length, sectorsize)) {
-               error("chunk[%llu %llu) not aligned to %u",
-                       chunk_key.offset, chunk_end, sectorsize);
-               err |= BYTES_UNALIGNED;
+       ret = btrfs_check_chunk_valid(fs_info, eb, chunk, slot,
+                                     chunk_key.offset);
+       if (ret < 0) {
+               error("chunk[%llu %llu) is invalid", chunk_key.offset,
+                       chunk_end);
+               err |= BYTES_UNALIGNED | UNKNOWN_TYPE;
                goto out;
        }
-
        type = btrfs_chunk_type(eb, chunk);
-       profile = type & BTRFS_BLOCK_GROUP_PROFILE_MASK;
-       if (!(type & BTRFS_BLOCK_GROUP_TYPE_MASK)) {
-               error("chunk[%llu %llu) has no chunk type",
-                       chunk_key.offset, chunk_end);
-               err |= UNKNOWN_TYPE;
-       }
-       if (profile && (profile & (profile - 1))) {
-               error("chunk[%llu %llu) multiple profiles detected: %llx",
-                       chunk_key.offset, chunk_end, profile);
-               err |= UNKNOWN_TYPE;
-       }
 
        bg_key.objectid = chunk_key.offset;
        bg_key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
@@ -11224,6 +11222,7 @@ static int check_chunk_item(struct btrfs_fs_info *fs_info,
        }
 
        num_stripes = btrfs_chunk_num_stripes(eb, chunk);
+       stripe_len = btrfs_stripe_length(fs_info, eb, chunk);
        for (i = 0; i < num_stripes; i++) {
                btrfs_release_path(&path);
                btrfs_init_path(&path);
@@ -11243,7 +11242,7 @@ static int check_chunk_item(struct btrfs_fs_info *fs_info,
                offset = btrfs_dev_extent_chunk_offset(leaf, ptr);
                if (objectid != chunk_key.objectid ||
                    offset != chunk_key.offset ||
-                   btrfs_dev_extent_length(leaf, ptr) != length)
+                   btrfs_dev_extent_length(leaf, ptr) != stripe_len)
                        goto not_match_dev;
                continue;
 not_match_dev:
@@ -11502,7 +11501,8 @@ static int traverse_tree_block(struct btrfs_root *root,
                 * As a btrfs tree has most 8 levels (0..7), so it's quite safe
                 * to call the function itself.
                 */
-               eb = read_tree_block(root, blocknr, root->fs_info->nodesize, 0);
+               eb = read_tree_block(root->fs_info, blocknr,
+                               root->fs_info->nodesize, 0);
                if (extent_buffer_uptodate(eb)) {
                        ret = traverse_tree_block(root, eb);
                        err |= ret;
@@ -11688,8 +11688,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info,
                         * in, but for now this doesn't actually use the root so
                         * just pass in extent_root.
                         */
-                       tmp = read_tree_block(fs_info->extent_root, bytenr,
-                                             nodesize, 0);
+                       tmp = read_tree_block(fs_info, bytenr, nodesize, 0);
                        if (!extent_buffer_uptodate(tmp)) {
                                fprintf(stderr, "Error reading root block\n");
                                return -EIO;
@@ -11707,7 +11706,7 @@ static int pin_down_tree_blocks(struct btrfs_fs_info *fs_info,
                                continue;
                        }
 
-                       tmp = read_tree_block(fs_info->extent_root, bytenr,
+                       tmp = read_tree_block(fs_info, bytenr,
                                              nodesize, 0);
                        if (!extent_buffer_uptodate(tmp)) {
                                fprintf(stderr, "Error reading tree block\n");
@@ -12086,13 +12085,14 @@ static int populate_csum(struct btrfs_trans_handle *trans,
                         struct btrfs_root *csum_root, char *buf, u64 start,
                         u64 len)
 {
+       struct btrfs_fs_info *fs_info = csum_root->fs_info;
        u64 offset = 0;
        u64 sectorsize;
        int ret = 0;
 
        while (offset < len) {
-               sectorsize = csum_root->fs_info->sectorsize;
-               ret = read_extent_data(csum_root, buf, start + offset,
+               sectorsize = fs_info->sectorsize;
+               ret = read_extent_data(fs_info, buf, start + offset,
                                       &sectorsize, 0);
                if (ret)
                        break;