diff options
Diffstat (limited to 'fs/btrfs/sysfs.c')
| -rw-r--r-- | fs/btrfs/sysfs.c | 42 | 
1 files changed, 42 insertions, 0 deletions
| diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index 8c5efa5813b3..37fc58a7f27e 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -9,6 +9,7 @@  #include <linux/spinlock.h>  #include <linux/completion.h>  #include <linux/bug.h> +#include <linux/list.h>  #include <crypto/hash.h>  #include "messages.h"  #include "ctree.h" @@ -778,6 +779,45 @@ static ssize_t btrfs_chunk_size_store(struct kobject *kobj,  	return len;  } +static ssize_t btrfs_size_classes_show(struct kobject *kobj, +				       struct kobj_attribute *a, char *buf) +{ +	struct btrfs_space_info *sinfo = to_space_info(kobj); +	struct btrfs_block_group *bg; +	u32 none = 0; +	u32 small = 0; +	u32 medium = 0; +	u32 large = 0; + +	for (int i = 0; i < BTRFS_NR_RAID_TYPES; ++i) { +		down_read(&sinfo->groups_sem); +		list_for_each_entry(bg, &sinfo->block_groups[i], list) { +			if (!btrfs_block_group_should_use_size_class(bg)) +				continue; +			switch (bg->size_class) { +			case BTRFS_BG_SZ_NONE: +				none++; +				break; +			case BTRFS_BG_SZ_SMALL: +				small++; +				break; +			case BTRFS_BG_SZ_MEDIUM: +				medium++; +				break; +			case BTRFS_BG_SZ_LARGE: +				large++; +				break; +			} +		} +		up_read(&sinfo->groups_sem); +	} +	return sysfs_emit(buf, "none %u\n" +			       "small %u\n" +			       "medium %u\n" +			       "large %u\n", +			       none, small, medium, large); +} +  #ifdef CONFIG_BTRFS_DEBUG  /*   * Request chunk allocation with current chunk size. @@ -835,6 +875,7 @@ SPACE_INFO_ATTR(bytes_zone_unusable);  SPACE_INFO_ATTR(disk_used);  SPACE_INFO_ATTR(disk_total);  BTRFS_ATTR_RW(space_info, chunk_size, btrfs_chunk_size_show, btrfs_chunk_size_store); +BTRFS_ATTR(space_info, size_classes, btrfs_size_classes_show);  static ssize_t btrfs_sinfo_bg_reclaim_threshold_show(struct kobject *kobj,  						     struct kobj_attribute *a, @@ -887,6 +928,7 @@ static struct attribute *space_info_attrs[] = {  	BTRFS_ATTR_PTR(space_info, disk_total),  	BTRFS_ATTR_PTR(space_info, bg_reclaim_threshold),  	BTRFS_ATTR_PTR(space_info, chunk_size), +	BTRFS_ATTR_PTR(space_info, size_classes),  #ifdef CONFIG_BTRFS_DEBUG  	BTRFS_ATTR_PTR(space_info, force_chunk_alloc),  #endif |