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

Commit ed25e9b2 authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

Btrfs: profiles filter



Select chunks based on a given profile mask.

Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent f43ffb60
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -2102,6 +2102,24 @@ static void unset_balance_control(struct btrfs_fs_info *fs_info)
	kfree(bctl);
}

/*
 * Balance filters.  Return 1 if chunk should be filtered out
 * (should not be balanced).
 */
static int chunk_profiles_filter(u64 chunk_profile,
				 struct btrfs_balance_args *bargs)
{
	chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK;

	if (chunk_profile == 0)
		chunk_profile = BTRFS_AVAIL_ALLOC_BIT_SINGLE;

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

	return 1;
}

static int should_balance_chunk(struct btrfs_root *root,
				struct extent_buffer *leaf,
				struct btrfs_chunk *chunk, u64 chunk_offset)
@@ -2123,6 +2141,12 @@ static int should_balance_chunk(struct btrfs_root *root,
	else if (chunk_type & BTRFS_BLOCK_GROUP_METADATA)
		bargs = &bctl->meta;

	/* profiles filter */
	if ((bargs->flags & BTRFS_BALANCE_ARGS_PROFILES) &&
	    chunk_profiles_filter(chunk_type, bargs)) {
		return 0;
	}

	return 1;
}

+4 −0
Original line number Diff line number Diff line
@@ -196,6 +196,10 @@ struct map_lookup {
#define BTRFS_BALANCE_TYPE_MASK		(BTRFS_BALANCE_DATA |	    \
					 BTRFS_BALANCE_SYSTEM |	    \
					 BTRFS_BALANCE_METADATA)
/*
 * Balance filters
 */
#define BTRFS_BALANCE_ARGS_PROFILES	(1ULL << 0)

struct btrfs_balance_args;
struct btrfs_balance_control {