diff options
Diffstat (limited to 'extent-tree.c')
-rw-r--r-- | extent-tree.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/extent-tree.c b/extent-tree.c index 6a5194c5..b4ae95a9 100644 --- a/extent-tree.c +++ b/extent-tree.c @@ -61,6 +61,31 @@ void maybe_unlock_mutex(struct btrfs_root *root) { } +static int remove_sb_from_cache(struct btrfs_root *root, + struct btrfs_block_group_cache *cache) +{ + u64 bytenr; + u64 *logical; + int stripe_len; + int i, nr, ret; + struct extent_io_tree *free_space_cache; + + free_space_cache = &root->fs_info->free_space_cache; + for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) { + bytenr = btrfs_sb_offset(i); + ret = btrfs_rmap_block(&root->fs_info->mapping_tree, + cache->key.objectid, bytenr, 0, + &logical, &nr, &stripe_len); + BUG_ON(ret); + while (nr--) { + clear_extent_dirty(free_space_cache, logical[nr], + logical[nr] + stripe_len - 1, GFP_NOFS); + } + kfree(logical); + } + return 0; +} + static int cache_block_group(struct btrfs_root *root, struct btrfs_block_group_cache *block_group) { @@ -153,6 +178,7 @@ next: set_extent_dirty(free_space_cache, last, last + hole_size - 1, GFP_NOFS); } + remove_sb_from_cache(root, block_group); block_group->cached = 1; err: btrfs_free_path(path); |