bcachefs: Improve bch2_btree_update_to_text()
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 2 Apr 2024 20:42:27 +0000 (16:42 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Tue, 2 Apr 2024 21:13:46 +0000 (17:13 -0400)
Print out the mode as a string, and also print out the btree and
watermark.

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

index 9fd2dd0f468259b97aa1f41d0174cd6186cd5388..2b46e6ad248ace8c4fb1d6c3755118b280680584 100644 (file)
 
 #include <linux/random.h>
 
+const char * const bch2_btree_update_modes[] = {
+#define x(t) #t,
+       BCH_WATERMARKS()
+#undef x
+       NULL
+};
+
 static int bch2_btree_insert_node(struct btree_update *, struct btree_trans *,
                                  btree_path_idx_t, struct btree *, struct keylist *);
 static void bch2_btree_update_add_new_node(struct btree_update *, struct btree *);
@@ -846,11 +853,11 @@ static void btree_update_updated_node(struct btree_update *as, struct btree *b)
        mutex_lock(&c->btree_interior_update_lock);
        list_add_tail(&as->unwritten_list, &c->btree_interior_updates_unwritten);
 
-       BUG_ON(as->mode != BTREE_INTERIOR_NO_UPDATE);
+       BUG_ON(as->mode != BTREE_UPDATE_none);
        BUG_ON(!btree_node_dirty(b));
        BUG_ON(!b->c.level);
 
-       as->mode        = BTREE_INTERIOR_UPDATING_NODE;
+       as->mode        = BTREE_UPDATE_node;
        as->b           = b;
 
        set_btree_node_write_blocked(b);
@@ -873,7 +880,7 @@ static void btree_update_reparent(struct btree_update *as,
        lockdep_assert_held(&c->btree_interior_update_lock);
 
        child->b = NULL;
-       child->mode = BTREE_INTERIOR_UPDATING_AS;
+       child->mode = BTREE_UPDATE_update;
 
        bch2_journal_pin_copy(&c->journal, &as->journal, &child->journal,
                              bch2_update_reparent_journal_pin_flush);
@@ -884,7 +891,7 @@ static void btree_update_updated_root(struct btree_update *as, struct btree *b)
        struct bkey_i *insert = &b->key;
        struct bch_fs *c = as->c;
 
-       BUG_ON(as->mode != BTREE_INTERIOR_NO_UPDATE);
+       BUG_ON(as->mode != BTREE_UPDATE_none);
 
        BUG_ON(as->journal_u64s + jset_u64s(insert->k.u64s) >
               ARRAY_SIZE(as->journal_entries));
@@ -898,7 +905,7 @@ static void btree_update_updated_root(struct btree_update *as, struct btree *b)
        mutex_lock(&c->btree_interior_update_lock);
        list_add_tail(&as->unwritten_list, &c->btree_interior_updates_unwritten);
 
-       as->mode        = BTREE_INTERIOR_UPDATING_ROOT;
+       as->mode        = BTREE_UPDATE_root;
        mutex_unlock(&c->btree_interior_update_lock);
 }
 
@@ -1076,7 +1083,7 @@ static void bch2_btree_update_done(struct btree_update *as, struct btree_trans *
        struct bch_fs *c = as->c;
        u64 start_time = as->start_time;
 
-       BUG_ON(as->mode == BTREE_INTERIOR_NO_UPDATE);
+       BUG_ON(as->mode == BTREE_UPDATE_none);
 
        if (as->took_gc_lock)
                up_read(&as->c->gc_lock);
@@ -1172,7 +1179,8 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
        as->c           = c;
        as->start_time  = start_time;
        as->ip_started  = _RET_IP_;
-       as->mode        = BTREE_INTERIOR_NO_UPDATE;
+       as->mode        = BTREE_UPDATE_none;
+       as->watermark   = watermark;
        as->took_gc_lock = true;
        as->btree_id    = path->btree_id;
        as->update_level = update_level;
@@ -2509,18 +2517,25 @@ void bch2_btree_root_alloc(struct bch_fs *c, enum btree_id id)
        bch2_trans_run(c, __bch2_btree_root_alloc(trans, id));
 }
 
+static void bch2_btree_update_to_text(struct printbuf *out, struct btree_update *as)
+{
+       prt_printf(out, "%ps: btree=%s watermark=%s mode=%s nodes_written=%u cl.remaining=%u journal_seq=%llu\n",
+                  (void *) as->ip_started,
+                  bch2_btree_id_str(as->btree_id),
+                  bch2_watermarks[as->watermark],
+                  bch2_btree_update_modes[as->mode],
+                  as->nodes_written,
+                  closure_nr_remaining(&as->cl),
+                  as->journal.seq);
+}
+
 void bch2_btree_updates_to_text(struct printbuf *out, struct bch_fs *c)
 {
        struct btree_update *as;
 
        mutex_lock(&c->btree_interior_update_lock);
        list_for_each_entry(as, &c->btree_interior_update_list, list)
-               prt_printf(out, "%ps: mode=%u nodes_written=%u cl.remaining=%u journal_seq=%llu\n",
-                          (void *) as->ip_started,
-                          as->mode,
-                          as->nodes_written,
-                          closure_nr_remaining(&as->cl),
-                          as->journal.seq);
+               bch2_btree_update_to_text(out, as);
        mutex_unlock(&c->btree_interior_update_lock);
 }
 
index 7ac3e17b84fde41108d98673f0fd7c7c564a4bbc..1d41d3f4b107c47cafadda6b236d6f1a003b0598 100644 (file)
 
 int bch2_btree_node_check_topology(struct btree_trans *, struct btree *);
 
+#define BTREE_UPDATE_MODES()   \
+       x(none)                 \
+       x(node)                 \
+       x(root)                 \
+       x(update)
+
+enum btree_update_mode {
+#define x(n)   BTREE_UPDATE_##n,
+       BTREE_UPDATE_MODES()
+#undef x
+};
+
 /*
  * Tracks an in progress split/rewrite of a btree node and the update to the
  * parent node:
@@ -39,14 +51,8 @@ struct btree_update {
        struct list_head                list;
        struct list_head                unwritten_list;
 
-       /* What kind of update are we doing? */
-       enum {
-               BTREE_INTERIOR_NO_UPDATE,
-               BTREE_INTERIOR_UPDATING_NODE,
-               BTREE_INTERIOR_UPDATING_ROOT,
-               BTREE_INTERIOR_UPDATING_AS,
-       } mode;
-
+       enum btree_update_mode          mode;
+       enum bch_watermark              watermark;
        unsigned                        nodes_written:1;
        unsigned                        took_gc_lock:1;
 
@@ -56,7 +62,7 @@ struct btree_update {
        struct disk_reservation         disk_res;
 
        /*
-        * BTREE_INTERIOR_UPDATING_NODE:
+        * BTREE_UPDATE_node:
         * The update that made the new nodes visible was a regular update to an
         * existing interior node - @b. We can't write out the update to @b
         * until the new nodes we created are finished writing, so we block @b