While playing around with resizing volumes recently, I realised that I didn''t know whether btrfs fi show and btrfs fi df reported sizes in ISO (e.g. powers of 10^3) units, as they appear to from the labels they use, or in binary (powers of 2^10) units. Also, a mere three significant figures is somewhat less than I''m comfortable with if I''m about to resize the containing block device downwards. This patch series adds the ability to pick which scale is used for show and df, and labels the amounts properly (e.g. MB for ISO, MiB for binary units). I''ve incorporated Frank''s suggestion of defaulting to raw, and matching coreutils'' use of -h and -H. I''ve also updated the man pages and command help as requested by Goffredo. Hugo. -- === Hugo Mills: hugo@... carfax.org.uk | darksatanic.net | lug.org.uk == PGP key: 515C238D from wwwkeys.eu.pgp.net or http://www.carfax.org.uk --- Jazz is the sort of music where no-one plays anything the --- same way once. -- 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
Hugo Mills
2010-Oct-26 12:23 UTC
[patch v3 1/4] Update pretty-printer for different systems of counting multiples.
Make the pretty-printer for data sizes capable of printing in ISO (powers of 10^3), binary (powers of 2^10) or raw (a simple byte count). Signed-off-by: Hugo Mills <hugo@carfax.org.uk> --- btrfs-show.c | 7 ++++--- btrfs_cmds.c | 13 ++++++++----- mkfs.c | 3 ++- utils.c | 48 +++++++++++++++++++++++++++++++++--------------- utils.h | 7 ++++++- 5 files changed, 53 insertions(+), 25 deletions(-) Index: btrfs-progs-unstable/btrfs-show.c ==================================================================--- btrfs-progs-unstable.orig/btrfs-show.c 2010-10-09 15:39:09.000000000 +0100 +++ btrfs-progs-unstable/btrfs-show.c 2010-10-20 19:20:02.000000000 +0100 @@ -69,7 +69,8 @@ else printf("Label: none "); - super_bytes_used = pretty_sizes(device->super_bytes_used); + super_bytes_used = pretty_sizes(device->super_bytes_used, + PRETTY_SIZE_RAW); total = device->total_devs; printf(" uuid: %s\n\tTotal devices %llu FS bytes used %s\n", uuidbuf, @@ -81,8 +82,8 @@ char *total_bytes; char *bytes_used; device = list_entry(cur, struct btrfs_device, dev_list); - total_bytes = pretty_sizes(device->total_bytes); - bytes_used = pretty_sizes(device->bytes_used); + total_bytes = pretty_sizes(device->total_bytes, PRETTY_SIZE_RAW); + bytes_used = pretty_sizes(device->bytes_used, PRETTY_SIZE_RAW); printf("\tdevid %4llu size %s used %s path %s\n", (unsigned long long)device->devid, total_bytes, bytes_used, device->name); Index: btrfs-progs-unstable/btrfs_cmds.c ==================================================================--- btrfs-progs-unstable.orig/btrfs_cmds.c 2010-10-09 15:39:09.000000000 +0100 +++ btrfs-progs-unstable/btrfs_cmds.c 2010-10-20 19:19:20.000000000 +0100 @@ -634,7 +634,8 @@ else printf("Label: none "); - super_bytes_used = pretty_sizes(device->super_bytes_used); + super_bytes_used = pretty_sizes(device->super_bytes_used, + PRETTY_SIZE_RAW); total = device->total_devs; printf(" uuid: %s\n\tTotal devices %llu FS bytes used %s\n", uuidbuf, @@ -646,8 +647,8 @@ char *total_bytes; char *bytes_used; device = list_entry(cur, struct btrfs_device, dev_list); - total_bytes = pretty_sizes(device->total_bytes); - bytes_used = pretty_sizes(device->bytes_used); + total_bytes = pretty_sizes(device->total_bytes, PRETTY_SIZE_RAW); + bytes_used = pretty_sizes(device->bytes_used, PRETTY_SIZE_RAW); printf("\tdevid %4llu size %s used %s path %s\n", (unsigned long long)device->devid, total_bytes, bytes_used, device->name); @@ -913,8 +914,10 @@ written += 8; } - total_bytes = pretty_sizes(sargs->spaces[i].total_bytes); - used_bytes = pretty_sizes(sargs->spaces[i].used_bytes); + total_bytes = pretty_sizes(sargs->spaces[i].total_bytes, + PRETTY_SIZE_RAW); + used_bytes = pretty_sizes(sargs->spaces[i].used_bytes, + PRETTY_SIZE_RAW); printf("%s: total=%s, used=%s\n", description, total_bytes, used_bytes); } Index: btrfs-progs-unstable/mkfs.c ==================================================================--- btrfs-progs-unstable.orig/mkfs.c 2010-10-09 15:39:09.000000000 +0100 +++ btrfs-progs-unstable/mkfs.c 2010-10-17 19:35:08.000000000 +0100 @@ -524,7 +524,8 @@ printf("fs created label %s on %s\n\tnodesize %u leafsize %u " "sectorsize %u size %s\n", label, first_file, nodesize, leafsize, sectorsize, - pretty_sizes(btrfs_super_total_bytes(&root->fs_info->super_copy))); + pretty_sizes(btrfs_super_total_bytes(&root->fs_info->super_copy), + PRETTY_SIZE_BINARY)); printf("%s\n", BTRFS_BUILD_VERSION); btrfs_commit_transaction(trans, root); Index: btrfs-progs-unstable/utils.c ==================================================================--- btrfs-progs-unstable.orig/utils.c 2010-10-09 15:39:09.000000000 +0100 +++ btrfs-progs-unstable/utils.c 2010-10-17 19:35:08.000000000 +0100 @@ -966,30 +966,48 @@ return ret; } -static char *size_strs[] = { "", "KB", "MB", "GB", "TB", +static char *bin_size_strs[] = { "", "KiB", "MiB", "GiB", "TiB", + "PiB", "EiB", "ZiB", "YiB"}; +static char *iso_size_strs[] = { "", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; -char *pretty_sizes(u64 size) +char *pretty_sizes(u64 size, int format) { int num_divs = 0; u64 last_size = size; u64 fract_size = size; float fraction; char *pretty; + int divisor = 1024; + char** size_strs = bin_size_strs; - while(size > 0) { - fract_size = last_size; - last_size = size; - size /= 1024; - num_divs++; + if(format == PRETTY_SIZE_RAW) { + pretty = malloc(21); + sprintf(pretty, "%llu", size); + } else { + if(format == PRETTY_SIZE_ISO) { + divisor = 1000; + size_strs = iso_size_strs; + } else if(format == PRETTY_SIZE_BINARY) { + divisor = 1024; + size_strs = bin_size_strs; + } + + while(size > 0) { + fract_size = last_size; + last_size = size; + size /= divisor; + num_divs++; + } + if (num_divs == 0) + num_divs = 1; + if (num_divs > ARRAY_SIZE(bin_size_strs)) + return NULL; + + fraction = (float)fract_size / divisor; + pretty = malloc(16); + sprintf(pretty, "%.2f%s", fraction, size_strs[num_divs-1]); } - if (num_divs == 0) - num_divs = 1; - if (num_divs > ARRAY_SIZE(size_strs)) - return NULL; - - fraction = (float)fract_size / 1024; - pretty = malloc(16); - sprintf(pretty, "%.2f%s", fraction, size_strs[num_divs-1]); + return pretty; } Index: btrfs-progs-unstable/utils.h ==================================================================--- btrfs-progs-unstable.orig/utils.h 2010-10-09 15:39:09.000000000 +0100 +++ btrfs-progs-unstable/utils.h 2010-10-17 19:35:08.000000000 +0100 @@ -21,6 +21,11 @@ #define BTRFS_MKFS_SYSTEM_GROUP_SIZE (4 * 1024 * 1024) +/* Constants for pretty_size() format parameter */ +#define PRETTY_SIZE_RAW 0 +#define PRETTY_SIZE_ISO 1 +#define PRETTY_SIZE_BINARY 2 + int make_btrfs(int fd, const char *device, const char *label, u64 blocks[6], u64 num_bytes, u32 nodesize, u32 leafsize, u32 sectorsize, u32 stripesize); @@ -39,5 +44,5 @@ int check_mounted(const char *devicename); int btrfs_device_already_in_root(struct btrfs_root *root, int fd, int super_offset); -char *pretty_sizes(u64 size); +char *pretty_sizes(u64 size, int format); #endif -- 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
Hugo Mills
2010-Oct-26 12:23 UTC
[patch v3 2/4] Add an option to show ISO, binary or raw bytes counts using df.
Change btrfs filesystem df to allow the user to control the scales used for sizes in the output. Signed-off-by: Hugo Mills <hugo@carfax.org.uk> --- btrfs.c | 6 +++--- btrfs_cmds.c | 42 ++++++++++++++++++++++++++++++++++++------ man/btrfs.8.in | 8 ++++++++ 3 files changed, 47 insertions(+), 9 deletions(-) Index: btrfs-progs-unstable/btrfs.c ==================================================================--- btrfs-progs-unstable.orig/btrfs.c 2010-10-20 20:20:49.000000000 +0100 +++ btrfs-progs-unstable/btrfs.c 2010-10-26 13:01:43.000000000 +0100 @@ -87,9 +87,9 @@ "Show the info of a btrfs filesystem. If no <uuid> or <label>\n" "is passed, info of all the btrfs filesystem are shown." }, - { do_df_filesystem, 1, - "filesystem df", "<path>\n" - "Show space usage information for a mount point\n." + { do_df_filesystem, -1, + "filesystem df", "[-h|-H|--human-readable|--si] <path>\n" + "Show space usage information for a mount point." }, { do_balance, 1, "filesystem balance", "<path>\n" Index: btrfs-progs-unstable/btrfs_cmds.c ==================================================================--- btrfs-progs-unstable.orig/btrfs_cmds.c 2010-10-21 20:01:03.000000000 +0100 +++ btrfs-progs-unstable/btrfs_cmds.c 2010-10-26 13:00:39.000000000 +0100 @@ -14,7 +14,6 @@ * Boston, MA 021110-1307, USA. */ - #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -28,6 +27,7 @@ #include <limits.h> #include <uuid/uuid.h> #include <ctype.h> +#include <getopt.h> #undef ULONG_MAX @@ -835,13 +835,45 @@ return 0; } +const struct option df_options[] = { + { "human-readable", 0, NULL, ''h'' }, + { "si", 0, NULL, ''H'' }, + { NULL, 0, NULL, 0 } +}; + int do_df_filesystem(int nargs, char **argv) { struct btrfs_ioctl_space_args *sargs; u64 count = 0, i; int ret; int fd; - char *path = argv[1]; + char *path; + int format = PRETTY_SIZE_RAW; + + optind = 1; + while(1) { + int c = getopt_long(nargs, argv, "hH", df_options, NULL); + if (c < 0) + break; + switch(c) { + case ''h'': + format = PRETTY_SIZE_BINARY; + break; + case ''H'': + format = PRETTY_SIZE_ISO; + break; + default: + fprintf(stderr, "Invalid arguments for df\n"); + free(argv); + return 1; + } + } + if (nargs - optind != 1) { + fprintf(stderr, "No path given for df\n"); + free(argv); + return 1; + } + path = argv[optind]; fd = open_file_or_dir(path); if (fd < 0) { @@ -914,10 +946,8 @@ written += 8; } - total_bytes = pretty_sizes(sargs->spaces[i].total_bytes, - PRETTY_SIZE_RAW); - used_bytes = pretty_sizes(sargs->spaces[i].used_bytes, - PRETTY_SIZE_RAW); + total_bytes = pretty_sizes(sargs->spaces[i].total_bytes, format); + used_bytes = pretty_sizes(sargs->spaces[i].used_bytes, format); printf("%s: total=%s, used=%s\n", description, total_bytes, used_bytes); } Index: btrfs-progs-unstable/man/btrfs.8.in ==================================================================--- btrfs-progs-unstable.orig/man/btrfs.8.in 2010-10-20 20:20:49.000000000 +0100 +++ btrfs-progs-unstable/man/btrfs.8.in 2010-10-26 13:01:27.000000000 +0100 @@ -21,6 +21,8 @@ .PP \fBbtrfs\fP \fBfilesystem resize\fP\fI [+/\-]<size>[gkm]|max <filesystem>\fP .PP +\fBbtrfs\fP \fBfilesystem df\fP\fI [-h|-H|--human-readable|--si] <path>\fP +.PP \fBbtrfs\fP \fBdevice scan\fP\fI [<device> [<device>..]]\fP .PP \fBbtrfs\fP \fBdevice show\fP\fI <dev>|<label> [<dev>|<label>...]\fP @@ -143,6 +145,12 @@ passed, \fBbtrfs\fR show info of all the btrfs filesystem. .TP +\fBfilesystem df\fR [-h|-H|--human-readable|--si] <path>\fR +Show the amount of space used on this filesystem, in bytes. Options: +-h, --human-readable Use powers of 2^10 (1024) to report sizes. +-H, --si Use powers of 10^3 (1000) to report sizes, in SI multiples. +.TP + \fBdevice balance\fR \fI<path>\fR Balance the chunks of the filesystem identified by \fI<path>\fR across the devices. -- 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
Hugo Mills
2010-Oct-26 12:23 UTC
[patch v3 3/4] Add an option to show ISO, binary or raw bytes counts using show.
Change btrfs filesystem show to allow the user to control the scales used for sizes in the output. Signed-off-by: Hugo Mills <hugo@carfax.org.uk> --- btrfs.c | 2 +- btrfs_cmds.c | 45 ++++++++++++++++++++++++++++++++++++++------- man/btrfs.8.in | 15 ++++++++++----- 3 files changed, 49 insertions(+), 13 deletions(-) Index: btrfs-progs-unstable/btrfs.c ==================================================================--- btrfs-progs-unstable.orig/btrfs.c 2010-10-26 13:01:43.000000000 +0100 +++ btrfs-progs-unstable/btrfs.c 2010-10-26 13:02:40.814489740 +0100 @@ -83,7 +83,7 @@ "will occupe all available space on the device." }, { do_show_filesystem, 999, - "filesystem show", "[<uuid>|<label>]\n" + "filesystem show", "[-h|--human-readable|-H|--si] [<uuid>|<label>]\n" "Show the info of a btrfs filesystem. If no <uuid> or <label>\n" "is passed, info of all the btrfs filesystem are shown." }, Index: btrfs-progs-unstable/btrfs_cmds.c ==================================================================--- btrfs-progs-unstable.orig/btrfs_cmds.c 2010-10-26 13:00:39.000000000 +0100 +++ btrfs-progs-unstable/btrfs_cmds.c 2010-10-26 13:02:40.834488902 +0100 @@ -617,7 +617,7 @@ return 0; } -static void print_one_uuid(struct btrfs_fs_devices *fs_devices) +static void print_one_uuid(struct btrfs_fs_devices *fs_devices, int format) { char uuidbuf[37]; struct list_head *cur; @@ -634,8 +634,7 @@ else printf("Label: none "); - super_bytes_used = pretty_sizes(device->super_bytes_used, - PRETTY_SIZE_RAW); + super_bytes_used = pretty_sizes(device->super_bytes_used, format); total = device->total_devs; printf(" uuid: %s\n\tTotal devices %llu FS bytes used %s\n", uuidbuf, @@ -647,8 +646,8 @@ char *total_bytes; char *bytes_used; device = list_entry(cur, struct btrfs_device, dev_list); - total_bytes = pretty_sizes(device->total_bytes, PRETTY_SIZE_RAW); - bytes_used = pretty_sizes(device->bytes_used, PRETTY_SIZE_RAW); + total_bytes = pretty_sizes(device->total_bytes, format); + bytes_used = pretty_sizes(device->bytes_used, format); printf("\tdevid %4llu size %s used %s path %s\n", (unsigned long long)device->devid, total_bytes, bytes_used, device->name); @@ -662,13 +661,45 @@ printf("\n"); } +const struct option show_options[] = { + { "human-readable", 0, NULL, ''h'' }, + { "si", 0, NULL, ''H'' }, + { NULL, 0, NULL, 0 } +}; + int do_show_filesystem(int argc, char **argv) { struct list_head *all_uuids; struct btrfs_fs_devices *fs_devices; struct list_head *cur_uuid; - char *search = argv[1]; + char *search; int ret; + int format = PRETTY_SIZE_RAW; + + optind = 1; + while(1) { + int c = getopt_long(argc, argv, "hH", show_options, NULL); + if (c < 0) + break; + switch(c) { + case ''h'': + format = PRETTY_SIZE_BINARY; + break; + case ''H'': + format = PRETTY_SIZE_ISO; + break; + default: + fprintf(stderr, "Invalid arguments for show\n"); + free(argv); + return 1; + } + } + if (argc - optind > 1) { + fprintf(stderr, "Too many arguments for show\n"); + free(argv); + return 1; + } + search = argv[optind]; ret = btrfs_scan_one_dir("/dev", 0); if (ret){ @@ -682,7 +713,7 @@ list); if (search && uuid_search(fs_devices, search) == 0) continue; - print_one_uuid(fs_devices); + print_one_uuid(fs_devices, format); } printf("%s\n", BTRFS_BUILD_VERSION); return 0; Index: btrfs-progs-unstable/man/btrfs.8.in ==================================================================--- btrfs-progs-unstable.orig/man/btrfs.8.in 2010-10-26 13:01:27.000000000 +0100 +++ btrfs-progs-unstable/man/btrfs.8.in 2010-10-26 13:03:43.941854637 +0100 @@ -23,6 +23,8 @@ .PP \fBbtrfs\fP \fBfilesystem df\fP\fI [-h|-H|--human-readable|--si] <path>\fP .PP +\fBbtrfs\fP \fBfilesystem show\fP\fI [-h|--human-readable|-H|--si] [<uuid>|<label>]\fP +.PP \fBbtrfs\fP \fBdevice scan\fP\fI [<device> [<device>..]]\fP .PP \fBbtrfs\fP \fBdevice show\fP\fI <dev>|<label> [<dev>|<label>...]\fP @@ -140,16 +142,19 @@ partition after reducing the size of the filesystem. .TP -\fBfilesystem show\fR [<uuid>|<label>]\fR -Show the btrfs filesystem with some additional info. If no UUID or label is -passed, \fBbtrfs\fR show info of all the btrfs filesystem. -.TP - \fBfilesystem df\fR [-h|-H|--human-readable|--si] <path>\fR Show the amount of space used on this filesystem, in bytes. Options: -h, --human-readable Use powers of 2^10 (1024) to report sizes. -H, --si Use powers of 10^3 (1000) to report sizes, in SI multiples. .TP + +\fBfilesystem show\fR [-h|-H|--human-readable|--si] [<uuid>|<label>]\fR +Show the usage of each device in the btrfs filesystem with the given +uuid or label, or all filesystems if no uuid or label is provided. +Options: +-h, --human-readable Use powers of 2^10 (1024) to report sizes. +-H, --si Use powers of 10^3 (1000) to report sizes, in SI multiples. +.TP \fBdevice balance\fR \fI<path>\fR Balance the chunks of the filesystem identified by \fI<path>\fR -- 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
Hugo Mills
2010-Oct-26 12:23 UTC
[patch v3 4/4] Add an option to show ISO, binary or raw bytes counts using btrfs-show.
Change btrfs-show to allow the user to control the scales used for sizes in the output. Signed-off-by: Hugo Mills <hugo@carfax.org.uk> --- btrfs-show.c | 27 +++++++++++++++++++-------- man/btrfs-show.8.in | 10 ++++++++-- 2 files changed, 27 insertions(+), 10 deletions(-) Index: btrfs-progs-unstable/btrfs-show.c ==================================================================--- btrfs-progs-unstable.orig/btrfs-show.c 2010-10-26 12:56:54.179226836 +0100 +++ btrfs-progs-unstable/btrfs-show.c 2010-10-26 13:05:48.626702902 +0100 @@ -52,7 +52,7 @@ return 0; } -static void print_one_uuid(struct btrfs_fs_devices *fs_devices) +static void print_one_uuid(struct btrfs_fs_devices *fs_devices, int format) { char uuidbuf[37]; struct list_head *cur; @@ -69,8 +69,7 @@ else printf("Label: none "); - super_bytes_used = pretty_sizes(device->super_bytes_used, - PRETTY_SIZE_RAW); + super_bytes_used = pretty_sizes(device->super_bytes_used, format); total = device->total_devs; printf(" uuid: %s\n\tTotal devices %llu FS bytes used %s\n", uuidbuf, @@ -82,8 +81,8 @@ char *total_bytes; char *bytes_used; device = list_entry(cur, struct btrfs_device, dev_list); - total_bytes = pretty_sizes(device->total_bytes, PRETTY_SIZE_RAW); - bytes_used = pretty_sizes(device->bytes_used, PRETTY_SIZE_RAW); + total_bytes = pretty_sizes(device->total_bytes, format); + bytes_used = pretty_sizes(device->bytes_used, format); printf("\tdevid %4llu size %s used %s path %s\n", (unsigned long long)device->devid, total_bytes, bytes_used, device->name); @@ -99,13 +98,18 @@ static void print_usage(void) { - fprintf(stderr, "usage: btrfs-show [search label or device]\n"); + fprintf(stderr, "usage: btrfs-show [options] [search label or device]\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, "\t-h, --human-readable\tShow sizes in powers of 2^10.\n"); + fprintf(stderr, "\t-s, --si\t\tShow sizes in powers of 10^3 (SI multiples).\n"); fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION); exit(1); } static struct option long_options[] = { /* { "byte-count", 1, NULL, ''b'' }, */ + { "human-readable", 0, NULL, ''h'' }, + { "si", 0, NULL, ''H'' }, { 0, 0, 0, 0} }; @@ -117,14 +121,21 @@ char *search = NULL; int ret; int option_index = 0; + int format = PRETTY_SIZE_RAW; while(1) { int c; - c = getopt_long(ac, av, "", long_options, + c = getopt_long(ac, av, "hH", long_options, &option_index); if (c < 0) break; switch(c) { + case ''H'': + format = PRETTY_SIZE_ISO; + break; + case ''h'': + format = PRETTY_SIZE_BINARY; + break; default: print_usage(); } @@ -144,7 +155,7 @@ list); if (search && uuid_search(fs_devices, search) == 0) continue; - print_one_uuid(fs_devices); + print_one_uuid(fs_devices, format); } printf("%s\n", BTRFS_BUILD_VERSION); return 0; Index: btrfs-progs-unstable/man/btrfs-show.8.in ==================================================================--- btrfs-progs-unstable.orig/man/btrfs-show.8.in 2010-10-26 12:56:54.189226427 +0100 +++ btrfs-progs-unstable/man/btrfs-show.8.in 2010-10-26 13:06:51.074147050 +0100 @@ -2,13 +2,19 @@ .SH NAME btrfs-show \- scan the /dev directory for btrfs partitions and print results. .SH SYNOPSIS -.B btrfs-show +.B btrfs-show [-h|-H|--human-readable|--si] .SH DESCRIPTION .B btrfs-show is used to scan the /dev directory for btrfs partitions and display brief information such as lable, uuid, etc of each btrfs partition. .SH OPTIONS -none +.TP +\fB\-h\fR, \fB\-\-human\-readable\fR +Show values in multiples of 2^10. +.TP +\fB\-H\fR, \fB\-\-si\fR +Show values in multiples of 10^3 (SI multiples). + .SH AVAILABILITY .B btrfs-show is part of btrfs-progs. Btrfs is currently under heavy development, -- 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