[PATCH 2/2] btrfs-progs: add nodiscard option to device add

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Same as for mkfs.

Signed-off-by: David Sterba <dsterba@xxxxxxx>
---
 cmds-device.c  | 34 +++++++++++++++++++++++++++++-----
 man/btrfs.8.in | 11 +++++++++--
 utils.c        |  2 ++
 3 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/cmds-device.c b/cmds-device.c
index 800a050..12c802e 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 61ffe8d..03126b4 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
@@ -386,8 +386,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
diff --git a/utils.c b/utils.c
index bb1bcdb..68aa534 100644
--- a/utils.c
+++ b/utils.c
@@ -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.
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux