}
 }
 
+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[] = {
 
 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);
 
        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);
 
        &sysfs_new_stripes,
        &sysfs_stripes_heap,
        &sysfs_open_buckets,
+       &sysfs_open_buckets_partial,
        &sysfs_write_points,
 #ifdef BCH_WRITE_REF_DEBUG
        &sysfs_write_refs,