diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-08-19 00:57:24 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:09:39 +0300 |
commit | 02afcb8c26b14ae317754d8c79339f41b3dfeaae (patch) | |
tree | 00ece659f7a8ee8aa78d5f9c787dca6c1630fd33 /fs/bcachefs/super.c | |
parent | 12043cf1511420ecf38f4925a0089c1ae1aa058b (diff) | |
download | linux-02afcb8c26b14ae317754d8c79339f41b3dfeaae.tar.xz |
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: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/super.c')
-rw-r--r-- | fs/bcachefs/super.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c index fe7938e7e07b..1c8fac603644 100644 --- a/fs/bcachefs/super.c +++ b/fs/bcachefs/super.c @@ -1522,6 +1522,7 @@ int bch2_dev_add(struct bch_fs *c, const char *path) struct bch_member dev_mi; unsigned dev_idx, nr_devices, u64s; struct printbuf errbuf = PRINTBUF; + struct printbuf label = PRINTBUF; int ret; ret = bch2_read_super(path, &opts, &sb); @@ -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]; + 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); if (err) { bch_err(c, "device add error: %s", err); @@ -1612,6 +1621,14 @@ have_slot: ca->disk_sb.sb->dev_idx = 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); mutex_unlock(&c->sb_lock); @@ -1644,6 +1661,7 @@ err: if (ca) bch2_dev_free(ca); bch2_free_super(&sb); + printbuf_exit(&label); printbuf_exit(&errbuf); return ret; err_late: |