diff --git a/check/clear-cache.c b/check/clear-cache.c index 6f85e07e..9ed00fab 100644 --- a/check/clear-cache.c +++ b/check/clear-cache.c @@ -430,7 +430,7 @@ int validate_free_space_cache(struct btrfs_root *root) if (!ret && btrfs_fs_compat_ro(gfs_info, FREE_SPACE_TREE)) ret = check_free_space_trees(root); if (ret && btrfs_fs_compat_ro(gfs_info, FREE_SPACE_TREE) && - repair) { + opt_check_repair) { ret = do_clear_free_space_cache(2); if (ret) goto out; diff --git a/check/main.c b/check/main.c index dc921d79..0bf2e5f9 100644 --- a/check/main.c +++ b/check/main.c @@ -3059,7 +3059,7 @@ static int check_inode_recs(struct btrfs_root *root, break; cache = search_cache_extent(inode_cache, 0); - while (repair && cache) { + while (opt_check_repair && cache) { node = container_of(cache, struct ptr_node, cache); rec = node->data; cache = next_cache_extent(cache); @@ -3092,7 +3092,7 @@ static int check_inode_recs(struct btrfs_root *root, rec = get_inode_rec(inode_cache, root_dirid, 0); BUG_ON(IS_ERR(rec)); if (rec) { - if (repair) { + if (opt_check_repair) { ret = try_repair_inode(root, rec); if (ret < 0) error++; @@ -3103,7 +3103,7 @@ static int check_inode_recs(struct btrfs_root *root, error++; } } else { - if (repair) { + if (opt_check_repair) { struct btrfs_trans_handle *trans; trans = btrfs_start_transaction(root, 1); @@ -3159,7 +3159,7 @@ static int check_inode_recs(struct btrfs_root *root, rec->errors |= I_ERR_NO_INODE_ITEM; if (rec->found_link != rec->nlink) rec->errors |= I_ERR_LINK_COUNT_WRONG; - if (repair) { + if (opt_check_repair) { ret = try_repair_inode(root, rec); if (ret == 0 && can_free_inode_rec(rec)) { free_inode_rec(rec); @@ -3167,7 +3167,7 @@ static int check_inode_recs(struct btrfs_root *root, } } - if (!(repair && ret == 0)) + if (!(opt_check_repair && ret == 0)) error++; print_inode_error(root, rec); list_for_each_entry(backref, &rec->backrefs, list) { @@ -3640,7 +3640,7 @@ static int check_fs_root(struct btrfs_root *root, root->root_key.objectid, btrfs_root_generation(root_item), super_generation + 1); generation_err = true; - if (repair) { + if (opt_check_repair) { root->node->flags |= EXTENT_BAD_TRANSID; ret = recow_extent_buffer(root, root->node); if (!ret) { @@ -3768,7 +3768,7 @@ skip_walking: corrupt->key.offset); cache = next_cache_extent(cache); } - if (repair) { + if (opt_check_repair) { printf("Try to repair the btree for root %llu\n", root->root_key.objectid); ret = repair_btree(root, &corrupt_blocks); @@ -3819,7 +3819,7 @@ static int check_fs_roots(struct cache_tree *root_cache) * Just in case we made any changes to the extent tree that weren't * reflected into the free space cache yet. */ - if (repair) + if (opt_check_repair) reset_cached_block_groups(); memset(&wc, 0, sizeof(wc)); cache_tree_init(&wc.shared); @@ -3885,7 +3885,7 @@ again: * hit this root and fail to repair, so we must * skip it to avoid infinite loop. */ - if (repair) + if (opt_check_repair) skip_root = key.objectid; } if (key.objectid == BTRFS_TREE_RELOC_OBJECTID) @@ -4558,7 +4558,7 @@ static int check_block(struct btrfs_root *root, status = btrfs_check_node(gfs_info, &rec->parent_key, buf); if (status != BTRFS_TREE_BLOCK_CLEAN) { - if (repair) + if (opt_check_repair) status = try_to_fix_bad_block(root, buf, status); if (status != BTRFS_TREE_BLOCK_CLEAN) { ret = -EIO; @@ -7999,7 +7999,7 @@ static int check_extent_refs(struct btrfs_root *root, int had_dups = 0; int err = 0; - if (repair) { + if (opt_check_repair) { /* * if we're doing a repair, we have to make sure * we don't allocate from the problem extents. @@ -8034,7 +8034,7 @@ static int check_extent_refs(struct btrfs_root *root, * could mess up the extent tree when we have backrefs that actually * belong to a different extent item and not the weird duplicate one. */ - while (repair && !list_empty(&duplicate_extents)) { + while (opt_check_repair && !list_empty(&duplicate_extents)) { rec = to_extent_record(duplicate_extents.next); list_del_init(&rec->list); @@ -8081,7 +8081,7 @@ static int check_extent_refs(struct btrfs_root *root, if (rec->generation > super_gen + 1) { bool repaired = false; - if (repair) { + if (opt_check_repair) { ret = repair_extent_item_generation(rec); if (ret == 0) repaired = true; @@ -8132,7 +8132,7 @@ static int check_extent_refs(struct btrfs_root *root, cur_err = 1; } - if (repair && fix) { + if (opt_check_repair && fix) { ret = fixup_extent_refs(extent_cache, rec); if (ret) goto repair_abort; @@ -8142,7 +8142,7 @@ static int check_extent_refs(struct btrfs_root *root, if (rec->bad_full_backref) { fprintf(stderr, "bad full backref, on [%llu]\n", (unsigned long long)rec->start); - if (repair) { + if (opt_check_repair) { ret = fixup_extent_flags(rec); if (ret) goto repair_abort; @@ -8172,14 +8172,14 @@ next: err = cur_err; remove_cache_extent(extent_cache, cache); free_all_extent_backrefs(rec); - if (!init_extent_tree && repair && (!cur_err || fix)) + if (!init_extent_tree && opt_check_repair && (!cur_err || fix)) clear_extent_dirty(gfs_info->excluded_extents, rec->start, rec->start + rec->max_size - 1); free(rec); } repair_abort: - if (repair) { + if (opt_check_repair) { if (ret && ret != -EAGAIN) { fprintf(stderr, "failed to repair damaged filesystem, aborting\n"); exit(1); @@ -8414,7 +8414,7 @@ static int check_device_used(struct device_record *dev_rec, "Dev extent's total-byte(%llu) is not equal to byte-used(%llu) in dev[%llu, %u, %llu]\n", total_byte, dev_rec->byte_used, dev_rec->objectid, dev_rec->type, dev_rec->offset); - if (repair) { + if (opt_check_repair) { ret = repair_dev_item_bytes_used(gfs_info, dev_rec->devid, total_byte); } @@ -8646,7 +8646,7 @@ static int check_block_groups(struct block_group_tree *bg_cache) ret = -1; } - if (!repair || !ret) + if (!opt_check_repair || !ret) return ret; trans = btrfs_start_transaction(gfs_info->tree_root, 1); @@ -8885,7 +8885,7 @@ static int check_chunks_and_extents(void) INIT_LIST_HEAD(&dropping_trees); INIT_LIST_HEAD(&normal_trees); - if (repair) { + if (opt_check_repair) { gfs_info->excluded_extents = &excluded_extents; gfs_info->fsck_extent_cache = &extent_cache; gfs_info->free_extent_hook = free_extent_hook; @@ -8967,7 +8967,7 @@ again: ret = err; out: - if (repair) { + if (opt_check_repair) { free_corrupt_blocks_tree(gfs_info->corrupt_blocks); extent_io_tree_cleanup(&excluded_extents); gfs_info->fsck_extent_cache = NULL; @@ -9014,7 +9014,7 @@ static int do_check_chunks_and_extents(void) ret = check_chunks_and_extents(); /* Also repair device size related problems */ - if (repair && !ret) { + if (opt_check_repair && !ret) { ret = btrfs_fix_device_and_super_size(gfs_info); if (ret > 0) ret = 0; @@ -9695,7 +9695,7 @@ static int maybe_repair_root_item(struct btrfs_path *path, * for the same root item without read only mode (the caller will * open a transaction first). */ - if (!(read_only_mode && repair)) + if (!(read_only_mode && opt_check_repair)) fprintf(stderr, "%sroot item for root %llu," " current bytenr %llu, current gen %llu, current level %u," @@ -9814,7 +9814,7 @@ again: if (ret < 0) goto out; if (ret) { - if (!trans && repair) { + if (!trans && opt_check_repair) { need_trans = 1; key = found_key; btrfs_release_path(&path); @@ -10023,7 +10023,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) usage(cmd); case GETOPT_VAL_REPAIR: printf("enabling repair mode\n"); - repair = 1; + opt_check_repair = 1; ctree_flags |= OPEN_CTREE_WRITES; break; case GETOPT_VAL_READONLY: @@ -10032,14 +10032,14 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) case GETOPT_VAL_INIT_CSUM: printf("Creating a new CRC tree\n"); init_csum_tree = 1; - repair = 1; + opt_check_repair = 1; ctree_flags |= OPEN_CTREE_WRITES; break; case GETOPT_VAL_INIT_EXTENT: init_extent_tree = 1; ctree_flags |= (OPEN_CTREE_WRITES | OPEN_CTREE_NO_BLOCK_GROUPS); - repair = 1; + opt_check_repair = 1; break; case GETOPT_VAL_CHECK_CSUM: check_data_csum = 1; @@ -10083,12 +10083,12 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) } /* This check is the only reason for --readonly to exist */ - if (readonly && repair) { + if (readonly && opt_check_repair) { error("repair options are not compatible with --readonly"); exit(1); } - if (repair && !force) { + if (opt_check_repair && !force) { int delay = 10; printf("WARNING:\n\n"); @@ -10109,7 +10109,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) /* * experimental and dangerous */ - if (repair && check_mode == CHECK_MODE_LOWMEM) + if (opt_check_repair && check_mode == CHECK_MODE_LOWMEM) warning("low-memory mode repair support is only partial"); printf("Opening filesystem to check...\n"); @@ -10146,7 +10146,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) } /* only allow partial opening under repair mode */ - if (repair) + if (opt_check_repair) ctree_flags |= OPEN_CTREE_PARTIAL; ocf.filename = argv[optind]; @@ -10196,7 +10196,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) * repair mode will force us to commit transaction which * will make us fail to load log tree when mounting. */ - if (repair && btrfs_super_log_root(gfs_info->super_copy)) { + if (opt_check_repair && btrfs_super_log_root(gfs_info->super_copy)) { ret = ask_user("repair mode will force to clear out log tree, are you sure?"); if (!ret) { ret = 1; @@ -10303,11 +10303,11 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) * fatal. But for non-repair, it's pretty rare to hit * such v3.17 era bug, we want to continue check. */ - if (repair) + if (opt_check_repair) goto close_out; err |= 1; } else { - if (repair) { + if (opt_check_repair) { fprintf(stderr, "Fixed %d roots.\n", ret); ret = 0; } else if (ret > 0) { @@ -10420,7 +10420,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) "[6/7] checking root refs done with fs roots in lowmem mode, skipping\n"); } - while (repair && !list_empty(&gfs_info->recow_ebs)) { + while (opt_check_repair && !list_empty(&gfs_info->recow_ebs)) { struct extent_buffer *eb; eb = list_first_entry(&gfs_info->recow_ebs, @@ -10440,7 +10440,7 @@ static int cmd_check(const struct cmd_struct *cmd, int argc, char **argv) bad = list_first_entry(&delete_items, struct bad_item, list); list_del_init(&bad->list); - if (repair) { + if (opt_check_repair) { ret = delete_bad_item(root, bad); err |= !!ret; } diff --git a/check/mode-common.c b/check/mode-common.c index 61e8c821..e70b7954 100644 --- a/check/mode-common.c +++ b/check/mode-common.c @@ -1041,7 +1041,7 @@ int check_repair_free_space_inode(struct btrfs_path *path) "free space cache inode %llu has invalid mode: has 0%o expect 0%o", key.objectid, mode, FREE_SPACE_CACHE_INODE_MODE); ret = -EUCLEAN; - if (repair) { + if (opt_check_repair) { ret = repair_imode_common(gfs_info->tree_root, path); if (ret < 0) return ret; @@ -1654,7 +1654,7 @@ int check_and_repair_super_num_devs(struct btrfs_fs_info *fs_info) btrfs_super_num_devices(fs_info->super_copy), found_devs); - if (!repair) + if (!opt_check_repair) return -EUCLEAN; /* diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 7c26a33b..8ee38323 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -1208,7 +1208,7 @@ next: tmp_err |= find_dir_item(root, &key, &location, namebuf, len, imode_to_type(mode)); end: - if (tmp_err && repair) { + if (tmp_err && opt_check_repair) { ret = repair_ternary_lowmem(root, ref_key->offset, ref_key->objectid, index, namebuf, name_len, imode_to_type(mode), @@ -1810,7 +1810,7 @@ begin: index = key.offset; next: - if (tmp_err && repair) { + if (tmp_err && opt_check_repair) { ret = repair_dir_item(root, di_key, location.objectid, index, imode_to_type(mode), namebuf, @@ -2002,7 +2002,7 @@ static int check_file_extent_inline(struct btrfs_root *root, "root %llu EXTENT_DATA[%llu %llu] wrong inline size, have: %llu, expected: %u", root->objectid, fkey.objectid, fkey.offset, extent_num_bytes, item_inline_len); - if (repair) { + if (opt_check_repair) { ret = repair_inline_ram_bytes(root, path, &extent_num_bytes); if (ret) @@ -2153,10 +2153,10 @@ static int check_file_extent(struct btrfs_root *root, struct btrfs_path *path, /* Check EXTENT_DATA hole */ if (!no_holes && (fkey.offset < isize) && (*end != fkey.offset)) { - if (repair) + if (opt_check_repair) ret = punch_extent_hole(root, path, fkey.objectid, *end, fkey.offset - *end); - if (!repair || ret) { + if (!opt_check_repair || ret) { err |= FILE_EXTENT_ERROR; error( "root %llu EXTENT_DATA[%llu %llu] gap exists, expected: EXTENT_DATA[%llu %llu]", @@ -2645,7 +2645,7 @@ static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path) if (!is_valid_imode(mode)) { error("invalid imode mode bits: 0%o", mode); - if (repair) { + if (opt_check_repair) { ret = repair_imode_common(root, path); if (ret < 0) err |= INODE_MODE_ERROR; @@ -2664,7 +2664,7 @@ static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path) error( "invalid inode generation %llu or transid %llu for ino %llu, expect [0, %llu)", generation, transid, inode_id, gen_uplimit); - if (repair) { + if (opt_check_repair) { ret = repair_inode_gen_lowmem(root, path); if (ret < 0) err |= INVALID_GENERATION; @@ -2767,12 +2767,12 @@ out: /* verify INODE_ITEM nlink/isize/nbytes */ if (dir) { - if (repair && (err & DIR_COUNT_AGAIN)) { + if (opt_check_repair && (err & DIR_COUNT_AGAIN)) { err &= ~DIR_COUNT_AGAIN; count_dir_isize(root, inode_id, &size); } - if ((nlink != 1 || refs != 1) && repair) { + if ((nlink != 1 || refs != 1) && opt_check_repair) { ret = repair_inode_nlinks_lowmem(root, path, inode_id, namebuf, name_len, refs, imode_to_type(mode), &nlink); @@ -2795,10 +2795,10 @@ out: } if (isize != size && !is_orphan) { - if (repair) + if (opt_check_repair) ret = repair_dir_isize_lowmem(root, path, inode_id, size); - if (!repair || ret) { + if (!opt_check_repair || ret) { err |= ISIZE_ERROR; error( "root %llu DIR INODE [%llu] size %llu not equal to %llu", @@ -2807,21 +2807,21 @@ out: } } else { if (nlink != refs) { - if (repair) + if (opt_check_repair) ret = repair_inode_nlinks_lowmem(root, path, inode_id, namebuf, name_len, refs, imode_to_type(mode), &nlink); - if (!repair || ret) { + if (!opt_check_repair || ret) { err |= LINK_COUNT_ERROR; error( "root %llu INODE[%llu] nlink(%llu) not equal to inode_refs(%llu)", root->objectid, inode_id, nlink, refs); } } else if (!nlink && !is_orphan) { - if (repair) + if (opt_check_repair) ret = repair_inode_orphan_item_lowmem(root, path, inode_id); - if (!repair || ret) { + if (!opt_check_repair || ret) { err |= ORPHAN_ITEM; error("root %llu INODE[%llu] is orphan item", root->objectid, inode_id); @@ -2833,13 +2833,13 @@ out: * time, so skip such repair and don't report them as error. */ if (nbytes != extent_size && !is_orphan) { - if (repair) { + if (opt_check_repair) { ret = repair_inode_nbytes_lowmem(root, path, inode_id, extent_size); if (!ret) nbytes = extent_size; } - if (!repair || ret) { + if (!opt_check_repair || ret) { err |= NBYTES_ERROR; error( "root %llu INODE[%llu] nbytes %llu not equal to extent_size %llu", @@ -2849,10 +2849,10 @@ out: } if (!nbytes && !no_holes && extent_end < isize) { - if (repair) + if (opt_check_repair) ret = punch_extent_hole(root, path, inode_id, extent_end, isize - extent_end); - if (!repair || ret) { + if (!opt_check_repair || ret) { err |= NBYTES_ERROR; error( "root %llu INODE[%llu] size %llu should have a file extent hole", @@ -4379,7 +4379,7 @@ next: } if ((tmp_err & (REFERENCER_MISSING | REFERENCER_MISMATCH)) - && repair) { + && opt_check_repair) { ret = repair_extent_item(path, key.objectid, num_bytes, parent, root_objectid, owner, owner_offset); if (ret < 0) { @@ -4405,7 +4405,7 @@ next: goto next; } } - if ((tmp_err & INVALID_GENERATION) && repair){ + if ((tmp_err & INVALID_GENERATION) && opt_check_repair){ ret = repair_extent_item_generation(path); if (ret < 0) { err |= tmp_err; @@ -4841,20 +4841,20 @@ again: switch (type) { case BTRFS_EXTENT_DATA_KEY: ret = check_extent_data_item(root, path, nrefs, account_bytes); - if (repair && ret) + if (opt_check_repair && ret) ret = repair_extent_data_item(root, path, nrefs, ret); err |= ret; break; case BTRFS_BLOCK_GROUP_ITEM_KEY: ret = check_block_group_item(eb, slot); - if (repair && + if (opt_check_repair && ret & REFERENCER_MISSING) ret = delete_item(root, path); err |= ret; break; case BTRFS_DEV_ITEM_KEY: ret = check_dev_item(eb, slot, &bytes_used_expected); - if (repair && (ret & ACCOUNTING_MISMATCH) && + if (opt_check_repair && (ret & ACCOUNTING_MISMATCH) && bytes_used_expected != (u64)-1) { ret = repair_dev_item_bytes_used(root->fs_info, key.offset, bytes_used_expected); @@ -4865,7 +4865,7 @@ again: break; case BTRFS_CHUNK_ITEM_KEY: ret = check_chunk_item(eb, slot); - if (repair && ret) + if (opt_check_repair && ret) ret = repair_chunk_item(root, path, ret); err |= ret; break; @@ -4884,7 +4884,7 @@ again: break; case BTRFS_TREE_BLOCK_REF_KEY: ret = check_tree_block_backref(key.offset, key.objectid, -1); - if (repair && + if (opt_check_repair && ret & (REFERENCER_MISMATCH | REFERENCER_MISSING)) ret = delete_item(root, path); err |= ret; @@ -4897,21 +4897,21 @@ again: btrfs_extent_data_ref_offset(eb, dref), key.objectid, 0, btrfs_extent_data_ref_count(eb, dref)); - if (repair && + if (opt_check_repair && ret & (REFERENCER_MISMATCH | REFERENCER_MISSING)) ret = delete_item(root, path); err |= ret; break; case BTRFS_SHARED_BLOCK_REF_KEY: ret = check_shared_block_backref(key.offset, key.objectid, -1); - if (repair && + if (opt_check_repair && ret & (REFERENCER_MISMATCH | REFERENCER_MISSING)) ret = delete_item(root, path); err |= ret; break; case BTRFS_SHARED_DATA_REF_KEY: ret = check_shared_data_backref(key.offset, key.objectid); - if (repair && + if (opt_check_repair && ret & (REFERENCER_MISMATCH | REFERENCER_MISSING)) ret = delete_item(root, path); err |= ret; @@ -4976,7 +4976,7 @@ static int walk_down_tree(struct btrfs_root *root, struct btrfs_path *path, btrfs_header_bytenr(cur), btrfs_header_level(cur), btrfs_header_owner(cur), nrefs); - if (repair && ret) + if (opt_check_repair && ret) ret = repair_tree_block_ref(root, path->nodes[*level], nrefs, *level, ret); err |= ret; @@ -5221,7 +5221,7 @@ static int check_fs_first_inode(struct btrfs_root *root) out: btrfs_release_path(&path); - if (err && repair) + if (err && opt_check_repair) err = repair_fs_first_inode(root, err); if (err & (INODE_ITEM_MISSING | INODE_ITEM_MISMATCH)) @@ -5277,7 +5277,7 @@ static int check_btrfs_root(struct btrfs_root *root, int check_all) root->root_key.objectid, btrfs_root_generation(root_item), super_generation + 1); err |= INVALID_GENERATION; - if (repair) { + if (opt_check_repair) { root->node->flags |= EXTENT_BAD_TRANSID; ret = recow_extent_buffer(root, root->node); if (!ret) { @@ -5516,7 +5516,7 @@ next: * In repair mode, our path is no longer reliable as CoW can * happen. We need to reset our path. */ - if (repair) { + if (opt_check_repair) { btrfs_release_path(&path); ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0); @@ -5622,7 +5622,7 @@ out: err |= SUPER_BYTES_USED_ERROR; } - if (repair) { + if (opt_check_repair) { ret = end_avoid_extents_overwrite(); if (ret < 0) ret = FATAL_ERROR; diff --git a/check/qgroup-verify.c b/check/qgroup-verify.c index 68b45315..22e1980d 100644 --- a/check/qgroup-verify.c +++ b/check/qgroup-verify.c @@ -1326,7 +1326,7 @@ void report_qgroups(int all) struct rb_node *node; struct qgroup_count *c; - if (!repair && counts.rescan_running) { + if (!opt_check_repair && counts.rescan_running) { if (all) { printf( "Qgroup rescan is running, a difference in qgroup counts is expected\n"); diff --git a/check/repair.c b/check/repair.c index d3db2bb6..f84df9cf 100644 --- a/check/repair.c +++ b/check/repair.c @@ -30,7 +30,7 @@ #include "common/extent-cache.h" #include "check/repair.h" -int repair = 0; +int opt_check_repair = 0; int btrfs_add_corrupt_extent_record(struct btrfs_fs_info *info, struct btrfs_key *first_key, diff --git a/check/repair.h b/check/repair.h index 48e7ddb1..3e6ffcf6 100644 --- a/check/repair.h +++ b/check/repair.h @@ -26,7 +26,8 @@ struct btrfs_trans_handle; struct extent_io_tree; -extern int repair; /* repair mode */ +/* Repair mode */ +extern int opt_check_repair; struct btrfs_corrupt_block { struct cache_extent cache;