]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/disk_groups.c
Update bcachefs sources to 04f2d2ae5b bcachefs: Fix build error on weird gcc
[bcachefs-tools-debian] / libbcachefs / disk_groups.c
index 1a8f8b3750da15ebf6e9731cdab43de35e391b79..52b6400779704abad9f9f66ace56cecb9355a8ed 100644 (file)
@@ -87,6 +87,40 @@ err:
        return ret;
 }
 
+void bch2_disk_groups_to_text(struct printbuf *out, struct bch_fs *c)
+{
+       struct bch_disk_groups_cpu *g;
+       struct bch_dev *ca;
+       int i;
+       unsigned iter;
+
+       out->atomic++;
+       rcu_read_lock();
+
+       g = rcu_dereference(c->disk_groups);
+       if (!g)
+               goto out;
+
+       for (i = 0; i < g->nr; i++) {
+               if (i)
+                       prt_printf(out, " ");
+
+               if (g->entries[i].deleted) {
+                       prt_printf(out, "[deleted]");
+                       continue;
+               }
+
+               prt_printf(out, "[parent %d devs", g->entries[i].parent);
+               for_each_member_device_rcu(ca, c, iter, &g->entries[i].devs)
+                       prt_printf(out, " %s", ca->name);
+               prt_printf(out, "]");
+       }
+
+out:
+       rcu_read_unlock();
+       out->atomic--;
+}
+
 static void bch2_sb_disk_groups_to_text(struct printbuf *out,
                                        struct bch_sb *sb,
                                        struct bch_sb_field *f)
@@ -174,26 +208,36 @@ int bch2_sb_disk_groups_to_cpu(struct bch_fs *c)
 const struct bch_devs_mask *bch2_target_to_mask(struct bch_fs *c, unsigned target)
 {
        struct target t = target_decode(target);
+       struct bch_devs_mask *devs;
+
+       rcu_read_lock();
 
        switch (t.type) {
        case TARGET_NULL:
-               return NULL;
+               devs = NULL;
+               break;
        case TARGET_DEV: {
                struct bch_dev *ca = t.dev < c->sb.nr_devices
                        ? rcu_dereference(c->devs[t.dev])
                        : NULL;
-               return ca ? &ca->self : NULL;
+               devs = ca ? &ca->self : NULL;
+               break;
        }
        case TARGET_GROUP: {
                struct bch_disk_groups_cpu *g = rcu_dereference(c->disk_groups);
 
-               return g && t.group < g->nr && !g->entries[t.group].deleted
+               devs = g && t.group < g->nr && !g->entries[t.group].deleted
                        ? &g->entries[t.group].devs
                        : NULL;
+               break;
        }
        default:
                BUG();
        }
+
+       rcu_read_unlock();
+
+       return devs;
 }
 
 bool bch2_dev_in_target(struct bch_fs *c, unsigned dev, unsigned target)