Commit 207dde82 authored by Josef Bacik's avatar Josef Bacik

Btrfs: check for duplicate entries in the free space cache

If there are duplicate entries in the free space cache, discard the entire cache
and load it the old fashioned way.  Thanks,
Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
parent cca1c81f
...@@ -420,7 +420,14 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info, ...@@ -420,7 +420,14 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info,
spin_lock(&block_group->tree_lock); spin_lock(&block_group->tree_lock);
ret = link_free_space(block_group, e); ret = link_free_space(block_group, e);
spin_unlock(&block_group->tree_lock); spin_unlock(&block_group->tree_lock);
BUG_ON(ret); if (ret) {
printk(KERN_ERR "Duplicate entries in "
"free space cache, dumping\n");
kunmap(page);
unlock_page(page);
page_cache_release(page);
goto free_cache;
}
} else { } else {
e->bitmap = kzalloc(PAGE_CACHE_SIZE, GFP_NOFS); e->bitmap = kzalloc(PAGE_CACHE_SIZE, GFP_NOFS);
if (!e->bitmap) { if (!e->bitmap) {
...@@ -437,6 +444,14 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info, ...@@ -437,6 +444,14 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info,
recalculate_thresholds(block_group); recalculate_thresholds(block_group);
spin_unlock(&block_group->tree_lock); spin_unlock(&block_group->tree_lock);
list_add_tail(&e->list, &bitmaps); list_add_tail(&e->list, &bitmaps);
if (ret) {
printk(KERN_ERR "Duplicate entries in "
"free space cache, dumping\n");
kunmap(page);
unlock_page(page);
page_cache_release(page);
goto free_cache;
}
} }
num_entries--; num_entries--;
...@@ -909,10 +924,16 @@ static int tree_insert_offset(struct rb_root *root, u64 offset, ...@@ -909,10 +924,16 @@ static int tree_insert_offset(struct rb_root *root, u64 offset,
* logically. * logically.
*/ */
if (bitmap) { if (bitmap) {
WARN_ON(info->bitmap); if (info->bitmap) {
WARN_ON_ONCE(1);
return -EEXIST;
}
p = &(*p)->rb_right; p = &(*p)->rb_right;
} else { } else {
WARN_ON(!info->bitmap); if (!info->bitmap) {
WARN_ON_ONCE(1);
return -EEXIST;
}
p = &(*p)->rb_left; p = &(*p)->rb_left;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment