btrfs-progs: balance: add stripes filter

Add new balance filter 'stripes=<range>' to process only chunks that are
spread accross given number of chunks.

The range minimum and maximum are inclusive.

Signed-off-by: Gabríel Arthúr Pétursson <gabriel@system.is>
[ reworked a bit to use the range helpers, dropped the single value
  for stripes ]
Signed-off-by: David Sterba <dsterba@suse.com>
master
Gabríel Arthúr Pétursson 2015-09-28 22:33:04 +00:00 committed by David Sterba
parent 7dff5c9c9b
commit 0826a8ddb9
4 changed files with 26 additions and 1 deletions

View File

@ -137,6 +137,12 @@ only the single value format.
+ +
The range minimum and maximum are inclusive. The range minimum and maximum are inclusive.
*stripes*::
Balances only block groups which have the given number of stripes. The
parameter is a range specified as <start..end>.
+
The range minimum and maximum are inclusive.
*soft*:: *soft*::
Takes no parameters. Only has meaning when converting between profiles. Takes no parameters. Only has meaning when converting between profiles.
When doing convert from one profile to another and soft mode is on, When doing convert from one profile to another and soft mode is on,

View File

@ -319,6 +319,18 @@ static int parse_filters(char *filters, struct btrfs_balance_args *args)
args->flags &= ~BTRFS_BALANCE_ARGS_LIMIT_RANGE; args->flags &= ~BTRFS_BALANCE_ARGS_LIMIT_RANGE;
args->flags |= BTRFS_BALANCE_ARGS_LIMIT; args->flags |= BTRFS_BALANCE_ARGS_LIMIT;
} }
} else if (!strcmp(this_char, "stripes")) {
if (!value || !*value) {
fprintf(stderr,
"the stripes filter requires an argument\n");
return 1;
}
if (parse_range_u32(value, &args->stripes_min,
&args->stripes_max)) {
fprintf(stderr, "Invalid stripes argument\n");
return 1;
}
args->flags |= BTRFS_BALANCE_ARGS_STRIPES_RANGE;
} else { } else {
fprintf(stderr, "Unrecognized balance option '%s'\n", fprintf(stderr, "Unrecognized balance option '%s'\n",
this_char); this_char);
@ -359,6 +371,10 @@ static void dump_balance_args(struct btrfs_balance_args *args)
printf(", limit="); printf(", limit=");
print_range_u32(args->limit_min, args->limit_max); print_range_u32(args->limit_min, args->limit_max);
} }
if (args->flags & BTRFS_BALANCE_ARGS_STRIPES_RANGE) {
printf(", stripes=");
print_range_u32(args->stripes_min, args->stripes_max);
}
printf("\n"); printf("\n");
} }

View File

@ -239,7 +239,9 @@ struct btrfs_balance_args {
__u32 limit_max; __u32 limit_max;
}; };
}; };
__u64 unused[7]; __u32 stripes_min;
__u32 stripes_max;
__u64 unused[6];
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
/* report balance progress to userspace */ /* report balance progress to userspace */

View File

@ -137,6 +137,7 @@ struct map_lookup {
#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) #define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4)
#define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5) #define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5)
#define BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6) #define BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6)
#define BTRFS_BALANCE_ARGS_STRIPES_RANGE (1ULL << 7)
/* /*
* Profile changing flags. When SOFT is set we won't relocate chunk if * Profile changing flags. When SOFT is set we won't relocate chunk if