7 #include "libbcachefs/bcachefs_ioctl.h"
8 #include "libbcachefs/opts.h"
12 static inline int printf_pad(unsigned pad, const char * fmt, ...)
18 ret = vprintf(fmt, args);
27 static void print_fs_usage(const char *path, enum units units)
29 unsigned i, j, nr_devices = 4;
30 struct bcache_handle fs = bcache_fs_open(path);
31 struct bch_ioctl_usage *u = NULL;
35 u = xrealloc(u, sizeof(*u) + sizeof(u->devs[0]) * nr_devices);
36 u->nr_devices = nr_devices;
38 if (!ioctl(fs.ioctl_fd, BCH_IOCTL_USAGE, u))
41 die("BCH_IOCTL_USAGE error: %m");
45 uuid_unparse(fs.uuid.b, uuid);
46 printf("Filesystem %s:\n", uuid);
48 printf("%-20s%12s\n", "Size:", pr_units(u->fs.capacity, units));
49 printf("%-20s%12s\n", "Used:", pr_units(u->fs.used, units));
51 printf("%-20s%12s%12s%12s%12s\n",
52 "By replicas:", "1x", "2x", "3x", "4x");
54 for (j = BCH_DATA_BTREE; j < BCH_DATA_NR; j++) {
55 printf_pad(20, " %s:", bch2_data_types[j]);
57 for (i = 0; i < BCH_REPLICAS_MAX; i++)
58 printf("%12s", pr_units(u->fs.sectors[j][i], units));
62 printf_pad(20, " %s:", "reserved");
63 for (i = 0; i < BCH_REPLICAS_MAX; i++)
64 printf("%12s", pr_units(u->fs.persistent_reserved[i], units));
67 printf("%-20s%12s\n", " online reserved:", pr_units(u->fs.online_reserved, units));
69 for (i = 0; i < u->nr_devices; i++) {
70 struct bch_ioctl_dev_usage *d = u->devs + i;
77 printf_pad(20, "Device %u usage:", i);
78 name = !d->dev ? strdup("(offline)")
80 ?: strdup("(device not found)");
82 printf("%24s%12s\n", name, bch2_dev_state[d->state]);
85 printf("%-20s%12s%12s%12s\n",
86 "", "data", "buckets", "fragmented");
88 for (j = BCH_DATA_SB; j < BCH_DATA_NR; j++) {
89 u64 frag = max((s64) d->buckets[j] * d->bucket_size -
90 (s64) d->sectors[j], 0LL);
92 printf_pad(20, " %s:", bch2_data_types[j]);
93 printf("%12s%12llu%12s\n",
94 pr_units(d->sectors[j], units),
96 pr_units(frag, units));
104 int cmd_fs_usage(int argc, char *argv[])
106 enum units units = BYTES;
110 while ((opt = getopt(argc, argv, "h")) != -1)
113 units = HUMAN_READABLE;
117 if (argc - optind < 1) {
118 print_fs_usage(".", units);
120 for (i = optind; i < argc; i++)
121 print_fs_usage(argv[i], units);