@@ -91,12 +91,12 @@ static struct Command commands[] = {
"filesystem df", "<path>\n"
"Show space usage information for a mount point\n."
},
- { do_balance, 1,
- "filesystem balance", "<path>\n"
+ { do_balance, -1,
+ "filesystem balance", "[-w|--wait] <path>\n"
"Balance the chunks across the device."
},
- { do_balance, 1,
- "balance start", "<path>\n"
+ { do_balance, -1,
+ "balance start", "[-w|--wait] <path>\n"
"Synonym for \"btrfs filesystem balance\"."
},
{ do_balance_progress, -1,
@@ -754,12 +754,41 @@ int do_add_volume(int nargs, char **args)
}
+const struct option balance_options[] = {
+ { "wait", 0, NULL, 'w' },
+ { NULL, 0, NULL, 0 }
+};
+
int do_balance(int argc, char **argv)
{
-
int fdmnt, ret=0;
+ int background = 1;
struct btrfs_ioctl_vol_args args;
- char *path = argv[1];
+ char *path;
+ int ttyfd;
+
+ optind = 1;
+ while(1) {
+ int c = getopt_long(argc, argv, "w", balance_options, NULL);
+ if (c < 0)
+ break;
+ switch(c) {
+ case 'w':
+ background = 0;
+ break;
+ default:
+ fprintf(stderr, "Invalid arguments for balance\n");
+ free(argv);
+ return 1;
+ }
+ }
+
+ if(optind >= argc) {
+ fprintf(stderr, "No filesystem path given for balance\n");
+ return 1;
+ }
+
+ path = argv[optind];
fdmnt = open_file_or_dir(path);
if (fdmnt < 0) {
@@ -767,8 +796,29 @@ int do_balance(int argc, char **argv)
return 12;
}
+ if (background) {
+ int pid = fork();
+ if (pid == 0) {
+ /* We're in the child, and can run in the background */
+ ttyfd = open("/dev/tty", O_RDWR);
+ if (ttyfd > 0)
+ ioctl(ttyfd, TIOCNOTTY, 0);
+ /* Fall through to the BTRFS_IOC_BALANCE ioctl */
+ } else if (pid > 0) {
+ /* We're in the parent, and the fork succeeded */
+ printf("Background balance started\n");
+ return 0;
+ } else {
+ /* We're in the parent, and the fork failed */
+ fprintf(stderr, "ERROR: can't start background process -- %s\n",
+ strerror(errno));
+ }
+ }
+
memset(&args, 0, sizeof(args));
- ret = ioctl(fdmnt, BTRFS_IOC_BALANCE, &args);
+ printf("ioctl\n");
+ sleep(60);
+ /* ret = ioctl(fdmnt, BTRFS_IOC_BALANCE, &args); */
close(fdmnt);
if(ret<0){
fprintf(stderr, "ERROR: balancing '%s'\n", path);
@@ -27,7 +27,7 @@ btrfs \- control a btrfs filesystem
.PP
\fBbtrfs\fP \fBdevice show\fP\fI <dev>|<label> [<dev>|<label>...]\fP
.PP
-\fBbtrfs\fP \fBdevice balance\fP\fI <path> \fP
+\fBbtrfs\fP \fBdevice balance\fP [\fB-w\fP|\fB--wait\fP] \fI<path>\fP
.PP
\fBbtrfs\fP \fBdevice add\fP\fI <dev> [<dev>..] <path> \fP
.PP