X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=cmd_fs.c;h=967ac7a7f1c296bd16305ec1b65e082385c0b9d5;hb=6aabc97dc9c895cb1bb2423c84c7131bff7dd6c1;hp=382d31a03047697cc187f686d2e1db8bb7bbc5e9;hpb=5933f9478cc21e8b319309d2794948050d09b031;p=bcachefs-tools-debian diff --git a/cmd_fs.c b/cmd_fs.c index 382d31a..967ac7a 100644 --- a/cmd_fs.c +++ b/cmd_fs.c @@ -1,41 +1,102 @@ -#include "cmds.h" +#include +#include -struct bcache_fs { - /* options... */ +#include - u64 capacity; +#include "libbcachefs/bcachefs_ioctl.h" +#include "libbcachefs/opts.h" - /* XXX: dirty != used, it doesn't count metadata */ - u64 bytes_dirty; -}; +#include "cmds.h" +#include "libbcachefs.h" -#if 0 -static struct bcache_fs fill_fs(struct bcache_handle fs) +static void print_fs_usage(const char *path, enum units units) { - return (struct bcache_fs) { - }; -} -#endif + unsigned i, j; + char uuid[40]; -int cmd_fs_show(int argc, char *argv[]) -{ - if (argc != 2) - die("Please supply a filesystem"); + struct bchfs_handle fs = bcache_fs_open(path); + struct bch_ioctl_usage *u = bchu_usage(fs); - struct bcache_handle fs = bcache_fs_open(argv[1]); + uuid_unparse(fs.uuid.b, uuid); + printf("Filesystem %s:\n", uuid); - fs = fs; - return 0; + printf("%-20s%12s\n", "Size:", pr_units(u->fs.capacity, units)); + printf("%-20s%12s\n", "Used:", pr_units(u->fs.used, units)); + + printf("%-20s%12s%12s%12s%12s\n", + "By replicas:", "1x", "2x", "3x", "4x"); + + for (j = BCH_DATA_BTREE; j < BCH_DATA_NR; j++) { + printf_pad(20, " %s:", bch2_data_types[j]); + + for (i = 0; i < BCH_REPLICAS_MAX; i++) + printf("%12s", pr_units(u->fs.sectors[j][i], units)); + printf("\n"); + } + + printf_pad(20, " %s:", "reserved"); + for (i = 0; i < BCH_REPLICAS_MAX; i++) + printf("%12s", pr_units(u->fs.persistent_reserved[i], units)); + printf("\n"); + + printf("%-20s%12s\n", " online reserved:", pr_units(u->fs.online_reserved, units)); + + for (i = 0; i < u->nr_devices; i++) { + struct bch_ioctl_dev_usage *d = u->devs + i; + char *name = NULL; + + if (!d->alive) + continue; + + printf("\n"); + printf_pad(20, "Device %u usage:", i); + name = !d->dev ? strdup("(offline)") + : dev_to_path(d->dev) + ?: strdup("(device not found)"); + + printf("%24s%12s\n", name, bch2_dev_state[d->state]); + free(name); + + printf("%-20s%12s%12s%12s\n", + "", "data", "buckets", "fragmented"); + + for (j = BCH_DATA_SB; j < BCH_DATA_NR; j++) { + u64 frag = max((s64) d->buckets[j] * d->bucket_size - + (s64) d->sectors[j], 0LL); + + printf_pad(20, " %s:", bch2_data_types[j]); + printf("%12s%12llu%12s\n", + pr_units(d->sectors[j], units), + d->buckets[j], + pr_units(frag, units)); + } + } + + free(u); + bcache_fs_close(fs); } -int cmd_fs_set(int argc, char *argv[]) +int cmd_fs_usage(int argc, char *argv[]) { - if (argc != 2) - die("Please supply a filesystem"); + enum units units = BYTES; + char *fs; + int opt; + + while ((opt = getopt(argc, argv, "h")) != -1) + switch (opt) { + case 'h': + units = HUMAN_READABLE; + break; + } + args_shift(optind); - struct bcache_handle fs = bcache_fs_open(argv[1]); + if (!argc) { + print_fs_usage(".", units); + } else { + while ((fs = arg_pop())) + print_fs_usage(fs, units); + } - fs = fs; return 0; }