From: Kent Overstreet Date: Thu, 6 Aug 2020 19:22:24 +0000 (-0400) Subject: bcachefs: Fix a couple null ptr derefs when no disk groups exist X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=2d8c0da1a7c2601b21d3fb63b8cb4f3610cac196;p=linux.git bcachefs: Fix a couple null ptr derefs when no disk groups exist 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 Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/disk_groups.c b/fs/bcachefs/disk_groups.c index 1c30065833c2c..c47fa0a0f4507 100644 --- a/fs/bcachefs/disk_groups.c +++ b/fs/bcachefs/disk_groups.c @@ -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; diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c index 5250171498550..78adccbee9d96 100644 --- a/fs/bcachefs/io.c +++ b/fs/bcachefs/io.c @@ -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)