path: root/extent-tree.c
diff options
authorJosef Bacik <>2015-01-25 17:41:19 -0800
committerJosef Bacik <>2015-02-09 14:53:15 -0500
commitbce7dbba2859a47554c122eae32ead87e6a6510a (patch)
tree82594963a83f0b4497fb6185dab6a2c9253c9adc /extent-tree.c
parent797a937e5dd8db0092add633a80f3cd698e182df (diff)
Btrfs-progs: only build space info's for the main flags
Hitting enospc problems with a really corrupt fs uncovered the fact that we match any flag in a block group when creating space info's. This is a problem if we have a raid level set, we'll end up with only one space info that covers metadata and data because they share a raid level. We don't want this, we want to separate out the data and metadata space infos, so mask off the raid level and only use the main flags. Thanks, Signed-off-by: Josef Bacik <>
Diffstat (limited to 'extent-tree.c')
1 files changed, 5 insertions, 5 deletions
diff --git a/extent-tree.c b/extent-tree.c
index 1785e226..d42c5727 100644
--- a/extent-tree.c
+++ b/extent-tree.c
@@ -1789,11 +1789,11 @@ int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans,
static struct btrfs_space_info *__find_space_info(struct btrfs_fs_info *info,
u64 flags)
- struct list_head *head = &info->space_info;
- struct list_head *cur;
struct btrfs_space_info *found;
- list_for_each(cur, head) {
- found = list_entry(cur, struct btrfs_space_info, list);
+ list_for_each_entry(found, &info->space_info, list) {
if (found->flags & flags)
return found;
@@ -1825,7 +1825,7 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,
return -ENOMEM;
list_add(&found->list, &info->space_info);
- found->flags = flags;
+ found->flags = flags & BTRFS_BLOCK_GROUP_TYPE_MASK;
found->total_bytes = total_bytes;
found->bytes_used = bytes_used;
found->bytes_pinned = 0;