Преглед изворни кода

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: Ilya Dryomov <idryomov@gmail.com>
Ilya Dryomov пре 13 година
родитељ
комит
899c81eac8
3 измењених фајлова са 30 додато и 30 уклоњено
  1. 15 0
      fs/btrfs/ctree.h
  2. 7 18
      fs/btrfs/extent-tree.c
  3. 8 12
      fs/btrfs/volumes.c

+ 15 - 0
fs/btrfs/ctree.h

@@ -849,6 +849,21 @@ struct btrfs_csum_item {
  */
  */
 #define BTRFS_AVAIL_ALLOC_BIT_SINGLE	(1ULL << 48)
 #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 {
 struct btrfs_block_group_item {
 	__le64 used;
 	__le64 used;
 	__le64 chunk_objectid;
 	__le64 chunk_objectid;

+ 7 - 18
fs/btrfs/extent-tree.c

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

+ 8 - 12
fs/btrfs/volumes.c

@@ -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
  * Balance filters.  Return 1 if chunk should be filtered out
  * (should not be balanced).
  * (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)
 				 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 0;
 
 
 	return 1;
 	return 1;
@@ -2365,18 +2363,16 @@ static int chunk_vrange_filter(struct extent_buffer *leaf,
 	return 1;
 	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)
 				     struct btrfs_balance_args *bargs)
 {
 {
 	if (!(bargs->flags & BTRFS_BALANCE_ARGS_CONVERT))
 	if (!(bargs->flags & BTRFS_BALANCE_ARGS_CONVERT))
 		return 0;
 		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 1;
 
 
 	return 0;
 	return 0;