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>
master
David Sterba 2015-10-12 00:34:58 +02:00
parent ebb66f20ae
commit 45e9bf8098
4 changed files with 23 additions and 1 deletions

View File

@ -130,6 +130,12 @@ parameters.
Process only given number of chunks, after all filters are applied. This can be 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, 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. 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*:: *soft*::
Takes no parameters. Only has meaning when converting between profiles. Takes no parameters. Only has meaning when converting between profiles.

View File

@ -347,6 +347,10 @@ static void dump_balance_args(struct btrfs_balance_args *args)
(unsigned long long)args->vend); (unsigned long long)args->vend);
if (args->flags & BTRFS_BALANCE_ARGS_LIMIT) if (args->flags & BTRFS_BALANCE_ARGS_LIMIT)
printf(", limit=%llu", (unsigned long long)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"); printf("\n");
} }

13
ioctl.h
View File

@ -227,7 +227,18 @@ struct btrfs_balance_args {
__u64 flags; __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]; __u64 unused[7];
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));

View File

@ -136,6 +136,7 @@ struct map_lookup {
#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) #define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3)
#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)
/* /*
* 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