mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
bcachefs: bch2_disk_path_to_text() no longer takes sb_lock
We're going to be using bch2_target_to_text() -> bch2_disk_path_to_text() from bch2_bkey_ptrs_to_text() and bch2_bkey_ptrs_invalid(), which can be called in any context. This patch adds the actual label to bch_disk_group_cpu so that it can be used by bch2_disk_path_to_text, and splits out bch2_disk_path_to_text() into two variants - like the previous patch, one for when we have a running filesystem and another for when we only have a superblock. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
37707bb183
commit
e677179b35
@ -175,6 +175,7 @@ int bch2_sb_disk_groups_to_cpu(struct bch_fs *c)
|
||||
|
||||
dst->deleted = BCH_GROUP_DELETED(src);
|
||||
dst->parent = BCH_GROUP_PARENT(src);
|
||||
memcpy(dst->label, src->label, sizeof(dst->label));
|
||||
}
|
||||
|
||||
for (i = 0; i < c->disk_sb.sb->nr_devices; i++) {
|
||||
@ -382,7 +383,57 @@ int bch2_disk_path_find_or_create(struct bch_sb_handle *sb, const char *name)
|
||||
return v;
|
||||
}
|
||||
|
||||
void bch2_disk_path_to_text(struct printbuf *out, struct bch_sb *sb, unsigned v)
|
||||
void bch2_disk_path_to_text(struct printbuf *out, struct bch_fs *c, unsigned v)
|
||||
{
|
||||
struct bch_disk_groups_cpu *groups;
|
||||
struct bch_disk_group_cpu *g;
|
||||
unsigned nr = 0;
|
||||
u16 path[32];
|
||||
|
||||
out->atomic++;
|
||||
rcu_read_lock();
|
||||
groups = rcu_dereference(c->disk_groups);
|
||||
if (!groups)
|
||||
goto invalid;
|
||||
|
||||
while (1) {
|
||||
if (nr == ARRAY_SIZE(path))
|
||||
goto invalid;
|
||||
|
||||
if (v >= groups->nr)
|
||||
goto invalid;
|
||||
|
||||
g = groups->entries + v;
|
||||
|
||||
if (g->deleted)
|
||||
goto invalid;
|
||||
|
||||
path[nr++] = v;
|
||||
|
||||
if (!g->parent)
|
||||
break;
|
||||
|
||||
v = g->parent - 1;
|
||||
}
|
||||
|
||||
while (nr) {
|
||||
v = path[--nr];
|
||||
g = groups->entries + v;
|
||||
|
||||
prt_printf(out, "%.*s", (int) sizeof(g->label), g->label);
|
||||
if (nr)
|
||||
prt_printf(out, ".");
|
||||
}
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
out->atomic--;
|
||||
return;
|
||||
invalid:
|
||||
prt_printf(out, "invalid label %u", v);
|
||||
goto out;
|
||||
}
|
||||
|
||||
void bch2_disk_path_to_text_sb(struct printbuf *out, struct bch_sb *sb, unsigned v)
|
||||
{
|
||||
struct bch_sb_field_disk_groups *groups =
|
||||
bch2_sb_field_get(sb, disk_groups);
|
||||
@ -522,9 +573,7 @@ void bch2_target_to_text(struct printbuf *out, struct bch_fs *c, unsigned v)
|
||||
break;
|
||||
}
|
||||
case TARGET_GROUP:
|
||||
mutex_lock(&c->sb_lock);
|
||||
bch2_disk_path_to_text(out, c->disk_sb.sb, t.group);
|
||||
mutex_unlock(&c->sb_lock);
|
||||
bch2_disk_path_to_text(out, c, t.group);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
@ -552,7 +601,7 @@ void bch2_target_to_text_sb(struct printbuf *out, struct bch_sb *sb, unsigned v)
|
||||
break;
|
||||
}
|
||||
case TARGET_GROUP:
|
||||
bch2_disk_path_to_text(out, sb, t.group);
|
||||
bch2_disk_path_to_text_sb(out, sb, t.group);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
|
@ -85,7 +85,9 @@ int bch2_disk_path_find(struct bch_sb_handle *, const char *);
|
||||
/* Exported for userspace bcachefs-tools: */
|
||||
int bch2_disk_path_find_or_create(struct bch_sb_handle *, const char *);
|
||||
|
||||
void bch2_disk_path_to_text(struct printbuf *, struct bch_sb *, unsigned);
|
||||
void bch2_disk_path_to_text(struct printbuf *, struct bch_fs *, unsigned);
|
||||
void bch2_disk_path_to_text_sb(struct printbuf *, struct bch_sb *, unsigned);
|
||||
|
||||
void bch2_target_to_text(struct printbuf *out, struct bch_fs *, unsigned);
|
||||
|
||||
int bch2_opt_target_parse(struct bch_fs *, const char *, u64 *, struct printbuf *);
|
||||
|
@ -5,6 +5,7 @@
|
||||
struct bch_disk_group_cpu {
|
||||
bool deleted;
|
||||
u16 parent;
|
||||
u8 label[BCH_SB_LABEL_SIZE];
|
||||
struct bch_devs_mask devs;
|
||||
};
|
||||
|
||||
|
@ -1582,7 +1582,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
|
||||
dev_mi = bch2_sb_member_get(sb.sb, sb.sb->dev_idx);
|
||||
|
||||
if (BCH_MEMBER_GROUP(&dev_mi)) {
|
||||
bch2_disk_path_to_text(&label, sb.sb, BCH_MEMBER_GROUP(&dev_mi) - 1);
|
||||
bch2_disk_path_to_text_sb(&label, sb.sb, BCH_MEMBER_GROUP(&dev_mi) - 1);
|
||||
if (label.allocation_failure) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
|
@ -910,13 +910,8 @@ SHOW(bch2_dev)
|
||||
sysfs_print(discard, ca->mi.discard);
|
||||
|
||||
if (attr == &sysfs_label) {
|
||||
if (ca->mi.group) {
|
||||
mutex_lock(&c->sb_lock);
|
||||
bch2_disk_path_to_text(out, c->disk_sb.sb,
|
||||
ca->mi.group - 1);
|
||||
mutex_unlock(&c->sb_lock);
|
||||
}
|
||||
|
||||
if (ca->mi.group)
|
||||
bch2_disk_path_to_text(out, c, ca->mi.group - 1);
|
||||
prt_char(out, '\n');
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user