diff options
Diffstat (limited to 'fs/btrfs/sysfs.c')
| -rw-r--r-- | fs/btrfs/sysfs.c | 85 | 
1 files changed, 84 insertions, 1 deletions
| diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index af545b6b1190..03926ad467c9 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -385,6 +385,8 @@ static const char *rescue_opts[] = {  	"nologreplay",  	"ignorebadroots",  	"ignoredatacsums", +	"ignoremetacsums", +	"ignoresuperflags",  	"all",  }; @@ -894,6 +896,9 @@ SPACE_INFO_ATTR(bytes_readonly);  SPACE_INFO_ATTR(bytes_zone_unusable);  SPACE_INFO_ATTR(disk_used);  SPACE_INFO_ATTR(disk_total); +SPACE_INFO_ATTR(reclaim_count); +SPACE_INFO_ATTR(reclaim_bytes); +SPACE_INFO_ATTR(reclaim_errors);  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); @@ -902,8 +907,12 @@ static ssize_t btrfs_sinfo_bg_reclaim_threshold_show(struct kobject *kobj,  						     char *buf)  {  	struct btrfs_space_info *space_info = to_space_info(kobj); +	ssize_t ret; -	return sysfs_emit(buf, "%d\n", READ_ONCE(space_info->bg_reclaim_threshold)); +	spin_lock(&space_info->lock); +	ret = sysfs_emit(buf, "%d\n", btrfs_calc_reclaim_threshold(space_info)); +	spin_unlock(&space_info->lock); +	return ret;  }  static ssize_t btrfs_sinfo_bg_reclaim_threshold_store(struct kobject *kobj, @@ -914,6 +923,9 @@ static ssize_t btrfs_sinfo_bg_reclaim_threshold_store(struct kobject *kobj,  	int thresh;  	int ret; +	if (READ_ONCE(space_info->dynamic_reclaim)) +		return -EINVAL; +  	ret = kstrtoint(buf, 10, &thresh);  	if (ret)  		return ret; @@ -930,6 +942,72 @@ BTRFS_ATTR_RW(space_info, bg_reclaim_threshold,  	      btrfs_sinfo_bg_reclaim_threshold_show,  	      btrfs_sinfo_bg_reclaim_threshold_store); +static ssize_t btrfs_sinfo_dynamic_reclaim_show(struct kobject *kobj, +						struct kobj_attribute *a, +						char *buf) +{ +	struct btrfs_space_info *space_info = to_space_info(kobj); + +	return sysfs_emit(buf, "%d\n", READ_ONCE(space_info->dynamic_reclaim)); +} + +static ssize_t btrfs_sinfo_dynamic_reclaim_store(struct kobject *kobj, +						 struct kobj_attribute *a, +						 const char *buf, size_t len) +{ +	struct btrfs_space_info *space_info = to_space_info(kobj); +	int dynamic_reclaim; +	int ret; + +	ret = kstrtoint(buf, 10, &dynamic_reclaim); +	if (ret) +		return ret; + +	if (dynamic_reclaim < 0) +		return -EINVAL; + +	WRITE_ONCE(space_info->dynamic_reclaim, dynamic_reclaim != 0); + +	return len; +} + +BTRFS_ATTR_RW(space_info, dynamic_reclaim, +	      btrfs_sinfo_dynamic_reclaim_show, +	      btrfs_sinfo_dynamic_reclaim_store); + +static ssize_t btrfs_sinfo_periodic_reclaim_show(struct kobject *kobj, +						struct kobj_attribute *a, +						char *buf) +{ +	struct btrfs_space_info *space_info = to_space_info(kobj); + +	return sysfs_emit(buf, "%d\n", READ_ONCE(space_info->periodic_reclaim)); +} + +static ssize_t btrfs_sinfo_periodic_reclaim_store(struct kobject *kobj, +						 struct kobj_attribute *a, +						 const char *buf, size_t len) +{ +	struct btrfs_space_info *space_info = to_space_info(kobj); +	int periodic_reclaim; +	int ret; + +	ret = kstrtoint(buf, 10, &periodic_reclaim); +	if (ret) +		return ret; + +	if (periodic_reclaim < 0) +		return -EINVAL; + +	WRITE_ONCE(space_info->periodic_reclaim, periodic_reclaim != 0); + +	return len; +} + +BTRFS_ATTR_RW(space_info, periodic_reclaim, +	      btrfs_sinfo_periodic_reclaim_show, +	      btrfs_sinfo_periodic_reclaim_store); +  /*   * Allocation information about block group types.   * @@ -947,8 +1025,13 @@ static struct attribute *space_info_attrs[] = {  	BTRFS_ATTR_PTR(space_info, disk_used),  	BTRFS_ATTR_PTR(space_info, disk_total),  	BTRFS_ATTR_PTR(space_info, bg_reclaim_threshold), +	BTRFS_ATTR_PTR(space_info, dynamic_reclaim),  	BTRFS_ATTR_PTR(space_info, chunk_size),  	BTRFS_ATTR_PTR(space_info, size_classes), +	BTRFS_ATTR_PTR(space_info, reclaim_count), +	BTRFS_ATTR_PTR(space_info, reclaim_bytes), +	BTRFS_ATTR_PTR(space_info, reclaim_errors), +	BTRFS_ATTR_PTR(space_info, periodic_reclaim),  #ifdef CONFIG_BTRFS_DEBUG  	BTRFS_ATTR_PTR(space_info, force_chunk_alloc),  #endif |