Commit 02afcb8c authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Fix adding a device with a label

Device labels are represented as pointers in the member info section: we
need to get and then set the label for it to be kept correctly.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent 12043cf1
...@@ -384,32 +384,34 @@ void bch2_disk_path_to_text(struct printbuf *out, struct bch_sb *sb, unsigned v) ...@@ -384,32 +384,34 @@ void bch2_disk_path_to_text(struct printbuf *out, struct bch_sb *sb, unsigned v)
prt_printf(out, "invalid label %u", v); prt_printf(out, "invalid label %u", v);
} }
int bch2_dev_group_set(struct bch_fs *c, struct bch_dev *ca, const char *name) int __bch2_dev_group_set(struct bch_fs *c, struct bch_dev *ca, const char *name)
{ {
struct bch_member *mi; struct bch_member *mi;
int v = -1; int ret, v = -1;
int ret = 0;
mutex_lock(&c->sb_lock);
if (!strlen(name) || !strcmp(name, "none")) if (!strlen(name) || !strcmp(name, "none"))
goto write_sb; return 0;
v = bch2_disk_path_find_or_create(&c->disk_sb, name); v = bch2_disk_path_find_or_create(&c->disk_sb, name);
if (v < 0) { if (v < 0)
mutex_unlock(&c->sb_lock);
return v; return v;
}
ret = bch2_sb_disk_groups_to_cpu(c); ret = bch2_sb_disk_groups_to_cpu(c);
if (ret) if (ret)
goto unlock; return ret;
write_sb:
mi = &bch2_sb_get_members(c->disk_sb.sb)->members[ca->dev_idx]; mi = &bch2_sb_get_members(c->disk_sb.sb)->members[ca->dev_idx];
SET_BCH_MEMBER_GROUP(mi, v + 1); SET_BCH_MEMBER_GROUP(mi, v + 1);
return 0;
}
bch2_write_super(c); int bch2_dev_group_set(struct bch_fs *c, struct bch_dev *ca, const char *name)
unlock: {
int ret;
mutex_lock(&c->sb_lock);
ret = __bch2_dev_group_set(c, ca, name) ?:
bch2_write_super(c);
mutex_unlock(&c->sb_lock); mutex_unlock(&c->sb_lock);
return ret; return ret;
......
...@@ -82,6 +82,7 @@ void bch2_opt_target_to_text(struct printbuf *, struct bch_fs *, struct bch_sb * ...@@ -82,6 +82,7 @@ void bch2_opt_target_to_text(struct printbuf *, struct bch_fs *, struct bch_sb *
int bch2_sb_disk_groups_to_cpu(struct bch_fs *); int bch2_sb_disk_groups_to_cpu(struct bch_fs *);
int __bch2_dev_group_set(struct bch_fs *, struct bch_dev *, const char *);
int bch2_dev_group_set(struct bch_fs *, struct bch_dev *, const char *); int bch2_dev_group_set(struct bch_fs *, struct bch_dev *, const char *);
const char *bch2_sb_validate_disk_groups(struct bch_sb *, const char *bch2_sb_validate_disk_groups(struct bch_sb *,
......
...@@ -1522,6 +1522,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path) ...@@ -1522,6 +1522,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
struct bch_member dev_mi; struct bch_member dev_mi;
unsigned dev_idx, nr_devices, u64s; unsigned dev_idx, nr_devices, u64s;
struct printbuf errbuf = PRINTBUF; struct printbuf errbuf = PRINTBUF;
struct printbuf label = PRINTBUF;
int ret; int ret;
ret = bch2_read_super(path, &opts, &sb); ret = bch2_read_super(path, &opts, &sb);
...@@ -1532,6 +1533,14 @@ int bch2_dev_add(struct bch_fs *c, const char *path) ...@@ -1532,6 +1533,14 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
dev_mi = bch2_sb_get_members(sb.sb)->members[sb.sb->dev_idx]; dev_mi = bch2_sb_get_members(sb.sb)->members[sb.sb->dev_idx];
if (BCH_MEMBER_GROUP(&dev_mi)) {
bch2_disk_path_to_text(&label, sb.sb, BCH_MEMBER_GROUP(&dev_mi) - 1);
if (label.allocation_failure) {
ret = -ENOMEM;
goto err;
}
}
err = bch2_dev_may_add(sb.sb, c); err = bch2_dev_may_add(sb.sb, c);
if (err) { if (err) {
bch_err(c, "device add error: %s", err); bch_err(c, "device add error: %s", err);
...@@ -1612,6 +1621,14 @@ int bch2_dev_add(struct bch_fs *c, const char *path) ...@@ -1612,6 +1621,14 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
ca->disk_sb.sb->dev_idx = dev_idx; ca->disk_sb.sb->dev_idx = dev_idx;
bch2_dev_attach(c, ca, dev_idx); bch2_dev_attach(c, ca, dev_idx);
if (BCH_MEMBER_GROUP(&dev_mi)) {
ret = __bch2_dev_group_set(c, ca, label.buf);
if (ret) {
bch_err(c, "device add error: error setting label");
goto err_unlock;
}
}
bch2_write_super(c); bch2_write_super(c);
mutex_unlock(&c->sb_lock); mutex_unlock(&c->sb_lock);
...@@ -1644,6 +1661,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path) ...@@ -1644,6 +1661,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path)
if (ca) if (ca)
bch2_dev_free(ca); bch2_dev_free(ca);
bch2_free_super(&sb); bch2_free_super(&sb);
printbuf_exit(&label);
printbuf_exit(&errbuf); printbuf_exit(&errbuf);
return ret; return ret;
err_late: err_late:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment