diff options
| author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-04-03 19:15:53 -0400 | 
|---|---|---|
| committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-04-04 16:56:44 -0400 | 
| commit | 9fb3036fe3d9414ae32a97d01d7ccf7550e168a7 (patch) | |
| tree | 7027a6d82d61d147fdd73014aaf6c0a386751cfa | |
| parent | be42e4a621fee05e3299169fbb1068b473e779c2 (diff) | |
bcachefs: Move btree_updates to debugfs
sysfs is limited to PAGE_SIZE, and when we're debugging strange
deadlocks/priority inversions we need to see the full list.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
| -rw-r--r-- | fs/bcachefs/debug.c | 45 | ||||
| -rw-r--r-- | fs/bcachefs/sysfs.c | 6 | 
2 files changed, 42 insertions, 9 deletions
diff --git a/fs/bcachefs/debug.c b/fs/bcachefs/debug.c index 7b681ae91510..cd99b7399414 100644 --- a/fs/bcachefs/debug.c +++ b/fs/bcachefs/debug.c @@ -13,6 +13,7 @@  #include "btree_iter.h"  #include "btree_locking.h"  #include "btree_update.h" +#include "btree_update_interior.h"  #include "buckets.h"  #include "debug.h"  #include "error.h" @@ -668,7 +669,7 @@ static ssize_t bch2_journal_pins_read(struct file *file, char __user *buf,  	i->size	= size;  	i->ret	= 0; -	do { +	while (1) {  		err = flush_buf(i);  		if (err)  			return err; @@ -676,9 +677,12 @@ static ssize_t bch2_journal_pins_read(struct file *file, char __user *buf,  		if (!i->size)  			break; +		if (done) +			break; +  		done = bch2_journal_seq_pins_to_text(&i->buf, &c->journal, &i->iter);  		i->iter++; -	} while (!done); +	}  	if (i->buf.allocation_failure)  		return -ENOMEM; @@ -693,13 +697,45 @@ static const struct file_operations journal_pins_ops = {  	.read		= bch2_journal_pins_read,  }; +static ssize_t bch2_btree_updates_read(struct file *file, char __user *buf, +				       size_t size, loff_t *ppos) +{ +	struct dump_iter *i = file->private_data; +	struct bch_fs *c = i->c; +	int err; + +	i->ubuf = buf; +	i->size	= size; +	i->ret	= 0; + +	if (!i->iter) { +		bch2_btree_updates_to_text(&i->buf, c); +		i->iter++; +	} + +	err = flush_buf(i); +	if (err) +		return err; + +	if (i->buf.allocation_failure) +		return -ENOMEM; + +	return i->ret; +} + +static const struct file_operations btree_updates_ops = { +	.owner		= THIS_MODULE, +	.open		= bch2_dump_open, +	.release	= bch2_dump_release, +	.read		= bch2_btree_updates_read, +}; +  static int btree_transaction_stats_open(struct inode *inode, struct file *file)  {  	struct bch_fs *c = inode->i_private;  	struct dump_iter *i;  	i = kzalloc(sizeof(struct dump_iter), GFP_KERNEL); -  	if (!i)  		return -ENOMEM; @@ -902,6 +938,9 @@ void bch2_fs_debug_init(struct bch_fs *c)  	debugfs_create_file("journal_pins", 0400, c->fs_debug_dir,  			    c->btree_debug, &journal_pins_ops); +	debugfs_create_file("btree_updates", 0400, c->fs_debug_dir, +			    c->btree_debug, &btree_updates_ops); +  	debugfs_create_file("btree_transaction_stats", 0400, c->fs_debug_dir,  			    c, &btree_transaction_stats_op); diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c index c86a93a8d8fc..b18b0cc81b59 100644 --- a/fs/bcachefs/sysfs.c +++ b/fs/bcachefs/sysfs.c @@ -17,7 +17,6 @@  #include "btree_iter.h"  #include "btree_key_cache.h"  #include "btree_update.h" -#include "btree_update_interior.h"  #include "btree_gc.h"  #include "buckets.h"  #include "clock.h" @@ -166,7 +165,6 @@ read_attribute(btree_write_stats);  read_attribute(btree_cache_size);  read_attribute(compression_stats);  read_attribute(journal_debug); -read_attribute(btree_updates);  read_attribute(btree_cache);  read_attribute(btree_key_cache);  read_attribute(stripes_heap); @@ -415,9 +413,6 @@ SHOW(bch2_fs)  	if (attr == &sysfs_journal_debug)  		bch2_journal_debug_to_text(out, &c->journal); -	if (attr == &sysfs_btree_updates) -		bch2_btree_updates_to_text(out, c); -  	if (attr == &sysfs_btree_cache)  		bch2_btree_cache_to_text(out, c); @@ -639,7 +634,6 @@ SYSFS_OPS(bch2_fs_internal);  struct attribute *bch2_fs_internal_files[] = {  	&sysfs_flags,  	&sysfs_journal_debug, -	&sysfs_btree_updates,  	&sysfs_btree_cache,  	&sysfs_btree_key_cache,  	&sysfs_new_stripes,  | 
