@@ -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,
};
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(+)