bcachefs: Improved allocator debugging for ec
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 7 Aug 2024 01:02:34 +0000 (21:02 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 7 Aug 2024 12:31:10 +0000 (08:31 -0400)
chasing down a device removal deadlock with erasure coding

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

index 618d2ff0292ec397813c15cd2fa9f5c0fb2ced91..8683fe4fae5b84be5040af332ecbfcd1ad3da971 100644 (file)
@@ -1603,7 +1603,8 @@ void bch2_open_bucket_to_text(struct printbuf *out, struct bch_fs *c, struct ope
        prt_newline(out);
 }
 
-void bch2_open_buckets_to_text(struct printbuf *out, struct bch_fs *c)
+void bch2_open_buckets_to_text(struct printbuf *out, struct bch_fs *c,
+                              struct bch_dev *ca)
 {
        struct open_bucket *ob;
 
@@ -1613,7 +1614,8 @@ void bch2_open_buckets_to_text(struct printbuf *out, struct bch_fs *c)
             ob < c->open_buckets + ARRAY_SIZE(c->open_buckets);
             ob++) {
                spin_lock(&ob->lock);
-               if (ob->valid && !ob->on_partial_list)
+               if (ob->valid && !ob->on_partial_list &&
+                   (!ca || ob->dev == ca->dev_idx))
                        bch2_open_bucket_to_text(out, c, ob);
                spin_unlock(&ob->lock);
        }
index 6da9e7e29026f20a6a43f251dfcc042bb67f3596..c78a64ec05537410a710b1e0fb32eac08a7bc4fb 100644 (file)
@@ -223,7 +223,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_bucket_to_text(struct printbuf *, struct bch_fs *, struct open_bucket *);
-void bch2_open_buckets_to_text(struct printbuf *, struct bch_fs *);
+void bch2_open_buckets_to_text(struct printbuf *, struct bch_fs *, struct bch_dev *);
 void bch2_open_buckets_partial_to_text(struct printbuf *, struct bch_fs *);
 
 void bch2_write_points_to_text(struct printbuf *, struct bch_fs *);
index 9b5b5c9a6c638cd63f84fb25b97c9643f1c9affa..8d0cca2f14ed2e67651a80487e35e2a14c7e6262 100644 (file)
@@ -2235,6 +2235,23 @@ void bch2_stripes_heap_to_text(struct printbuf *out, struct bch_fs *c)
        mutex_unlock(&c->ec_stripes_heap_lock);
 }
 
+static void bch2_new_stripe_to_text(struct printbuf *out, struct bch_fs *c,
+                                   struct ec_stripe_new *s)
+{
+       prt_printf(out, "\tidx %llu blocks %u+%u allocated %u ref %u %u %s obs",
+                  s->idx, s->nr_data, s->nr_parity,
+                  bitmap_weight(s->blocks_allocated, s->nr_data),
+                  atomic_read(&s->ref[STRIPE_REF_io]),
+                  atomic_read(&s->ref[STRIPE_REF_stripe]),
+                  bch2_watermarks[s->h->watermark]);
+
+       struct bch_stripe *v = &bkey_i_to_stripe(&s->new_stripe.key)->v;
+       unsigned i;
+       for_each_set_bit(i, s->blocks_gotten, v->nr_blocks)
+               prt_printf(out, " %u", s->blocks[i]);
+       prt_newline(out);
+}
+
 void bch2_new_stripes_to_text(struct printbuf *out, struct bch_fs *c)
 {
        struct ec_stripe_head *h;
@@ -2247,23 +2264,15 @@ void bch2_new_stripes_to_text(struct printbuf *out, struct bch_fs *c)
                       bch2_watermarks[h->watermark]);
 
                if (h->s)
-                       prt_printf(out, "\tidx %llu blocks %u+%u allocated %u\n",
-                              h->s->idx, h->s->nr_data, h->s->nr_parity,
-                              bitmap_weight(h->s->blocks_allocated,
-                                            h->s->nr_data));
+                       bch2_new_stripe_to_text(out, c, h->s);
        }
        mutex_unlock(&c->ec_stripe_head_lock);
 
        prt_printf(out, "in flight:\n");
 
        mutex_lock(&c->ec_stripe_new_lock);
-       list_for_each_entry(s, &c->ec_stripe_new_list, list) {
-               prt_printf(out, "\tidx %llu blocks %u+%u ref %u %u %s\n",
-                          s->idx, s->nr_data, s->nr_parity,
-                          atomic_read(&s->ref[STRIPE_REF_io]),
-                          atomic_read(&s->ref[STRIPE_REF_stripe]),
-                          bch2_watermarks[s->h->watermark]);
-       }
+       list_for_each_entry(s, &c->ec_stripe_new_list, list)
+               bch2_new_stripe_to_text(out, c, s);
        mutex_unlock(&c->ec_stripe_new_lock);
 }
 
index 1c0d1fb20276aa801fd00fac8d75a991ea94612c..f393023a3ae29acf9f3c3f8309336c5f59ec4ccd 100644 (file)
@@ -367,7 +367,7 @@ SHOW(bch2_fs)
                bch2_stripes_heap_to_text(out, c);
 
        if (attr == &sysfs_open_buckets)
-               bch2_open_buckets_to_text(out, c);
+               bch2_open_buckets_to_text(out, c, NULL);
 
        if (attr == &sysfs_open_buckets_partial)
                bch2_open_buckets_partial_to_text(out, c);
@@ -811,6 +811,9 @@ SHOW(bch2_dev)
        if (attr == &sysfs_alloc_debug)
                bch2_dev_alloc_debug_to_text(out, ca);
 
+       if (attr == &sysfs_open_buckets)
+               bch2_open_buckets_to_text(out, c, ca);
+
        return 0;
 }
 
@@ -892,6 +895,7 @@ struct attribute *bch2_dev_files[] = {
 
        /* debug: */
        &sysfs_alloc_debug,
+       &sysfs_open_buckets,
        NULL
 };