diff --git a/cmds-balance.c b/cmds-balance.c index 8a743eca..5de51bd4 100644 --- a/cmds-balance.c +++ b/cmds-balance.c @@ -218,6 +218,18 @@ static int parse_filters(char *filters, struct btrfs_balance_args *args) args->flags |= BTRFS_BALANCE_ARGS_CONVERT; } else if (!strcmp(this_char, "soft")) { args->flags |= BTRFS_BALANCE_ARGS_SOFT; + } else if (!strcmp(this_char, "limit")) { + if (!value || !*value) { + fprintf(stderr, + "the limit filter requires an argument\n"); + return 1; + } + if (parse_u64(value, &args->limit)) { + fprintf(stderr, "Invalid limit argument: %s\n", + value); + return 1; + } + args->flags |= BTRFS_BALANCE_ARGS_LIMIT; } else { fprintf(stderr, "Unrecognized balance option '%s'\n", this_char); @@ -252,6 +264,8 @@ static void dump_balance_args(struct btrfs_balance_args *args) printf(", vrange=%llu..%llu", (unsigned long long)args->vstart, (unsigned long long)args->vend); + if (args->flags & BTRFS_BALANCE_ARGS_LIMIT) + printf(", limit=%llu", (unsigned long long)args->limit); printf("\n"); } diff --git a/ioctl.h b/ioctl.h index 9627e8d1..f0fc0608 100644 --- a/ioctl.h +++ b/ioctl.h @@ -194,7 +194,9 @@ struct btrfs_balance_args { __u64 flags; - __u64 unused[8]; + __u64 limit; + + __u64 unused[7]; } __attribute__ ((__packed__)); struct btrfs_balance_progress { diff --git a/volumes.h b/volumes.h index 2e960b50..c7e764bf 100644 --- a/volumes.h +++ b/volumes.h @@ -130,6 +130,7 @@ struct map_lookup { #define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2) #define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) #define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) +#define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5) /* * Profile changing flags. When SOFT is set we won't relocate chunk if