diff options
author | Brian Foster <bfoster@redhat.com> | 2023-05-30 14:41:50 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:10:03 -0400 |
commit | fec4fc82b531beb2cc67b734140ffe776af33f7c (patch) | |
tree | 69eb17cf9b842e4ae2071a30a9ccc8c1d9afb7b9 /fs/bcachefs | |
parent | 28551613b725c28552210121499f4e2f6c6a9054 (diff) | |
download | linux-stable-fec4fc82b531beb2cc67b734140ffe776af33f7c.tar.gz linux-stable-fec4fc82b531beb2cc67b734140ffe776af33f7c.tar.bz2 linux-stable-fec4fc82b531beb2cc67b734140ffe776af33f7c.zip |
bcachefs: create internal disk_groups sysfs file
We have bch2_sb_disk_groups_to_text() to dump disk group labels, but
no good information on device group membership at runtime. Add
bch2_disk_groups_to_text() and an associated 'disk_groups' sysfs
file to print group and device relationships.
Signed-off-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs')
-rw-r--r-- | fs/bcachefs/disk_groups.c | 34 | ||||
-rw-r--r-- | fs/bcachefs/disk_groups.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/sysfs.c | 6 |
3 files changed, 42 insertions, 0 deletions
diff --git a/fs/bcachefs/disk_groups.c b/fs/bcachefs/disk_groups.c index 1a8f8b3750da..aa3a4e5a8b2e 100644 --- a/fs/bcachefs/disk_groups.c +++ b/fs/bcachefs/disk_groups.c @@ -87,6 +87,40 @@ err: return ret; } +void bch2_disk_groups_to_text(struct printbuf *out, struct bch_fs *c) +{ + struct bch_disk_groups_cpu *g; + struct bch_dev *ca; + int i; + unsigned iter; + + out->atomic++; + rcu_read_lock(); + + g = rcu_dereference(c->disk_groups); + if (!g) + goto out; + + for (i = 0; i < g->nr; i++) { + if (i) + prt_printf(out, " "); + + if (g->entries[i].deleted) { + prt_printf(out, "[deleted]"); + continue; + } + + prt_printf(out, "[parent %d devs", g->entries[i].parent); + for_each_member_device_rcu(ca, c, iter, &g->entries[i].devs) + prt_printf(out, " %s", ca->name); + prt_printf(out, "]"); + } + +out: + rcu_read_unlock(); + out->atomic--; +} + static void bch2_sb_disk_groups_to_text(struct printbuf *out, struct bch_sb *sb, struct bch_sb_field *f) diff --git a/fs/bcachefs/disk_groups.h b/fs/bcachefs/disk_groups.h index e4470c357a66..bf39db3868bf 100644 --- a/fs/bcachefs/disk_groups.h +++ b/fs/bcachefs/disk_groups.h @@ -88,4 +88,6 @@ int bch2_dev_group_set(struct bch_fs *, struct bch_dev *, const char *); const char *bch2_sb_validate_disk_groups(struct bch_sb *, struct bch_sb_field *); +void bch2_disk_groups_to_text(struct printbuf *, struct bch_fs *); + #endif /* _BCACHEFS_DISK_GROUPS_H */ diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c index b2274cb35172..77f92d537af6 100644 --- a/fs/bcachefs/sysfs.c +++ b/fs/bcachefs/sysfs.c @@ -223,6 +223,7 @@ static void bch2_write_refs_to_text(struct printbuf *out, struct bch_fs *c) #endif read_attribute(internal_uuid); +read_attribute(disk_groups); read_attribute(has_data); read_attribute(alloc_debug); @@ -471,6 +472,9 @@ SHOW(bch2_fs) if (attr == &sysfs_nocow_lock_table) bch2_nocow_locks_to_text(out, &c->nocow_locks); + if (attr == &sysfs_disk_groups) + bch2_disk_groups_to_text(out, c); + return 0; } @@ -681,6 +685,8 @@ struct attribute *bch2_fs_internal_files[] = { &sysfs_moving_ctxts, &sysfs_internal_uuid, + + &sysfs_disk_groups, NULL }; |