#include "utils.h"
static const char * const balance_cmd_group_usage[] = {
- "btrfs [filesystem] balance <command> [options] <path>",
- "btrfs [filesystem] balance <path>",
+ "btrfs balance <command> [options] <path>",
+ "btrfs balance <path>",
NULL
};
-static const char balance_cmd_group_info[] =
- "'btrfs filesystem balance' command is deprecated, please use\n"
- "'btrfs balance start' command instead.";
-
static int parse_one_profile(const char *profile, u64 *flags)
{
if (!strcmp(profile, "raid0")) {
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);
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");
}
fd = open_file_or_dir(path, &dirstream);
if (fd < 0) {
- fprintf(stderr, "ERROR: can't access to '%s'\n", path);
- return 12;
+ fprintf(stderr, "ERROR: can't access '%s'\n", path);
+ return 1;
}
ret = ioctl(fd, BTRFS_IOC_BALANCE_V2, args);
if (e != EINPROGRESS)
fprintf(stderr, "There may be more info in "
"syslog - try dmesg | tail\n");
- ret = 19;
+ ret = 1;
}
} else {
printf("Done, had to relocate %llu out of %llu chunks\n",
}
static const char * const cmd_balance_start_usage[] = {
- "btrfs [filesystem] balance start [options] <path>",
+ "btrfs balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
optind = 1;
while (1) {
- int longindex;
- static struct option longopts[] = {
+ static const struct option longopts[] = {
{ "data", optional_argument, NULL, 'd'},
{ "metadata", optional_argument, NULL, 'm' },
{ "system", optional_argument, NULL, 's' },
{ "force", no_argument, NULL, 'f' },
{ "verbose", no_argument, NULL, 'v' },
- { NULL, no_argument, NULL, 0 },
+ { NULL, 0, NULL, 0 }
};
- int opt = getopt_long(argc, argv, "d::s::m::fv", longopts,
- &longindex);
+ int opt = getopt_long(argc, argv, "d::s::m::fv", longopts, NULL);
if (opt < 0)
break;
}
static const char * const cmd_balance_pause_usage[] = {
- "btrfs [filesystem] balance pause <path>",
+ "btrfs balance pause <path>",
"Pause running balance",
NULL
};
fd = open_file_or_dir(path, &dirstream);
if (fd < 0) {
- fprintf(stderr, "ERROR: can't access to '%s'\n", path);
- return 12;
+ fprintf(stderr, "ERROR: can't access '%s'\n", path);
+ return 1;
}
ret = ioctl(fd, BTRFS_IOC_BALANCE_CTL, BTRFS_BALANCE_CTL_PAUSE);
if (ret < 0) {
fprintf(stderr, "ERROR: balance pause on '%s' failed - %s\n",
path, (e == ENOTCONN) ? "Not running" : strerror(e));
- return 19;
+ if (e == ENOTCONN)
+ return 2;
+ else
+ return 1;
}
return 0;
}
static const char * const cmd_balance_cancel_usage[] = {
- "btrfs [filesystem] balance cancel <path>",
+ "btrfs balance cancel <path>",
"Cancel running or paused balance",
NULL
};
fd = open_file_or_dir(path, &dirstream);
if (fd < 0) {
- fprintf(stderr, "ERROR: can't access to '%s'\n", path);
- return 12;
+ fprintf(stderr, "ERROR: can't access '%s'\n", path);
+ return 1;
}
ret = ioctl(fd, BTRFS_IOC_BALANCE_CTL, BTRFS_BALANCE_CTL_CANCEL);
if (ret < 0) {
fprintf(stderr, "ERROR: balance cancel on '%s' failed - %s\n",
path, (e == ENOTCONN) ? "Not in progress" : strerror(e));
- return 19;
+ if (e == ENOTCONN)
+ return 2;
+ else
+ return 1;
}
return 0;
}
static const char * const cmd_balance_resume_usage[] = {
- "btrfs [filesystem] balance resume <path>",
+ "btrfs balance resume <path>",
"Resume interrupted balance",
NULL
};
fd = open_file_or_dir(path, &dirstream);
if (fd < 0) {
- fprintf(stderr, "ERROR: can't access to '%s'\n", path);
- return 12;
+ fprintf(stderr, "ERROR: can't access '%s'\n", path);
+ return 1;
}
memset(&args, 0, sizeof(args));
"failed - %s\n", path,
(e == ENOTCONN) ? "Not in progress" :
"Already running");
- return 19;
+ if (e == ENOTCONN)
+ return 2;
+ else
+ return 1;
} else {
fprintf(stderr,
"ERROR: error during balancing '%s' - %s\n"
"There may be more info in syslog - try dmesg | tail\n", path, strerror(e));
- return 19;
+ return 1;
}
} else {
printf("Done, had to relocate %llu out of %llu chunks\n",
}
static const char * const cmd_balance_status_usage[] = {
- "btrfs [filesystem] balance status [-v] <path>",
+ "btrfs balance status [-v] <path>",
"Show status of running or paused balance",
"",
"-v be verbose",
optind = 1;
while (1) {
- int longindex;
- static struct option longopts[] = {
+ int opt;
+ static const struct option longopts[] = {
{ "verbose", no_argument, NULL, 'v' },
- { NULL, no_argument, NULL, 0}
+ { NULL, 0, NULL, 0 }
};
- int opt = getopt_long(argc, argv, "v", longopts, &longindex);
+ opt = getopt_long(argc, argv, "v", longopts, NULL);
if (opt < 0)
break;
fd = open_file_or_dir(path, &dirstream);
if (fd < 0) {
- fprintf(stderr, "ERROR: can't access to '%s'\n", path);
+ fprintf(stderr, "ERROR: can't access '%s'\n", path);
return 2;
}
return 1;
}
+static const char balance_cmd_group_info[] =
+"balance data accross devices, or change block groups using filters";
+
const struct cmd_group balance_cmd_group = {
balance_cmd_group_usage, balance_cmd_group_info, {
{ "start", cmd_balance_start, cmd_balance_start_usage, NULL, 0 },