Skip to content

Commit

Permalink
btrfs-progs: add nodiscard option to device add
Browse files Browse the repository at this point in the history
Same as for mkfs.

Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
  • Loading branch information
kdave authored and Chris Mason committed Oct 16, 2013
1 parent 15ac848 commit 992fd23
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 7 deletions.
34 changes: 29 additions & 5 deletions cmds-device.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/stat.h>
#include <getopt.h>

#include "kerncompat.h"
#include "ctree.h"
Expand All @@ -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
};

Expand All @@ -46,19 +48,41 @@ 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) {
fprintf(stderr, "ERROR: can't access to '%s'\n", mntpnt);
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;
Expand Down Expand Up @@ -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);
Expand Down
11 changes: 9 additions & 2 deletions man/btrfs.8.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 992fd23

Please sign in to comment.