diff options
-rw-r--r-- | Documentation/btrfs-balance.asciidoc | 6 | ||||
-rw-r--r-- | cmds-balance.c | 16 | ||||
-rw-r--r-- | ioctl.h | 4 | ||||
-rw-r--r-- | volumes.h | 1 |
4 files changed, 26 insertions, 1 deletions
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 <start..end>. ++ +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"); } @@ -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 */ @@ -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 |