summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis de Bethencourt <luisbg@osg.samsung.com>2016-03-30 21:53:38 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-06-07 18:18:54 -0700
commit12e137029ba089da7cdef2f7ada60d8fd122c724 (patch)
treeef3810a2958455ada84a9215541fed8410ea08db
parentfd76c86b672d8971ec708977902f657e0a1d7af8 (diff)
downloadlinux-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.c16
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;