diff mbox series

[RFC] btrfs: sysfs: introduce <uuid>/debug/cleaner_trigger

Message ID 20220121071328.47060-1-wqu@suse.com (mailing list archive)
State New, archived
Headers show
Series [RFC] btrfs: sysfs: introduce <uuid>/debug/cleaner_trigger | expand

Commit Message

Qu Wenruo Jan. 21, 2022, 7:13 a.m. UTC
Since there is no existing quick way to trigger cleaner to do
cleanup/autodefrag, here we introduce a new sysfs file at:

  /sys/fs/btrfs/<uuid>/debug/cleaner_trigger

Any write into that file will wake up cleaner_kthread.

This allows us to have a fast and relieable way to trigger cleaner to
test autodefrag.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
There seems to be no way to initiate the cleaner thread to run.

With this patch and previous io_accounting patch, I can now trigger an
autodefrag run and compare io_accounting to get how many bytes are
re-written (aka, defragged).

Although so far I still can't craft a minimal script to trigger more IO
than expected.
---
 fs/btrfs/sysfs.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)
diff mbox series

Patch

diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
index dfdef93bdeab..a20e6bd82d8d 100644
--- a/fs/btrfs/sysfs.c
+++ b/fs/btrfs/sysfs.c
@@ -577,6 +577,17 @@  static ssize_t btrfs_discard_max_discard_size_store(struct kobject *kobj,
 BTRFS_ATTR_RW(discard, max_discard_size, btrfs_discard_max_discard_size_show,
 	      btrfs_discard_max_discard_size_store);
 
+static ssize_t wake_up_cleaner(struct kobject *kobj, struct kobj_attribute *a,
+			       const char *buf, size_t count)
+{
+	struct btrfs_fs_info *fs_info = to_fs_info(kobj->parent);
+
+	wake_up_process(fs_info->cleaner_kthread);
+	return count;
+}
+
+BTRFS_ATTR_RW(debug_mount, cleaner_trigger, NULL, wake_up_cleaner);
+
 /*
  * Per-filesystem debugging of discard (when mounted with discard=async).
  *
@@ -600,6 +611,7 @@  static const struct attribute *discard_debug_attrs[] = {
  * Path: /sys/fs/btrfs/UUID/debug/
  */
 static const struct attribute *btrfs_debug_mount_attrs[] = {
+	BTRFS_ATTR_PTR(debug_mount, cleaner_trigger),
 	NULL,
 };