bcachefs: bch2_open_bucket_to_text()
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 1 Mar 2023 04:08:48 +0000 (23:08 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:55 +0000 (17:09 -0400)
Factor out a common helper

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_foreground.c
fs/bcachefs/alloc_foreground.h
fs/bcachefs/sysfs.c

index 1405d6b8cbc53b3bdbe19a931d9cdc9a752baaa4..161585de70c8c6485d5f747b3cde63af3b394dd8 100644 (file)
@@ -1329,23 +1329,56 @@ void bch2_fs_allocator_foreground_init(struct bch_fs *c)
        }
 }
 
+static void bch2_open_bucket_to_text(struct printbuf *out, struct bch_fs *c, struct open_bucket *ob)
+{
+       struct bch_dev *ca = bch_dev_bkey_exists(c, ob->dev);
+       unsigned data_type = ob->data_type;
+       barrier(); /* READ_ONCE() doesn't work on bitfields */
+
+       prt_printf(out, "%zu ref %u %s %u:%llu gen %u allocated %u/%u",
+                  ob - c->open_buckets,
+                  atomic_read(&ob->pin),
+                  data_type < BCH_DATA_NR ? bch2_data_types[data_type] : "invalid data type",
+                  ob->dev, ob->bucket, ob->gen,
+                  ca->mi.bucket_size - ob->sectors_free, ca->mi.bucket_size);
+       if (ob->ec)
+               prt_printf(out, " ec idx %llu", ob->ec->idx);
+       if (ob->on_partial_list)
+               prt_str(out, " partial");
+       prt_newline(out);
+}
+
 void bch2_open_buckets_to_text(struct printbuf *out, struct bch_fs *c)
 {
        struct open_bucket *ob;
 
+       out->atomic++;
+
        for (ob = c->open_buckets;
             ob < c->open_buckets + ARRAY_SIZE(c->open_buckets);
             ob++) {
                spin_lock(&ob->lock);
-               if (ob->valid && !ob->on_partial_list) {
-                       prt_printf(out, "%zu ref %u type %s %u:%llu:%u\n",
-                              ob - c->open_buckets,
-                              atomic_read(&ob->pin),
-                              bch2_data_types[ob->data_type],
-                              ob->dev, ob->bucket, ob->gen);
-               }
+               if (ob->valid && !ob->on_partial_list)
+                       bch2_open_bucket_to_text(out, c, ob);
                spin_unlock(&ob->lock);
        }
+
+       --out->atomic;
+}
+
+void bch2_open_buckets_partial_to_text(struct printbuf *out, struct bch_fs *c)
+{
+       unsigned i;
+
+       out->atomic++;
+       spin_lock(&c->freelist_lock);
+
+       for (i = 0; i < c->open_buckets_partial_nr; i++)
+               bch2_open_bucket_to_text(out, c,
+                               c->open_buckets + c->open_buckets_partial[i]);
+
+       spin_unlock(&c->freelist_lock);
+       --out->atomic;
 }
 
 static const char * const bch2_write_point_states[] = {
index ba7a87afda0e237b5e59a32c31c49706ae3c8133..4f492e2784931420caa27208ce5f9bfccda13f5b 100644 (file)
@@ -221,6 +221,7 @@ static inline struct write_point_specifier writepoint_ptr(struct write_point *wp
 void bch2_fs_allocator_foreground_init(struct bch_fs *);
 
 void bch2_open_buckets_to_text(struct printbuf *, struct bch_fs *);
+void bch2_open_buckets_partial_to_text(struct printbuf *, struct bch_fs *);
 
 void bch2_write_points_to_text(struct printbuf *, struct bch_fs *);
 
index 6cbdf70f36bdabc53cfc21667088cd4c1496d57c..8108e1d81345115fe47ca25986f4e4d1dcf5f1b2 100644 (file)
@@ -194,6 +194,7 @@ 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);
 
@@ -455,6 +456,9 @@ 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);
 
@@ -663,6 +667,7 @@ 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,