Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 899c81ea authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

Btrfs: add wrappers for working with alloc profiles



Add functions to abstract the conversion between chunk and extended
allocation profile formats and switch everybody to use them.

Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent e3176ca2
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -849,6 +849,21 @@ struct btrfs_csum_item {
 */
#define BTRFS_AVAIL_ALLOC_BIT_SINGLE	(1ULL << 48)

#define BTRFS_EXTENDED_PROFILE_MASK	(BTRFS_BLOCK_GROUP_PROFILE_MASK | \
					 BTRFS_AVAIL_ALLOC_BIT_SINGLE)

static inline u64 chunk_to_extended(u64 flags)
{
	if ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0)
		flags |= BTRFS_AVAIL_ALLOC_BIT_SINGLE;

	return flags;
}
static inline u64 extended_to_chunk(u64 flags)
{
	return flags & ~BTRFS_AVAIL_ALLOC_BIT_SINGLE;
}

struct btrfs_block_group_item {
	__le64 used;
	__le64 chunk_objectid;
+7 −18
Original line number Diff line number Diff line
@@ -3098,11 +3098,8 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,

static void set_avail_alloc_bits(struct btrfs_fs_info *fs_info, u64 flags)
{
	u64 extra_flags = flags & BTRFS_BLOCK_GROUP_PROFILE_MASK;

	/* chunk -> extended profile */
	if (extra_flags == 0)
		extra_flags = BTRFS_AVAIL_ALLOC_BIT_SINGLE;
	u64 extra_flags = chunk_to_extended(flags) &
				BTRFS_EXTENDED_PROFILE_MASK;

	if (flags & BTRFS_BLOCK_GROUP_DATA)
		fs_info->avail_data_alloc_bits |= extra_flags;
@@ -3181,9 +3178,7 @@ u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags)
	}

out:
	/* extended -> chunk profile */
	flags &= ~BTRFS_AVAIL_ALLOC_BIT_SINGLE;
	return flags;
	return extended_to_chunk(flags);
}

static u64 get_alloc_profile(struct btrfs_root *root, u64 flags)
@@ -6914,11 +6909,8 @@ static u64 update_block_group_flags(struct btrfs_root *root, u64 flags)
			tgt = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target;
		}

		if (tgt) {
			/* extended -> chunk profile */
			tgt &= ~BTRFS_AVAIL_ALLOC_BIT_SINGLE;
			return tgt;
		}
		if (tgt)
			return extended_to_chunk(tgt);
	}

	/*
@@ -7597,11 +7589,8 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans,

static void clear_avail_alloc_bits(struct btrfs_fs_info *fs_info, u64 flags)
{
	u64 extra_flags = flags & BTRFS_BLOCK_GROUP_PROFILE_MASK;

	/* chunk -> extended profile */
	if (extra_flags == 0)
		extra_flags = BTRFS_AVAIL_ALLOC_BIT_SINGLE;
	u64 extra_flags = chunk_to_extended(flags) &
				BTRFS_EXTENDED_PROFILE_MASK;

	if (flags & BTRFS_BLOCK_GROUP_DATA)
		fs_info->avail_data_alloc_bits &= ~extra_flags;
+8 −12
Original line number Diff line number Diff line
@@ -2250,15 +2250,13 @@ static void unset_balance_control(struct btrfs_fs_info *fs_info)
 * Balance filters.  Return 1 if chunk should be filtered out
 * (should not be balanced).
 */
static int chunk_profiles_filter(u64 chunk_profile,
static int chunk_profiles_filter(u64 chunk_type,
				 struct btrfs_balance_args *bargs)
{
	chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK;
	chunk_type = chunk_to_extended(chunk_type) &
				BTRFS_EXTENDED_PROFILE_MASK;

	if (chunk_profile == 0)
		chunk_profile = BTRFS_AVAIL_ALLOC_BIT_SINGLE;

	if (bargs->profiles & chunk_profile)
	if (bargs->profiles & chunk_type)
		return 0;

	return 1;
@@ -2365,18 +2363,16 @@ static int chunk_vrange_filter(struct extent_buffer *leaf,
	return 1;
}

static int chunk_soft_convert_filter(u64 chunk_profile,
static int chunk_soft_convert_filter(u64 chunk_type,
				     struct btrfs_balance_args *bargs)
{
	if (!(bargs->flags & BTRFS_BALANCE_ARGS_CONVERT))
		return 0;

	chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK;

	if (chunk_profile == 0)
		chunk_profile = BTRFS_AVAIL_ALLOC_BIT_SINGLE;
	chunk_type = chunk_to_extended(chunk_type) &
				BTRFS_EXTENDED_PROFILE_MASK;

	if (bargs->target & chunk_profile)
	if (bargs->target == chunk_type)
		return 1;

	return 0;