bcachefs: move replica_set from bch_dev to bch_fs
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 1 May 2024 00:32:44 +0000 (20:32 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:23 +0000 (17:29 -0400)
This is needed for the next patch - the write submit path has to be able
to allocate a replica bio even when we weren't able to get a ref on the
device.

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

index f5ba8c6a34d73c68fa9cace74c15833768769ebc..22d303813d31f31397e689cc5071ed5dab55f309 100644 (file)
@@ -569,9 +569,6 @@ struct bch_dev {
 
        struct bch_devs_mask    self;
 
-       /* biosets used in cloned bios for writing multiple replicas */
-       struct bio_set          replica_set;
-
        /*
         * Buckets:
         * Per-bucket arrays are protected by c->mark_lock, bucket_lock and
@@ -995,6 +992,7 @@ struct bch_fs {
        struct bio_set          bio_read;
        struct bio_set          bio_read_split;
        struct bio_set          bio_write;
+       struct bio_set          replica_set;
        struct mutex            bio_bounce_pages_lock;
        mempool_t               bio_bounce_pages;
        struct bucket_nocow_lock_table
index 40c8f884422416dae659e1765d9652ea8120dd16..5d9f349a150431dcf82b944df2b9e240c035e2bd 100644 (file)
@@ -412,8 +412,7 @@ void bch2_submit_wbio_replicas(struct bch_write_bio *wbio, struct bch_fs *c,
                struct bch_dev *ca = bch2_dev_bkey_exists(c, ptr->dev);
 
                if (to_entry(ptr + 1) < ptrs.end) {
-                       n = to_wbio(bio_alloc_clone(NULL, &wbio->bio,
-                                               GFP_NOFS, &ca->replica_set));
+                       n = to_wbio(bio_alloc_clone(NULL, &wbio->bio, GFP_NOFS, &c->replica_set));
 
                        n->bio.bi_end_io        = wbio->bio.bi_end_io;
                        n->bio.bi_private       = wbio->bio.bi_private;
@@ -1667,13 +1666,14 @@ void bch2_write_op_to_text(struct printbuf *out, struct bch_write_op *op)
 void bch2_fs_io_write_exit(struct bch_fs *c)
 {
        mempool_exit(&c->bio_bounce_pages);
+       bioset_exit(&c->replica_set);
        bioset_exit(&c->bio_write);
 }
 
 int bch2_fs_io_write_init(struct bch_fs *c)
 {
-       if (bioset_init(&c->bio_write, 1, offsetof(struct bch_write_bio, bio),
-                       BIOSET_NEED_BVECS))
+       if (bioset_init(&c->bio_write,   1, offsetof(struct bch_write_bio, bio), BIOSET_NEED_BVECS) ||
+           bioset_init(&c->replica_set, 4, offsetof(struct bch_write_bio, bio), 0))
                return -BCH_ERR_ENOMEM_bio_write_init;
 
        if (mempool_init_page_pool(&c->bio_bounce_pages,
index ed135166ab86e20ce0f4df5e51f93279e95f5a98..294a9d35a9f251629299672b97af4189b15fe72c 100644 (file)
@@ -1193,7 +1193,6 @@ static void bch2_dev_free(struct bch_dev *ca)
        bch2_dev_journal_exit(ca);
 
        free_percpu(ca->io_done);
-       bioset_exit(&ca->replica_set);
        bch2_dev_buckets_free(ca);
        free_page((unsigned long) ca->sb_read_scratch);
 
@@ -1317,8 +1316,6 @@ static struct bch_dev *__bch2_dev_alloc(struct bch_fs *c,
                            PERCPU_REF_INIT_DEAD, GFP_KERNEL) ||
            !(ca->sb_read_scratch = (void *) __get_free_page(GFP_KERNEL)) ||
            bch2_dev_buckets_alloc(c, ca) ||
-           bioset_init(&ca->replica_set, 4,
-                       offsetof(struct bch_write_bio, bio), 0) ||
            !(ca->io_done       = alloc_percpu(*ca->io_done)))
                goto err;