]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: zoned: show statistics for zoned filesystems
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Wed, 22 Oct 2025 09:19:59 +0000 (11:19 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 24 Nov 2025 21:34:52 +0000 (22:34 +0100)
Provide statistics for zoned filesystems. These statistics include, the
number of active block-groups, how many of them are reclaimable or unused,
if the filesystem needs to be reclaimed, the currently assigned relocation
and treelog block-groups if they're present and a list of active zones.

Example:
  active block-groups: 4
    reclaimable: 0
    unused: 2
    need reclaim: false
  data relocation block-group: 4294967296
  active zones:
    start: 1610612736, wp: 344064 used: 16384, reserved: 0, unusable: 327680
    start: 1879048192, wp: 34963456 used: 131072, reserved: 0, unusable: 34832384
    start: 4026531840, wp: 0 used: 0, reserved: 0, unusable: 0
    start: 4294967296, wp: 0 used: 0, reserved: 0, unusable: 0

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/sysfs.c

index d66681ce2b3da5cffd429ecba15eb1bbd686b6fc..1f64c132b38738eb7697d486805fb60331aa41d1 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/completion.h>
 #include <linux/bug.h>
 #include <linux/list.h>
+#include <linux/string_choices.h>
 #include <crypto/hash.h>
 #include "messages.h"
 #include "ctree.h"
@@ -25,6 +26,7 @@
 #include "misc.h"
 #include "fs.h"
 #include "accessors.h"
+#include "zoned.h"
 
 /*
  * Structure name                       Path
@@ -1187,6 +1189,56 @@ static ssize_t btrfs_commit_stats_store(struct kobject *kobj,
 }
 BTRFS_ATTR_RW(, commit_stats, btrfs_commit_stats_show, btrfs_commit_stats_store);
 
+static ssize_t btrfs_zoned_stats_show(struct kobject *kobj,
+                                     struct kobj_attribute *a, char *buf)
+{
+       struct btrfs_fs_info *fs_info = to_fs_info(kobj);
+       struct btrfs_block_group *bg;
+       size_t ret = 0;
+
+
+       if (!btrfs_is_zoned(fs_info))
+               return ret;
+
+       spin_lock(&fs_info->zone_active_bgs_lock);
+       ret += sysfs_emit_at(buf, ret, "active block-groups: %zu\n",
+                            list_count_nodes(&fs_info->zone_active_bgs));
+       spin_unlock(&fs_info->zone_active_bgs_lock);
+
+       mutex_lock(&fs_info->reclaim_bgs_lock);
+       spin_lock(&fs_info->unused_bgs_lock);
+       ret += sysfs_emit_at(buf, ret, "\treclaimable: %zu\n",
+                            list_count_nodes(&fs_info->reclaim_bgs));
+       ret += sysfs_emit_at(buf, ret, "\tunused: %zu\n",
+                            list_count_nodes(&fs_info->unused_bgs));
+       spin_unlock(&fs_info->unused_bgs_lock);
+       mutex_unlock(&fs_info->reclaim_bgs_lock);
+
+       ret += sysfs_emit_at(buf, ret, "\tneed reclaim: %s\n",
+                            str_true_false(btrfs_zoned_should_reclaim(fs_info)));
+
+       if (fs_info->data_reloc_bg)
+               ret += sysfs_emit_at(buf, ret,
+                                    "data relocation block-group: %llu\n",
+                                    fs_info->data_reloc_bg);
+       if (fs_info->treelog_bg)
+               ret += sysfs_emit_at(buf, ret,
+                                    "tree-log block-group: %llu\n",
+                                    fs_info->treelog_bg);
+
+       spin_lock(&fs_info->zone_active_bgs_lock);
+       ret += sysfs_emit_at(buf, ret, "active zones:\n");
+       list_for_each_entry(bg, &fs_info->zone_active_bgs, active_bg_list) {
+               ret += sysfs_emit_at(buf, ret,
+                                    "\tstart: %llu, wp: %llu used: %llu, reserved: %llu, unusable: %llu\n",
+                                    bg->start, bg->alloc_offset, bg->used,
+                                    bg->reserved, bg->zone_unusable);
+       }
+       spin_unlock(&fs_info->zone_active_bgs_lock);
+       return ret;
+}
+BTRFS_ATTR(, zoned_stats, btrfs_zoned_stats_show);
+
 static ssize_t btrfs_clone_alignment_show(struct kobject *kobj,
                                struct kobj_attribute *a, char *buf)
 {
@@ -1599,6 +1651,7 @@ static const struct attribute *btrfs_attrs[] = {
        BTRFS_ATTR_PTR(, bg_reclaim_threshold),
        BTRFS_ATTR_PTR(, commit_stats),
        BTRFS_ATTR_PTR(, temp_fsid),
+       BTRFS_ATTR_PTR(, zoned_stats),
 #ifdef CONFIG_BTRFS_EXPERIMENTAL
        BTRFS_ATTR_PTR(, offload_csum),
 #endif