summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fb.com>2014-10-10 16:57:11 -0400
committerDavid Sterba <dsterba@suse.cz>2014-10-14 10:40:22 +0200
commita8e9c9a65b337117e87d2a040697edf6816369c3 (patch)
tree8bd13b02f7279e7c0ab88f0b02a40abd82d00356
parent2ba12173d59af0b3f8885494eae9efbe15d143d6 (diff)
Btrfs-progs: reset chunk state if we restart check
If we hid a corrupt block that we fix and we restart the fsck loop you will get lots of noise about duplicate block groups and such. This is because we don't clear the block group and chunk cache when we do this restart. This patch fixes that, which is a little tricky since the structs are linked together with various linked lists, but this passed with a user who was hitting this problem. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: David Sterba <dsterba@suse.cz>
-rw-r--r--cmds-check.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/cmds-check.c b/cmds-check.c
index fede71ed..131eba95 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -3217,6 +3217,8 @@ static void free_chunk_record(struct cache_extent *cache)
struct chunk_record *rec;
rec = container_of(cache, struct chunk_record, cache);
+ list_del_init(&rec->list);
+ list_del_init(&rec->dextents);
free(rec);
}
@@ -3253,6 +3255,7 @@ static void free_block_group_record(struct cache_extent *cache)
struct block_group_record *rec;
rec = container_of(cache, struct block_group_record, cache);
+ list_del_init(&rec->list);
free(rec);
}
@@ -3286,6 +3289,10 @@ static void free_device_extent_record(struct cache_extent *cache)
struct device_extent_record *rec;
rec = container_of(cache, struct device_extent_record, cache);
+ if (!list_empty(&rec->chunk_list))
+ list_del_init(&rec->chunk_list);
+ if (!list_empty(&rec->device_list))
+ list_del_init(&rec->device_list);
free(rec);
}
@@ -6019,7 +6026,7 @@ static int check_device_used(struct device_record *dev_rec,
if (dev_extent_rec->objectid != dev_rec->devid)
break;
- list_del(&dev_extent_rec->device_list);
+ list_del_init(&dev_extent_rec->device_list);
total_byte += dev_extent_rec->length;
cache = next_cache_extent(cache);
}
@@ -6249,6 +6256,10 @@ again:
free_extent_cache_tree(&pending);
free_extent_cache_tree(&reada);
free_extent_cache_tree(&nodes);
+ free_chunk_cache_tree(&chunk_cache);
+ free_block_group_tree(&block_group_cache);
+ free_device_cache_tree(&dev_cache);
+ free_device_extent_tree(&dev_extent_cache);
free_extent_record_cache(root->fs_info, &extent_cache);
goto again;
}