From 0826a8ddb90e577c5c359d8bca2571f167029f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabr=C3=ADel=20Arth=C3=BAr=20P=C3=A9tursson?= Date: Mon, 28 Sep 2015 22:33:04 +0000 Subject: [PATCH] btrfs-progs: balance: add stripes filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add new balance filter 'stripes=' 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 [ reworked a bit to use the range helpers, dropped the single value for stripes ] Signed-off-by: David Sterba --- Documentation/btrfs-balance.asciidoc | 6 ++++++ cmds-balance.c | 16 ++++++++++++++++ ioctl.h | 4 +++- volumes.h | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Documentation/btrfs-balance.asciidoc b/Documentation/btrfs-balance.asciidoc index 3562a286..9adf7784 100644 --- a/Documentation/btrfs-balance.asciidoc +++ b/Documentation/btrfs-balance.asciidoc @@ -137,6 +137,12 @@ only the single value format. + 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 . ++ +The range minimum and maximum are inclusive. + *soft*:: Takes no parameters. Only has meaning when converting between profiles. When doing convert from one profile to another and soft mode is on, diff --git a/cmds-balance.c b/cmds-balance.c index 1715f36e..2453101a 100644 --- a/cmds-balance.c +++ b/cmds-balance.c @@ -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; } + } 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 { fprintf(stderr, "Unrecognized balance option '%s'\n", this_char); @@ -359,6 +371,10 @@ static void dump_balance_args(struct btrfs_balance_args *args) printf(", limit="); 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"); } diff --git a/ioctl.h b/ioctl.h index e5cf3230..0df2444c 100644 --- a/ioctl.h +++ b/ioctl.h @@ -239,7 +239,9 @@ struct btrfs_balance_args { __u32 limit_max; }; }; - __u64 unused[7]; + __u32 stripes_min; + __u32 stripes_max; + __u64 unused[6]; } __attribute__ ((__packed__)); /* report balance progress to userspace */ diff --git a/volumes.h b/volumes.h index b6ea1912..f5064304 100644 --- a/volumes.h +++ b/volumes.h @@ -137,6 +137,7 @@ struct map_lookup { #define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) #define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5) #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