]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/disk_groups.c
Update bcachefs sources to 31c09369cd six locks: Fix an unitialized var
[bcachefs-tools-debian] / libbcachefs / disk_groups.c
index 81b41b07c24b21b1a2914234ba231b6977416180..1a8f8b3750da15ebf6e9731cdab43de35e391b79 100644 (file)
@@ -27,7 +27,7 @@ static int bch2_sb_disk_groups_validate(struct bch_sb *sb,
        struct bch_sb_field_members *mi = bch2_sb_get_members(sb);
        unsigned nr_groups = disk_groups_nr(groups);
        unsigned i, len;
-       int ret = -EINVAL;
+       int ret = 0;
 
        for (i = 0; i < sb->nr_devices; i++) {
                struct bch_member *m = mi->members + i;
@@ -39,14 +39,14 @@ static int bch2_sb_disk_groups_validate(struct bch_sb *sb,
                g = BCH_MEMBER_GROUP(m) - 1;
 
                if (g >= nr_groups) {
-                       pr_buf(err, "disk %u has invalid label %u (have %u)",
+                       prt_printf(err, "disk %u has invalid label %u (have %u)",
                               i, g, nr_groups);
-                       return -EINVAL;
+                       return -BCH_ERR_invalid_sb_disk_groups;
                }
 
                if (BCH_GROUP_DELETED(&groups->entries[g])) {
-                       pr_buf(err, "disk %u has deleted label %u", i, g);
-                       return -EINVAL;
+                       prt_printf(err, "disk %u has deleted label %u", i, g);
+                       return -BCH_ERR_invalid_sb_disk_groups;
                }
        }
 
@@ -61,14 +61,14 @@ static int bch2_sb_disk_groups_validate(struct bch_sb *sb,
 
                len = strnlen(g->label, sizeof(g->label));
                if (!len) {
-                       pr_buf(err, "label %u empty", i);
-                       return -EINVAL;
+                       prt_printf(err, "label %u empty", i);
+                       return -BCH_ERR_invalid_sb_disk_groups;
                }
        }
 
        sorted = kmalloc_array(nr_groups, sizeof(*sorted), GFP_KERNEL);
        if (!sorted)
-               return -ENOMEM;
+               return -BCH_ERR_ENOMEM_disk_groups_validate;
 
        memcpy(sorted, groups->entries, nr_groups * sizeof(*sorted));
        sort(sorted, nr_groups, sizeof(*sorted), group_cmp, NULL);
@@ -76,16 +76,15 @@ static int bch2_sb_disk_groups_validate(struct bch_sb *sb,
        for (g = sorted; g + 1 < sorted + nr_groups; g++)
                if (!BCH_GROUP_DELETED(g) &&
                    !group_cmp(&g[0], &g[1])) {
-                       pr_buf(err, "duplicate label %llu.%.*s",
+                       prt_printf(err, "duplicate label %llu.%.*s",
                               BCH_GROUP_PARENT(g),
                               (int) sizeof(g->label), g->label);
+                       ret = -BCH_ERR_invalid_sb_disk_groups;
                        goto err;
                }
-
-       ret = 0;
 err:
        kfree(sorted);
-       return 0;
+       return ret;
 }
 
 static void bch2_sb_disk_groups_to_text(struct printbuf *out,
@@ -101,12 +100,12 @@ static void bch2_sb_disk_groups_to_text(struct printbuf *out,
             g < groups->entries + nr_groups;
             g++) {
                if (g != groups->entries)
-                       pr_buf(out, " ");
+                       prt_printf(out, " ");
 
                if (BCH_GROUP_DELETED(g))
-                       pr_buf(out, "[deleted]");
+                       prt_printf(out, "[deleted]");
                else
-                       pr_buf(out, "[parent %llu name %s]",
+                       prt_printf(out, "[parent %llu name %s]",
                               BCH_GROUP_PARENT(g), g->label);
        }
 }
@@ -135,7 +134,7 @@ int bch2_sb_disk_groups_to_cpu(struct bch_fs *c)
        cpu_g = kzalloc(sizeof(*cpu_g) +
                        sizeof(cpu_g->entries[0]) * nr_groups, GFP_KERNEL);
        if (!cpu_g)
-               return -ENOMEM;
+               return -BCH_ERR_ENOMEM_disk_groups_to_cpu;
 
        cpu_g->nr = nr_groups;
 
@@ -276,7 +275,7 @@ static int __bch2_disk_group_add(struct bch_sb_handle *sb, unsigned parent,
 
                groups = bch2_sb_resize_disk_groups(sb, u64s);
                if (!groups)
-                       return -ENOSPC;
+                       return -BCH_ERR_ENOSPC_disk_label_add;
 
                nr_groups = disk_groups_nr(groups);
        }
@@ -375,41 +374,43 @@ void bch2_disk_path_to_text(struct printbuf *out, struct bch_sb *sb, unsigned v)
                v = path[--nr];
                g = groups->entries + v;
 
-               pr_buf(out, "%.*s", (int) sizeof(g->label), g->label);
+               prt_printf(out, "%.*s", (int) sizeof(g->label), g->label);
                if (nr)
-                       pr_buf(out, ".");
+                       prt_printf(out, ".");
        }
        return;
 inval:
-       pr_buf(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;
-       int v = -1;
-       int ret = 0;
-
-       mutex_lock(&c->sb_lock);
+       int ret, v = -1;
 
        if (!strlen(name) || !strcmp(name, "none"))
-               goto write_sb;
+               return 0;
 
        v = bch2_disk_path_find_or_create(&c->disk_sb, name);
-       if (v < 0) {
-               mutex_unlock(&c->sb_lock);
+       if (v < 0)
                return v;
-       }
 
        ret = bch2_sb_disk_groups_to_cpu(c);
        if (ret)
-               goto unlock;
-write_sb:
+               return ret;
+
        mi = &bch2_sb_get_members(c->disk_sb.sb)->members[ca->dev_idx];
        SET_BCH_MEMBER_GROUP(mi, v + 1);
+       return 0;
+}
 
-       bch2_write_super(c);
-unlock:
+int bch2_dev_group_set(struct bch_fs *c, struct bch_dev *ca, const char *name)
+{
+       int ret;
+
+       mutex_lock(&c->sb_lock);
+       ret = __bch2_dev_group_set(c, ca, name) ?:
+               bch2_write_super(c);
        mutex_unlock(&c->sb_lock);
 
        return ret;
@@ -454,7 +455,7 @@ void bch2_opt_target_to_text(struct printbuf *out,
 
        switch (t.type) {
        case TARGET_NULL:
-               pr_buf(out, "none");
+               prt_printf(out, "none");
                break;
        case TARGET_DEV:
                if (c) {
@@ -466,15 +467,12 @@ void bch2_opt_target_to_text(struct printbuf *out,
                                : NULL;
 
                        if (ca && percpu_ref_tryget(&ca->io_ref)) {
-                               char b[BDEVNAME_SIZE];
-
-                               pr_buf(out, "/dev/%s",
-                                      bdevname(ca->disk_sb.bdev, b));
+                               prt_printf(out, "/dev/%pg", ca->disk_sb.bdev);
                                percpu_ref_put(&ca->io_ref);
                        } else if (ca) {
-                               pr_buf(out, "offline device %u", t.dev);
+                               prt_printf(out, "offline device %u", t.dev);
                        } else {
-                               pr_buf(out, "invalid device %u", t.dev);
+                               prt_printf(out, "invalid device %u", t.dev);
                        }
 
                        rcu_read_unlock();
@@ -483,11 +481,11 @@ void bch2_opt_target_to_text(struct printbuf *out,
                        struct bch_member *m = mi->members + t.dev;
 
                        if (bch2_dev_exists(sb, mi, t.dev)) {
-                               pr_buf(out, "Device ");
+                               prt_printf(out, "Device ");
                                pr_uuid(out, m->uuid.b);
-                               pr_buf(out, " (%u)", t.dev);
+                               prt_printf(out, " (%u)", t.dev);
                        } else {
-                               pr_buf(out, "Bad device %u", t.dev);
+                               prt_printf(out, "Bad device %u", t.dev);
                        }
                }
                break;