diff options
| author | Luis de Bethencourt <luisbg@osg.samsung.com> | 2016-03-30 21:53:38 +0100 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-06-07 18:18:54 -0700 |
| commit | 12e137029ba089da7cdef2f7ada60d8fd122c724 (patch) | |
| tree | ef3810a2958455ada84a9215541fed8410ea08db | |
| parent | fd76c86b672d8971ec708977902f657e0a1d7af8 (diff) | |
| download | linux-stable-12e137029ba089da7cdef2f7ada60d8fd122c724.tar.gz linux-stable-12e137029ba089da7cdef2f7ada60d8fd122c724.zip | |
btrfs: fix mixed block count of available space
commit ae02d1bd070767e109f4a6f1bb1f466e9698a355 upstream.
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
| -rw-r--r-- | fs/btrfs/super.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index d41e09fe8e38..4e6f842b5ad2 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -2024,6 +2024,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 @@ -2049,8 +2050,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; } @@ -2088,7 +2098,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; |
