mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-11 03:31:17 +00:00
btrfsck: make sure we fix the block group accounting during repair
The block group accounting is fixed after we check the extent back references. This makes sure the accounting is fixed unless we were not able to repair the backrefs. Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
47b104b7f1
commit
ae1822f73f
12
btrfsck.c
12
btrfsck.c
@ -3070,7 +3070,12 @@ repair_abort:
|
||||
if (ret) {
|
||||
fprintf(stderr, "failed to repair damaged filesystem, aborting\n");
|
||||
exit(1);
|
||||
} else {
|
||||
btrfs_fix_block_accounting(trans, root);
|
||||
}
|
||||
if (err)
|
||||
fprintf(stderr, "repaired damaged extent references\n");
|
||||
return ret;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@ -3262,11 +3267,10 @@ int main(int ac, char **av)
|
||||
}
|
||||
|
||||
ret = check_extents(trans, root, repair);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
fprintf(stderr, "check extents failed with %d!!!!!!!!!\n", ret);
|
||||
goto out;
|
||||
|
||||
if (repair)
|
||||
btrfs_fix_block_accounting(trans, root);
|
||||
}
|
||||
|
||||
fprintf(stderr, "checking fs roots\n");
|
||||
ret = check_fs_roots(root, &root_cache);
|
||||
|
@ -1953,6 +1953,21 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int extent_root_pending_ops(struct btrfs_fs_info *info)
|
||||
{
|
||||
u64 start;
|
||||
u64 end;
|
||||
int ret;
|
||||
|
||||
ret = find_first_extent_bit(&info->extent_ins, 0, &start,
|
||||
&end, EXTENT_LOCKED);
|
||||
if (!ret) {
|
||||
ret = find_first_extent_bit(&info->pending_del, 0, &start, &end,
|
||||
EXTENT_LOCKED);
|
||||
}
|
||||
return ret == 0;
|
||||
|
||||
}
|
||||
static int finish_current_insert(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *extent_root)
|
||||
{
|
||||
@ -3380,6 +3395,15 @@ int btrfs_fix_block_accounting(struct btrfs_trans_handle *trans,
|
||||
|
||||
root = root->fs_info->extent_root;
|
||||
|
||||
while(extent_root_pending_ops(fs_info)) {
|
||||
ret = finish_current_insert(trans, root);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = del_pending_extents(trans, root);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
while(1) {
|
||||
cache = btrfs_lookup_block_group(fs_info, start);
|
||||
if (!cache)
|
||||
|
Loading…
Reference in New Issue
Block a user