diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/btrfs/ctree.h | 9 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 20 | 
2 files changed, 28 insertions, 1 deletions
| diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index d8a669ed5506..ad1a5943a923 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -987,7 +987,8 @@ struct btrfs_dev_replace_item {  #define BTRFS_BLOCK_GROUP_RAID10	(1ULL << 6)  #define BTRFS_BLOCK_GROUP_RAID5         (1ULL << 7)  #define BTRFS_BLOCK_GROUP_RAID6         (1ULL << 8) -#define BTRFS_BLOCK_GROUP_RESERVED	BTRFS_AVAIL_ALLOC_BIT_SINGLE +#define BTRFS_BLOCK_GROUP_RESERVED	(BTRFS_AVAIL_ALLOC_BIT_SINGLE | \ +					 BTRFS_SPACE_INFO_GLOBAL_RSV)  enum btrfs_raid_types {  	BTRFS_RAID_RAID10, @@ -1019,6 +1020,12 @@ enum btrfs_raid_types {   */  #define BTRFS_AVAIL_ALLOC_BIT_SINGLE	(1ULL << 48) +/* + * A fake block group type that is used to communicate global block reserve + * size to userspace via the SPACE_INFO ioctl. + */ +#define BTRFS_SPACE_INFO_GLOBAL_RSV	(1ULL << 49) +  #define BTRFS_EXTENDED_PROFILE_MASK	(BTRFS_BLOCK_GROUP_PROFILE_MASK | \  					 BTRFS_AVAIL_ALLOC_BIT_SINGLE) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 89d5db7eb452..f2e8fcc279a3 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -3562,6 +3562,11 @@ static long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg)  		up_read(&info->groups_sem);  	} +	/* +	 * Global block reserve, exported as a space_info +	 */ +	slot_count++; +  	/* space_slots == 0 means they are asking for a count */  	if (space_args.space_slots == 0) {  		space_args.total_spaces = slot_count; @@ -3620,6 +3625,21 @@ static long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg)  		up_read(&info->groups_sem);  	} +	/* +	 * Add global block reserve +	 */ +	if (slot_count) { +		struct btrfs_block_rsv *block_rsv = &root->fs_info->global_block_rsv; + +		spin_lock(&block_rsv->lock); +		space.total_bytes = block_rsv->size; +		space.used_bytes = block_rsv->size - block_rsv->reserved; +		spin_unlock(&block_rsv->lock); +		space.flags = BTRFS_SPACE_INFO_GLOBAL_RSV; +		memcpy(dest, &space, sizeof(space)); +		space_args.total_spaces++; +	} +  	user_dest = (struct btrfs_ioctl_space_info __user *)  		(arg + sizeof(struct btrfs_ioctl_space_args)); | 
