bcachefs: Fix a couple null ptr derefs when no disk groups exist
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 6 Aug 2020 19:22:24 +0000 (15:22 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:43 +0000 (17:08 -0400)
Normally successfully parsing a target means disk groups should exist,
but we don't want a BUG() or null ptr deref if we end up with an invalid
target.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/disk_groups.c
fs/bcachefs/io.c

index 1c30065833c2c2df20aeac053d7a9b68c52fa06a..c47fa0a0f450781b998890dc7b5385dd6dde63c2 100644 (file)
@@ -183,7 +183,7 @@ const struct bch_devs_mask *bch2_target_to_mask(struct bch_fs *c, unsigned targe
        case TARGET_GROUP: {
                struct bch_disk_groups_cpu *g = rcu_dereference(c->disk_groups);
 
-               return t.group < g->nr && !g->entries[t.group].deleted
+               return g && t.group < g->nr && !g->entries[t.group].deleted
                        ? &g->entries[t.group].devs
                        : NULL;
        }
@@ -208,7 +208,7 @@ bool bch2_dev_in_target(struct bch_fs *c, unsigned dev, unsigned target)
 
                rcu_read_lock();
                g = rcu_dereference(c->disk_groups);
-               m = t.group < g->nr && !g->entries[t.group].deleted
+               m = g && t.group < g->nr && !g->entries[t.group].deleted
                        ? &g->entries[t.group].devs
                        : NULL;
 
index 52501714985501696167f33a2a9d7806636d1740..78adccbee9d962dc4cfa6c5be3b85d9ca5ebc0ec 100644 (file)
@@ -55,7 +55,9 @@ static bool bch2_target_congested(struct bch_fs *c, u16 target)
                return false;
 
        rcu_read_lock();
-       devs = bch2_target_to_mask(c, target);
+       devs = bch2_target_to_mask(c, target) ?:
+               &c->rw_devs[BCH_DATA_user];
+
        for_each_set_bit(d, devs->d, BCH_SB_MEMBERS_MAX) {
                ca = rcu_dereference(c->devs[d]);
                if (!ca)