Skip to content

Commit

Permalink
btrfs: fix mixed block count of available space
Browse files Browse the repository at this point in the history
Metadata for mixed block is already accounted in total data and should not
be counted as part of the free metadata space.

Signed-off-by: Luis de Bethencourt <luisbg@osg.samsung.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=114281
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
Luis de Bethencourt authored and David Sterba committed May 6, 2016
1 parent 88be159 commit ae02d1b
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions fs/btrfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -2051,6 +2051,7 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv;
int ret;
u64 thresh = 0;
int mixed = 0;

/*
* holding chunk_muext to avoid allocating new chunks, holding
Expand All @@ -2076,8 +2077,17 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
}
}
}
if (found->flags & BTRFS_BLOCK_GROUP_METADATA)
total_free_meta += found->disk_total - found->disk_used;

/*
* Metadata in mixed block goup profiles are accounted in data
*/
if (!mixed && found->flags & BTRFS_BLOCK_GROUP_METADATA) {
if (found->flags & BTRFS_BLOCK_GROUP_DATA)
mixed = 1;
else
total_free_meta += found->disk_total -
found->disk_used;
}

total_used += found->disk_used;
}
Expand Down Expand Up @@ -2115,7 +2125,7 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
*/
thresh = 4 * 1024 * 1024;

if (total_free_meta - thresh < block_rsv->size)
if (!mixed && total_free_meta - thresh < block_rsv->size)
buf->f_bavail = 0;

buf->f_type = BTRFS_SUPER_MAGIC;
Expand Down

0 comments on commit ae02d1b

Please sign in to comment.