summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-07-13 06:52:49 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:08 +0300
commit2e655e6de202d891f0232cfd3c56b8f8c176cf99 (patch)
treead4cce0fd7bd6c70f006a9e0c5cd7992b6151766 /fs
parent003e738d4f0f61a8711ce41a03d8fb01a1cd7733 (diff)
downloadlinux-2e655e6de202d891f0232cfd3c56b8f8c176cf99.tar.xz
bcachefs: Add open_buckets to sysfs
This is to help debug a rare shutdown deadlock in the allocator code - the btree code is leaking open_buckets. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/alloc_background.c19
-rw-r--r--fs/bcachefs/alloc_background.h2
-rw-r--r--fs/bcachefs/sysfs.c7
3 files changed, 28 insertions, 0 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index 15f9adf0876a..fc20649b19cf 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -1232,3 +1232,22 @@ void bch2_fs_allocator_background_init(struct bch_fs *c)
{
spin_lock_init(&c->freelist_lock);
}
+
+void bch2_open_buckets_to_text(struct printbuf *out, struct bch_fs *c)
+{
+ struct open_bucket *ob;
+
+ 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) {
+ pr_buf(out, "%zu ref %u type %s\n",
+ ob - c->open_buckets,
+ atomic_read(&ob->pin),
+ bch2_data_types[ob->type]);
+ }
+ spin_unlock(&ob->lock);
+ }
+
+}
diff --git a/fs/bcachefs/alloc_background.h b/fs/bcachefs/alloc_background.h
index 9cadfdb5b83d..a4f6bf56b18f 100644
--- a/fs/bcachefs/alloc_background.h
+++ b/fs/bcachefs/alloc_background.h
@@ -132,4 +132,6 @@ int bch2_dev_allocator_start(struct bch_dev *);
int bch2_alloc_write(struct bch_fs *, unsigned);
void bch2_fs_allocator_background_init(struct bch_fs *);
+void bch2_open_buckets_to_text(struct printbuf *, struct bch_fs *);
+
#endif /* _BCACHEFS_ALLOC_BACKGROUND_H */
diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c
index 84a7acb04d01..9b1ffbf96e14 100644
--- a/fs/bcachefs/sysfs.c
+++ b/fs/bcachefs/sysfs.c
@@ -171,6 +171,7 @@ read_attribute(btree_cache);
read_attribute(btree_key_cache);
read_attribute(btree_transactions);
read_attribute(stripes_heap);
+read_attribute(open_buckets);
read_attribute(internal_uuid);
@@ -409,6 +410,11 @@ SHOW(bch2_fs)
return out.pos - buf;
}
+ if (attr == &sysfs_open_buckets) {
+ bch2_open_buckets_to_text(&out, c);
+ return out.pos - buf;
+ }
+
if (attr == &sysfs_compression_stats) {
bch2_compression_stats_to_text(&out, c);
return out.pos - buf;
@@ -567,6 +573,7 @@ struct attribute *bch2_fs_internal_files[] = {
&sysfs_btree_key_cache,
&sysfs_btree_transactions,
&sysfs_stripes_heap,
+ &sysfs_open_buckets,
&sysfs_read_realloc_races,
&sysfs_extent_migrate_done,