bcachefs: Fix __bch2_dev_group_set()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 1 May 2025 02:37:13 +0000 (22:37 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 1 May 2025 16:22:10 +0000 (12:22 -0400)
bch2_sb_disk_groups_to_cpu() goes off of the superblock member info, so
we need to set that first.

Reported-by: Stijn Tintel <stijn@linux-ipv6.be>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/disk_groups.c

index 1186280b29e903b404e750bbe7f3b213eb1c5bf4..2ca3cbf12b7135e7d27adc0a7991c5a187a9a303 100644 (file)
@@ -470,23 +470,22 @@ inval:
 
 int __bch2_dev_group_set(struct bch_fs *c, struct bch_dev *ca, const char *name)
 {
-       struct bch_member *mi;
-       int ret, v = -1;
+       lockdep_assert_held(&c->sb_lock);
 
-       if (!strlen(name) || !strcmp(name, "none"))
-               return 0;
 
-       v = bch2_disk_path_find_or_create(&c->disk_sb, name);
-       if (v < 0)
-               return v;
+       if (!strlen(name) || !strcmp(name, "none")) {
+               struct bch_member *mi = bch2_members_v2_get_mut(c->disk_sb.sb, ca->dev_idx);
+               SET_BCH_MEMBER_GROUP(mi, 0);
+       } else {
+               int v = bch2_disk_path_find_or_create(&c->disk_sb, name);
+               if (v < 0)
+                       return v;
 
-       ret = bch2_sb_disk_groups_to_cpu(c);
-       if (ret)
-               return ret;
+               struct bch_member *mi = bch2_members_v2_get_mut(c->disk_sb.sb, ca->dev_idx);
+               SET_BCH_MEMBER_GROUP(mi, v + 1);
+       }
 
-       mi = bch2_members_v2_get_mut(c->disk_sb.sb, ca->dev_idx);
-       SET_BCH_MEMBER_GROUP(mi, v + 1);
-       return 0;
+       return bch2_sb_disk_groups_to_cpu(c);
 }
 
 int bch2_dev_group_set(struct bch_fs *c, struct bch_dev *ca, const char *name)