David Sterba (2): btrfs-progs: use better name for nodiscard variable and flip the logic btrfs-progs: add nodiscard option to device add cmds-device.c | 34 +++++++++++++++++++++++++++++----- man/btrfs.8.in | 11 +++++++++-- mkfs.c | 8 ++++---- utils.c | 6 ++++-- utils.h | 2 +- 5 files changed, 47 insertions(+), 14 deletions(-) -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
David Sterba
2013-Sep-17 14:54 UTC
[PATCH 1/2] btrfs-progs: use better name for nodiscard variable and flip the logic
Signed-off-by: David Sterba <dsterba@suse.cz> --- mkfs.c | 8 ++++---- utils.c | 4 ++-- utils.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mkfs.c b/mkfs.c index 3ac00ba..40da546 100644 --- a/mkfs.c +++ b/mkfs.c @@ -1324,7 +1324,7 @@ int main(int ac, char **av) int mixed = 0; int data_profile_opt = 0; int metadata_profile_opt = 0; - int nodiscard = 0; + int discard = 1; int ssd = 0; int force_overwrite = 0; @@ -1409,7 +1409,7 @@ int main(int ac, char **av) source_dir_set = 1; break; case ''K'': - nodiscard=1; + discard = 0; break; default: print_usage(); @@ -1507,7 +1507,7 @@ int main(int ac, char **av) } first_file = file; ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count, - block_count, &mixed, nodiscard); + block_count, &mixed, discard); if (block_count && block_count > dev_block_count) { fprintf(stderr, "%s is smaller than requested size\n", file); exit(1); @@ -1614,7 +1614,7 @@ int main(int ac, char **av) continue; } ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count, - block_count, &mixed, nodiscard); + block_count, &mixed, discard); mixed = old_mixed; BUG_ON(ret); diff --git a/utils.c b/utils.c index 134bf80..bb1bcdb 100644 --- a/utils.c +++ b/utils.c @@ -569,7 +569,7 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans, } int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret, - u64 max_block_count, int *mixed, int nodiscard) + u64 max_block_count, int *mixed, int discard) { u64 block_count; u64 bytenr; @@ -596,7 +596,7 @@ int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret, *mixed = 1; } - if (!nodiscard) { + if (discard) { /* * We intentionally ignore errors from the discard ioctl. It is * not necessary for the mkfs functionality but just an optimization. diff --git a/utils.h b/utils.h index 6c2553a..6bf7880 100644 --- a/utils.h +++ b/utils.h @@ -34,7 +34,7 @@ int make_btrfs(int fd, const char *device, const char *label, int btrfs_make_root_dir(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 objectid); int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret, - u64 max_block_count, int *mixed, int nodiscard); + u64 max_block_count, int *mixed, int discard); int btrfs_add_to_fsid(struct btrfs_trans_handle *trans, struct btrfs_root *root, int fd, char *path, u64 block_count, u32 io_width, u32 io_align, -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
David Sterba
2013-Sep-17 14:54 UTC
[PATCH 2/2] btrfs-progs: add nodiscard option to device add
Same as for mkfs. Signed-off-by: David Sterba <dsterba@suse.cz> --- 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html