bcachefs: Fix a null ptr deref in bch2_fs_alloc() error path
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 28 Jun 2023 04:01:19 +0000 (00:01 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:05 +0000 (17:10 -0400)
This fixes a null ptr deref in bch2_free_pending_node_rewrites() when
the list head wasn't initialized.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update_interior.c
fs/bcachefs/btree_update_interior.h
fs/bcachefs/super.c

index 914cb80fc6d9622112acf78556d916c0504e833c..5d3a09039fab703c1198687e591e066d1ea63224 100644 (file)
@@ -2452,7 +2452,7 @@ void bch2_fs_btree_interior_update_exit(struct bch_fs *c)
        mempool_exit(&c->btree_interior_update_pool);
 }
 
-int bch2_fs_btree_interior_update_init(struct bch_fs *c)
+void bch2_fs_btree_interior_update_init_early(struct bch_fs *c)
 {
        mutex_init(&c->btree_reserve_cache_lock);
        INIT_LIST_HEAD(&c->btree_interior_update_list);
@@ -2462,7 +2462,10 @@ int bch2_fs_btree_interior_update_init(struct bch_fs *c)
 
        INIT_LIST_HEAD(&c->pending_node_rewrites);
        mutex_init(&c->pending_node_rewrites_lock);
+}
 
+int bch2_fs_btree_interior_update_init(struct bch_fs *c)
+{
        c->btree_interior_update_worker =
                alloc_workqueue("btree_update", WQ_UNBOUND|WQ_MEM_RECLAIM, 1);
        if (!c->btree_interior_update_worker)
index dcfd7ceacc5926da051a11d72b1bdc12ec59b106..221b7ad5d053399f5b72e1c8952f1ef54538d295 100644 (file)
@@ -322,6 +322,7 @@ void bch2_do_pending_node_rewrites(struct bch_fs *);
 void bch2_free_pending_node_rewrites(struct bch_fs *);
 
 void bch2_fs_btree_interior_update_exit(struct bch_fs *);
+void bch2_fs_btree_interior_update_init_early(struct bch_fs *);
 int bch2_fs_btree_interior_update_init(struct bch_fs *);
 
 #endif /* _BCACHEFS_BTREE_UPDATE_INTERIOR_H */
index 9f1cca7d6c8ee671b1d007799b495b0afb61e0d4..5b0c7dafae2dee5d306b4230fbe48f59aeb099da 100644 (file)
@@ -686,6 +686,7 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts)
 
        bch2_fs_copygc_init(c);
        bch2_fs_btree_key_cache_init_early(&c->btree_key_cache);
+       bch2_fs_btree_interior_update_init_early(c);
        bch2_fs_allocator_background_init(c);
        bch2_fs_allocator_foreground_init(c);
        bch2_fs_rebalance_init(c);