]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/sysfs.c
rust: Fix ptr casting in Fs::open()
[bcachefs-tools-debian] / libbcachefs / sysfs.c
index 6e49cf98f60d5da80b7626e95079f0121a5d0aca..ed17b27fba4ff593e46f0f277854c7a56a391dc5 100644 (file)
@@ -27,6 +27,7 @@
 #include "journal.h"
 #include "keylist.h"
 #include "move.h"
+#include "movinggc.h"
 #include "nocow_locking.h"
 #include "opts.h"
 #include "rebalance.h"
@@ -35,7 +36,6 @@
 #include "tests.h"
 
 #include <linux/blkdev.h>
-#include <linux/pretty-printers.h>
 #include <linux/sort.h>
 #include <linux/sched/clock.h>
 
@@ -195,8 +195,33 @@ read_attribute(btree_cache);
 read_attribute(btree_key_cache);
 read_attribute(stripes_heap);
 read_attribute(open_buckets);
+read_attribute(open_buckets_partial);
+read_attribute(write_points);
 read_attribute(nocow_lock_table);
 
+#ifdef BCH_WRITE_REF_DEBUG
+read_attribute(write_refs);
+
+const char * const bch2_write_refs[] = {
+#define x(n)   #n,
+       BCH_WRITE_REFS()
+#undef x
+       NULL
+};
+
+static void bch2_write_refs_to_text(struct printbuf *out, struct bch_fs *c)
+{
+       bch2_printbuf_tabstop_push(out, 24);
+
+       for (unsigned i = 0; i < ARRAY_SIZE(c->writes); i++) {
+               prt_str(out, bch2_write_refs[i]);
+               prt_tab(out);
+               prt_printf(out, "%li", atomic_long_read(&c->writes[i]));
+               prt_newline(out);
+       }
+}
+#endif
+
 read_attribute(internal_uuid);
 
 read_attribute(has_data);
@@ -403,9 +428,9 @@ SHOW(bch2_fs)
 
        sysfs_printf(rebalance_enabled,         "%i", c->rebalance.enabled);
        sysfs_pd_controller_show(rebalance,     &c->rebalance.pd); /* XXX */
-       sysfs_hprint(copy_gc_wait,
-                    max(0LL, c->copygc_wait -
-                        atomic64_read(&c->io_clock[WRITE].now)) << 9);
+
+       if (attr == &sysfs_copy_gc_wait)
+               bch2_copygc_wait_to_text(out, c);
 
        if (attr == &sysfs_rebalance_work)
                bch2_rebalance_work_to_text(out, c);
@@ -432,6 +457,12 @@ SHOW(bch2_fs)
        if (attr == &sysfs_open_buckets)
                bch2_open_buckets_to_text(out, c);
 
+       if (attr == &sysfs_open_buckets_partial)
+               bch2_open_buckets_partial_to_text(out, c);
+
+       if (attr == &sysfs_write_points)
+               bch2_write_points_to_text(out, c);
+
        if (attr == &sysfs_compression_stats)
                bch2_compression_stats_to_text(out, c);
 
@@ -447,6 +478,11 @@ SHOW(bch2_fs)
        if (attr == &sysfs_data_jobs)
                data_progress_to_text(out, c);
 
+#ifdef BCH_WRITE_REF_DEBUG
+       if (attr == &sysfs_write_refs)
+               bch2_write_refs_to_text(out, c);
+#endif
+
        if (attr == &sysfs_nocow_lock_table)
                bch2_nocow_locks_to_text(out, &c->nocow_locks);
 
@@ -632,6 +668,11 @@ struct attribute *bch2_fs_internal_files[] = {
        &sysfs_new_stripes,
        &sysfs_stripes_heap,
        &sysfs_open_buckets,
+       &sysfs_open_buckets_partial,
+       &sysfs_write_points,
+#ifdef BCH_WRITE_REF_DEBUG
+       &sysfs_write_refs,
+#endif
        &sysfs_nocow_lock_table,
        &sysfs_io_timers_read,
        &sysfs_io_timers_write,
@@ -684,7 +725,7 @@ STORE(bch2_fs_opts_dir)
         * We don't need to take c->writes for correctness, but it eliminates an
         * unsightly error message in the dmesg log when we're RO:
         */
-       if (unlikely(!percpu_ref_tryget_live(&c->writes)))
+       if (unlikely(!bch2_write_ref_tryget(c, BCH_WRITE_REF_sysfs)))
                return -EROFS;
 
        tmp = kstrdup(buf, GFP_KERNEL);
@@ -714,7 +755,7 @@ STORE(bch2_fs_opts_dir)
 
        ret = size;
 err:
-       percpu_ref_put(&c->writes);
+       bch2_write_ref_put(c, BCH_WRITE_REF_sysfs);
        return ret;
 }
 SYSFS_OPS(bch2_fs_opts_dir);
@@ -780,38 +821,100 @@ static void dev_alloc_debug_to_text(struct printbuf *out, struct bch_dev *ca)
        for (i = 0; i < ARRAY_SIZE(c->open_buckets); i++)
                nr[c->open_buckets[i].data_type]++;
 
