summaryrefslogtreecommitdiff
path: root/c_src/cmd_fs.c
diff options
context:
space:
mode:
Diffstat (limited to 'c_src/cmd_fs.c')
-rw-r--r--c_src/cmd_fs.c154
1 files changed, 94 insertions, 60 deletions
diff --git a/c_src/cmd_fs.c b/c_src/cmd_fs.c
index d56f4ac6..40d4b1cb 100644
--- a/c_src/cmd_fs.c
+++ b/c_src/cmd_fs.c
@@ -56,6 +56,7 @@ static void dev_usage_to_text(struct printbuf *out,
if (type != BCH_DATA_unstriped)
used += u->d[type].sectors;
+ /* Include sizes in short summary */
prt_printf(out, "%s (device %u):\t%s\r%s\r %02u%%\n",
d->label ?: "(no label)", d->idx,
d->dev ?: "(device not found)",
@@ -242,16 +243,98 @@ static void accounting_swab_if_old(struct bch_ioctl_query_accounting *in)
bch2_bpos_swab(&a->k.p);
}
+static void replicas_summary_to_text(struct printbuf *out,
+ darray_accounting_p accounting,
+ dev_names dev_names)
+{
+ DARRAY(darray_u64) replicas_x_degraded = {};
+ u64 cached = 0, reserved = 0;
+
+ /* XXX split out metadata, erasure coded */
+
+ /* summarize replicas - 1x replicated, 2x replicated, degraded... */
+ darray_for_each(accounting, i) {
+ struct bkey_i_accounting *a = *i;
+
+ struct disk_accounting_pos acc_k;
+ bpos_to_disk_accounting_pos(&acc_k, a->k.p);
+
+ if (acc_k.type == BCH_DISK_ACCOUNTING_persistent_reserved) {
+ reserved += a->v.d[0];
+ continue;
+ }
+
+ if (acc_k.type != BCH_DISK_ACCOUNTING_replicas)
+ continue;
+
+ if (acc_k.replicas.data_type == BCH_DATA_cached) {
+ cached += a->v.d[0];
+ continue;
+ }
+
+ struct durability_x_degraded d = replicas_durability(&acc_k.replicas, &dev_names);
+ unsigned degraded = d.durability - d.minus_degraded;
+
+ while (replicas_x_degraded.nr <= d.durability)
+ darray_push(&replicas_x_degraded, (darray_u64) {});
+
+ while (replicas_x_degraded.data[d.durability].nr <= degraded)
+ darray_push(&replicas_x_degraded.data[d.durability], 0);
+
+ replicas_x_degraded.data[d.durability].data[degraded] += a->v.d[0];
+ }
+
+ unsigned max_degraded = 0;
+ darray_for_each(replicas_x_degraded, i)
+ max_degraded = max(max_degraded, i->nr);
+
+ printbuf_tabstops_reset(out);
+ printbuf_tabstop_push(out, 8);
+ prt_tab(out);
+ for (unsigned i = 0; i < max_degraded; i++) {
+ printbuf_tabstop_push(out, 12);
+ if (!i)
+ prt_printf(out, "undegraded\r");
+ else
+ prt_printf(out, "-%ux\r", i);
+ }
+ prt_newline(out);
+
+ darray_for_each(replicas_x_degraded, i) {
+ if (!i->nr)
+ continue;
+
+ prt_printf(out, "%zux:\t", i - replicas_x_degraded.data);
+
+ darray_for_each(*i, j) {
+ if (*j)
+ prt_units_u64(out, *j << 9);
+ prt_tab_rjust(out);
+ }
+ prt_newline(out);
+ }
+
+ if (cached) {
+ prt_printf(out, "cached:\t");
+ prt_units_u64(out, cached << 9);
+ prt_printf(out, "\r\n");
+ }
+
+ if (reserved) {
+ prt_printf(out, "reserved:\t");
+ prt_units_u64(out, reserved << 9);
+ prt_printf(out, "\r\n");
+ }
+}
+
static int fs_usage_v1_to_text(struct printbuf *out,
struct bchfs_handle fs,
dev_names dev_names,
enum fs_usage_fields fields)
{
- unsigned accounting_types = BIT(BCH_DISK_ACCOUNTING_replicas);
-
- if (fields & FS_USAGE_replicas)
- accounting_types |=
- BIT(BCH_DISK_ACCOUNTING_persistent_reserved);
+ unsigned accounting_types =
+ BIT(BCH_DISK_ACCOUNTING_replicas)|
+ BIT(BCH_DISK_ACCOUNTING_persistent_reserved);
if (fields & FS_USAGE_compression)
accounting_types |= BIT(BCH_DISK_ACCOUNTING_compression);
@@ -293,57 +376,7 @@ static int fs_usage_v1_to_text(struct printbuf *out,
prt_units_u64(out, a->online_reserved << 9);
prt_printf(out, "\r\n");
- DARRAY(darray_u64) replicas_x_degraded = {};
-
- /* summarize replicas - 1x replicated, 2x replicated, degraded... */
- darray_for_each(a_sorted, i) {
- struct bkey_i_accounting *a = *i;
-
- struct disk_accounting_pos acc_k;
- bpos_to_disk_accounting_pos(&acc_k, a->k.p);
-
- if (acc_k.type == BCH_DISK_ACCOUNTING_replicas) {
- struct durability_x_degraded d = replicas_durability(&acc_k.replicas, &dev_names);
- unsigned degraded = d.durability - d.minus_degraded;
-
- while (replicas_x_degraded.nr <= d.durability)
- darray_push(&replicas_x_degraded, (darray_u64) {});
-
- while (replicas_x_degraded.data[d.durability].nr <= degraded)
- darray_push(&replicas_x_degraded.data[d.durability], 0);
-
- replicas_x_degraded.data[d.durability].data[degraded] += a->v.d[0];
- }
- }
-
- prt_printf(out, "\nData by durability desired and amount degraded:\n");
-
- unsigned max_degraded = 0;
- darray_for_each(replicas_x_degraded, i)
- max_degraded = max(max_degraded, i->nr);
-
- printbuf_tabstops_reset(out);
- printbuf_tabstop_push(out, 8);
- prt_tab(out);
- for (unsigned i = 0; i < max_degraded; i++) {
- printbuf_tabstop_push(out, 12);
- prt_printf(out, "-%ux\r", i);
- }
- prt_newline(out);
-
- darray_for_each(replicas_x_degraded, i) {
- if (!i->nr)
- continue;
-
- prt_printf(out, "%zux:\t", i - replicas_x_degraded.data);
-
- darray_for_each(*i, j) {
- if (*j)
- prt_units_u64(out, *j << 9);
- prt_tab_rjust(out);
- }
- prt_newline(out);
- }
+ replicas_summary_to_text(out, a_sorted, dev_names);
if (fields & FS_USAGE_replicas) {
printbuf_tabstops_reset(out);
@@ -355,7 +388,7 @@ static int fs_usage_v1_to_text(struct printbuf *out,
prt_printf(out, "\nData type\tRequired/total\tDurability\tDevices\n");
}
- unsigned prev_type = 0;
+ unsigned prev_type = -1;
darray_for_each(a_sorted, i) {
struct bkey_i_accounting *a = *i;
@@ -368,9 +401,10 @@ static int fs_usage_v1_to_text(struct printbuf *out,
switch (acc_k.type) {
case BCH_DISK_ACCOUNTING_persistent_reserved:
- persistent_reserved_to_text(out,
- acc_k.persistent_reserved.nr_replicas,
- a->v.d[0]);
+ if (fields & FS_USAGE_replicas)
+ persistent_reserved_to_text(out,
+ acc_k.persistent_reserved.nr_replicas,
+ a->v.d[0]);
break;
case BCH_DISK_ACCOUNTING_replicas:
if (fields & FS_USAGE_replicas)