diff options
author | David Sterba <dsterba@suse.com> | 2015-10-12 00:34:58 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2016-01-12 15:01:03 +0100 |
commit | 45e9bf809816e9992c288af68f72f01e2329c18d (patch) | |
tree | a793dc5fd0c1d783bf093e28e3b43bc23879ae24 | |
parent | ebb66f20aeee76a776d0d64502a9f85d6e8fb77b (diff) |
btrfs-progs: extend balance args to take min/max limit filter
Add the overlapping limit and [limit_min, limit_max] members to the
balance args. The min/max values are interpreted iff the corresponding
flag BTRFS_BALANCE_ARGS_LIMIT_RANGE is set.
The minimum and maximum are inclusive.
Note that the values are only 32bit, but this should be enough for the
foreseeable future.
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | Documentation/btrfs-balance.asciidoc | 6 | ||||
-rw-r--r-- | cmds-balance.c | 4 | ||||
-rw-r--r-- | ioctl.h | 13 | ||||
-rw-r--r-- | volumes.h | 1 |
4 files changed, 23 insertions, 1 deletions
diff --git a/Documentation/btrfs-balance.asciidoc b/Documentation/btrfs-balance.asciidoc index d00abdfc..3562a286 100644 --- a/Documentation/btrfs-balance.asciidoc +++ b/Documentation/btrfs-balance.asciidoc @@ -130,6 +130,12 @@ parameters. Process only given number of chunks, after all filters are applied. This can be used to specifically target a chunk in connection with other filters (drange, vrange) or just simply limit the amount of work done by a single balance run. ++ +The argument may be a single value or a range. The single value *N* means *at +most N chunks*, equivalent to *..N* range syntax. Kernels prior to 4.4 accept +only the single value format. ++ +The range minimum and maximum are inclusive. *soft*:: Takes no parameters. Only has meaning when converting between profiles. diff --git a/cmds-balance.c b/cmds-balance.c index c5be6b9c..dd1c8571 100644 --- a/cmds-balance.c +++ b/cmds-balance.c @@ -347,6 +347,10 @@ static void dump_balance_args(struct btrfs_balance_args *args) (unsigned long long)args->vend); if (args->flags & BTRFS_BALANCE_ARGS_LIMIT) printf(", limit=%llu", (unsigned long long)args->limit); + if (args->flags & BTRFS_BALANCE_ARGS_LIMIT_RANGE) { + printf(", limit="); + print_range_u32(args->limit_min, args->limit_max); + } printf("\n"); } @@ -227,7 +227,18 @@ struct btrfs_balance_args { __u64 flags; - __u64 limit; /* limit number of processed chunks */ + /* + * BTRFS_BALANCE_ARGS_LIMIT with value 'limit' + * BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum + * and maximum + */ + union { + __u64 limit; /* limit number of processed chunks */ + struct { + __u32 limit_min; + __u32 limit_max; + }; + }; __u64 unused[7]; } __attribute__ ((__packed__)); @@ -136,6 +136,7 @@ struct map_lookup { #define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) #define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) #define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5) +#define BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6) /* * Profile changing flags. When SOFT is set we won't relocate chunk if |