]> git.sesse.net Git - bcachefs-tools-debian/blob - cmd_fs.c
initialize op->pos for write
[bcachefs-tools-debian] / cmd_fs.c
1
2 #include <stdio.h>
3 #include <sys/ioctl.h>
4
5 #include <uuid/uuid.h>
6
7 #include "ccan/darray/darray.h"
8
9 #include "linux/sort.h"
10
11 #include "libbcachefs/bcachefs_ioctl.h"
12 #include "libbcachefs/opts.h"
13
14 #include "cmds.h"
15 #include "libbcachefs.h"
16
17 static void print_dev_usage(struct bch_ioctl_dev_usage *d, unsigned idx,
18                             const char *label, enum units units)
19 {
20         char *name = NULL;
21         u64 available = d->nr_buckets;
22         unsigned i;
23
24         printf("\n");
25         printf_pad(20, "%s (device %u):", label, idx);
26
27         name = !d->dev ? strdup("(offline)")
28                 : dev_to_path(d->dev)
29                 ?: strdup("(device not found)");
30         printf("%24s%12s\n", name, bch2_dev_state[d->state]);
31         free(name);
32
33         printf("%-20s%12s%12s%12s\n",
34                "", "data", "buckets", "fragmented");
35
36         for (i = BCH_DATA_SB; i < BCH_DATA_NR; i++) {
37                 u64 frag = max((s64) d->buckets[i] * d->bucket_size -
38                                (s64) d->sectors[i], 0LL);
39
40                 printf_pad(20, "  %s:", bch2_data_types[i]);
41                 printf("%12s%12llu%12s\n",
42                        pr_units(d->sectors[i], units),
43                        d->buckets[i],
44                        pr_units(frag, units));
45
46                 if (i != BCH_DATA_CACHED)
47                         available -= d->buckets[i];
48         }
49
50         printf_pad(20, "  available:");
51         printf("%12s%12llu\n",
52                pr_units(available * d->bucket_size, units),
53                available);
54
55         printf_pad(20, "  capacity:");
56         printf("%12s%12llu\n",
57                pr_units(d->nr_buckets * d->bucket_size, units),
58                d->nr_buckets);
59 }
60
61 struct dev_by_label {
62         unsigned        idx;
63         char            *label;
64 };
65
66 static int dev_by_label_cmp(const void *_l, const void *_r)
67 {
68         const struct dev_by_label *l = _l, *r = _r;
69
70         return strcmp(l->label, r->label);
71 }
72
73 static void print_fs_usage(const char *path, enum units units)
74 {
75         unsigned i, j;
76         char uuid[40];
77
78         struct bchfs_handle fs = bcache_fs_open(path);
79         struct bch_ioctl_usage *u = bchu_usage(fs);
80
81         uuid_unparse(fs.uuid.b, uuid);
82         printf("Filesystem %s:\n", uuid);
83
84         printf("%-20s%12s\n", "Size:", pr_units(u->fs.capacity, units));
85         printf("%-20s%12s\n", "Used:", pr_units(u->fs.used, units));
86
87         printf("%-20s%12s%12s%12s%12s\n",
88                "By replicas:", "1x", "2x", "3x", "4x");
89
90         for (j = BCH_DATA_SB; j < BCH_DATA_NR; j++) {
91                 printf_pad(20, "  %s:", bch2_data_types[j]);
92
93                 for (i = 0; i < BCH_REPLICAS_MAX; i++)
94                         printf("%12s", pr_units(u->fs.sectors[j][i], units));
95                 printf("\n");
96         }
97
98         printf_pad(20, "  %s:", "reserved");
99         for (i = 0; i < BCH_REPLICAS_MAX; i++)
100                 printf("%12s", pr_units(u->fs.persistent_reserved[i], units));
101         printf("\n");
102
103         printf("%-20s%12s\n", "  online reserved:", pr_units(u->fs.online_reserved, units));
104
105         darray(struct dev_by_label) devs_by_label;
106         darray_init(devs_by_label);
107
108         for (i = 0; i < u->nr_devices; i++) {
109                 struct bch_ioctl_dev_usage *d = u->devs + i;
110
111                 if (!d->alive)
112                         continue;
113
114                 char *label_attr = mprintf("dev-%u/label", i);
115                 char *label = read_file_str(fs.sysfs_fd, label_attr);
116                 free(label_attr);
117
118                 darray_append(devs_by_label,
119                         (struct dev_by_label) { i, label });
120         }
121
122         sort(&darray_item(devs_by_label, 0), darray_size(devs_by_label),
123              sizeof(darray_item(devs_by_label, 0)), dev_by_label_cmp, NULL);
124
125         struct dev_by_label *d;
126         darray_foreach(d, devs_by_label)
127                 print_dev_usage(u->devs + d->idx, d->idx, d->label, units);
128
129         darray_foreach(d, devs_by_label)
130                 free(d->label);
131         darray_free(devs_by_label);
132
133         free(u);
134         bcache_fs_close(fs);
135 }
136
137 int cmd_fs_usage(int argc, char *argv[])
138 {
139         enum units units = BYTES;
140         char *fs;
141         int opt;
142
143         while ((opt = getopt(argc, argv, "h")) != -1)
144                 switch (opt) {
145                 case 'h':
146                         units = HUMAN_READABLE;
147                         break;
148                 }
149         args_shift(optind);
150
151         if (!argc) {
152                 print_fs_usage(".", units);
153         } else {
154                 while ((fs = arg_pop()))
155                         print_fs_usage(fs, units);
156         }
157
158         return 0;
159 }