diff options
-rw-r--r-- | cmds-device.c | 34 | ||||
-rw-r--r-- | man/btrfs.8.in | 11 | ||||
-rw-r--r-- | utils.c | 2 |
3 files changed, 40 insertions, 7 deletions
diff --git a/cmds-device.c b/cmds-device.c index 800a0505..12c802e1 100644 --- a/cmds-device.c +++ b/cmds-device.c @@ -22,6 +22,7 @@ #include <sys/ioctl.h> #include <errno.h> #include <sys/stat.h> +#include <getopt.h> #include "kerncompat.h" #include "ctree.h" @@ -36,8 +37,9 @@ static const char * const device_cmd_group_usage[] = { }; static const char * const cmd_add_dev_usage[] = { - "btrfs device add <device> [<device>...] <path>", + "btrfs device add [options] <device> [<device>...] <path>", "Add a device to a filesystem", + "-K|--nodiscard do not perform whole device TRIM", NULL }; @@ -46,11 +48,33 @@ static int cmd_add_dev(int argc, char **argv) char *mntpnt; int i, fdmnt, ret=0, e; DIR *dirstream = NULL; + int discard = 1; + + while (1) { + int long_index; + static struct option long_options[] = { + { "nodiscard", optional_argument, NULL, 'K'}, + { 0, 0, 0, 0 } + }; + int c = getopt_long(argc, argv, "K", long_options, + &long_index); + if (c < 0) + break; + switch (c) { + case 'K': + discard = 0; + break; + default: + usage(cmd_add_dev_usage); + } + } - if (check_argc_min(argc, 3)) + argc = argc - optind; + + if (check_argc_min(argc, 2)) usage(cmd_add_dev_usage); - mntpnt = argv[argc - 1]; + mntpnt = argv[optind + argc - 1]; fdmnt = open_file_or_dir(mntpnt, &dirstream); if (fdmnt < 0) { @@ -58,7 +82,7 @@ static int cmd_add_dev(int argc, char **argv) return 1; } - for (i = 1; i < argc - 1; i++ ){ + for (i = optind; i < optind + argc - 1; i++){ struct btrfs_ioctl_vol_args ioctl_args; int devfd, res; u64 dev_block_count = 0; @@ -99,7 +123,7 @@ static int cmd_add_dev(int argc, char **argv) } res = btrfs_prepare_device(devfd, argv[i], 1, &dev_block_count, - 0, &mixed, 0); + 0, &mixed, discard); if (res) { fprintf(stderr, "ERROR: Unable to init '%s'\n", argv[i]); close(devfd); diff --git a/man/btrfs.8.in b/man/btrfs.8.in index 6c49310d..e621bc96 100644 --- a/man/btrfs.8.in +++ b/man/btrfs.8.in @@ -47,7 +47,7 @@ btrfs \- control a btrfs filesystem \fBbtrfs\fP \fB[filesystem] balance status\fP [-v] \fI<path>\fP .PP .PP -\fBbtrfs\fP \fBdevice add\fP \fI<device>\fP [\fI<device>...\fP] \fI<path>\fP +\fBbtrfs\fP \fBdevice add\fP [-K] \fI<device>\fP [\fI<device>...\fP] \fI<path>\fP .PP \fBbtrfs\fP \fBdevice delete\fP \fI<device>\fP [\fI<device>...\fP] \fI<path>\fP .PP @@ -381,8 +381,15 @@ be verbose .RE .TP -\fBdevice add\fR\fI <dev> \fP[\fI<dev>...\fP] \fI<path>\fR +\fBdevice add\fR\fI [-K] <dev> \fP[\fI<dev>...\fP] \fI<path>\fR Add device(s) to the filesystem identified by \fI<path>\fR. +If applicable, a whole device discard (TRIM) operation is performed. +.RS + +\fIOptions\fR +.IP "\fB-K|--nodiscard\fP" 5 +do not perform discard by default +.RE .TP \fBdevice delete\fR\fI <dev> \fP[\fI<dev>...\fP] \fI<path>\fR @@ -597,6 +597,8 @@ int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret, } if (discard) { + fprintf(stderr, "Performing full device TRIM (%s) ...\n", + pretty_size(block_count)); /* * We intentionally ignore errors from the discard ioctl. It is * not necessary for the mkfs functionality but just an optimization. |