bcachefs: Be more careful in bch2_bkey_to_text()
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 13 Nov 2020 20:03:34 +0000 (15:03 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:47 +0000 (17:08 -0400)
This is used to print keys that failed bch2_bkey_invalid(), so be more
careful with k->type.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bkey_methods.c

index 99b7fce2bfd30716fc53e3a6c678fe1683f93319..f5779795a4b24e32f137c41d024f82d5791a4183 100644 (file)
@@ -181,8 +181,12 @@ void bch2_bpos_to_text(struct printbuf *out, struct bpos pos)
 void bch2_bkey_to_text(struct printbuf *out, const struct bkey *k)
 {
        if (k) {
-               pr_buf(out, "u64s %u type %s ", k->u64s,
-                      bch2_bkey_types[k->type]);
+               pr_buf(out, "u64s %u type ", k->u64s);
+
+               if (k->type < KEY_TYPE_MAX)
+                       pr_buf(out, "%s ", bch2_bkey_types[k->type]);
+               else
+                       pr_buf(out, "%u ", k->type);
 
                bch2_bpos_to_text(out, k->p);
 
@@ -196,10 +200,14 @@ void bch2_bkey_to_text(struct printbuf *out, const struct bkey *k)
 void bch2_val_to_text(struct printbuf *out, struct bch_fs *c,
                      struct bkey_s_c k)
 {
-       const struct bkey_ops *ops = &bch2_bkey_ops[k.k->type];
+       if (k.k->type < KEY_TYPE_MAX) {
+               const struct bkey_ops *ops = &bch2_bkey_ops[k.k->type];
 
-       if (likely(ops->val_to_text))
-               ops->val_to_text(out, c, k);
+               if (likely(ops->val_to_text))
+                       ops->val_to_text(out, c, k);
+       } else {
+               pr_buf(out, "(invalid type %u)", k.k->type);
+       }
 }
 
 void bch2_bkey_val_to_text(struct printbuf *out, struct bch_fs *c,