-       prt_printf(out,
-              "\t\t\t buckets\t sectors      fragmented\n"
-              "capacity\t%16llu\n",
-              ca->mi.nbuckets - ca->mi.first_bucket);
-
-       for (i = 0; i < BCH_DATA_NR; i++)
-               prt_printf(out, "%-16s%16llu%16llu%16llu\n",
-                      bch2_data_types[i], stats.d[i].buckets,
-                      stats.d[i].sectors, stats.d[i].fragmented);
-
-       prt_printf(out,
-              "ec\t\t%16llu\n"
-              "\n"
-              "freelist_wait\t\t%s\n"
-              "open buckets allocated\t%u\n"
-              "open buckets this dev\t%u\n"
-              "open buckets total\t%u\n"
-              "open_buckets_wait\t%s\n"
-              "open_buckets_btree\t%u\n"
-              "open_buckets_user\t%u\n"
-              "buckets_to_invalidate\t%llu\n"
-              "btree reserve cache\t%u\n",
-              stats.buckets_ec,
-              c->freelist_wait.list.first              ? "waiting" : "empty",
-              OPEN_BUCKETS_COUNT - c->open_buckets_nr_free,
-              ca->nr_open_buckets,
-              OPEN_BUCKETS_COUNT,
-              c->open_buckets_wait.list.first          ? "waiting" : "empty",
-              nr[BCH_DATA_btree],
-              nr[BCH_DATA_user],
-              should_invalidate_buckets(ca, stats),
-              c->btree_reserve_cache_nr);
+       printbuf_tabstop_push(out, 8);
+       printbuf_tabstop_push(out, 16);
+       printbuf_tabstop_push(out, 16);
+       printbuf_tabstop_push(out, 16);
+       printbuf_tabstop_push(out, 16);
+
+       prt_tab(out);
+       prt_str(out, "buckets");
+       prt_tab_rjust(out);
+       prt_str(out, "sectors");
+       prt_tab_rjust(out);
+       prt_str(out, "fragmented");
+       prt_tab_rjust(out);
+       prt_newline(out);
+
+       for (i = 0; i < BCH_DATA_NR; i++) {
+               prt_str(out, bch2_data_types[i]);
+               prt_tab(out);
+               prt_u64(out, stats.d[i].buckets);
+               prt_tab_rjust(out);
+               prt_u64(out, stats.d[i].sectors);
+               prt_tab_rjust(out);
+               prt_u64(out, stats.d[i].fragmented);
+               prt_tab_rjust(out);
+               prt_newline(out);
+       }
+
+       prt_str(out, "ec");
+       prt_tab(out);
+       prt_u64(out, stats.buckets_ec);
+       prt_tab_rjust(out);
+       prt_newline(out);
+
+       prt_newline(out);
+
+       prt_printf(out, "reserves:");
+       prt_newline(out);
+       for (i = 0; i < RESERVE_NR; i++) {
+               prt_str(out, bch2_alloc_reserves[i]);
+               prt_tab(out);
+               prt_u64(out, bch2_dev_buckets_reserved(ca, i));
+               prt_tab_rjust(out);
+               prt_newline(out);
+       }
+
+       prt_newline(out);
+
+       printbuf_tabstops_reset(out);
+       printbuf_tabstop_push(out, 24);
+
+       prt_str(out, "freelist_wait");
+       prt_tab(out);
+       prt_str(out, c->freelist_wait.list.first ? "waiting" : "empty");
+       prt_newline(out);
+
+       prt_str(out, "open buckets allocated");
+       prt_tab(out);
+       prt_u64(out, OPEN_BUCKETS_COUNT - c->open_buckets_nr_free);
+       prt_newline(out);
+
+       prt_str(out, "open buckets this dev");
+       prt_tab(out);
+       prt_u64(out, ca->nr_open_buckets);
+       prt_newline(out);
+
+       prt_str(out, "open buckets total");
+       prt_tab(out);
+       prt_u64(out, OPEN_BUCKETS_COUNT);
+       prt_newline(out);
+
+       prt_str(out, "open_buckets_wait");
+       prt_tab(out);
+       prt_str(out, c->open_buckets_wait.list.first ? "waiting" : "empty");
+       prt_newline(out);
+
+       prt_str(out, "open_buckets_btree");
+       prt_tab(out);
+       prt_u64(out, nr[BCH_DATA_btree]);
+       prt_newline(out);
+
+       prt_str(out, "open_buckets_user");
+       prt_tab(out);
+       prt_u64(out, nr[BCH_DATA_user]);
+       prt_newline(out);
+
+       prt_str(out, "buckets_to_invalidate");
+       prt_tab(out);
+       prt_u64(out, should_invalidate_buckets(ca, stats));
+       prt_newline(out);
+
+       prt_str(out, "btree reserve cache");
+       prt_tab(out);
+       prt_u64(out, c->btree_reserve_cache_nr);
+       prt_newline(out);
 }
 
 static const char * const bch2_rw[] = {