bcachefs: Some fixes for building in userspace
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 4 Nov 2018 00:04:54 +0000 (20:04 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:10 +0000 (17:08 -0400)
userspace allocators don't align allocations as nicely as kernel
allocators, which meant that in some cases we weren't allocating big
enough bvec arrays - just make the calculations more rigorous and
explicit to fix it.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bset.c
fs/bcachefs/btree_io.c
fs/bcachefs/journal_io.c

index 74d8871528a674c9c73e4f121453bfdabf68da6c..7fc8fb85069fba4e8e22138d770c18b3a12ab919 100644 (file)
@@ -1672,7 +1672,7 @@ struct bkey_packed *bch2_btree_node_iter_prev_filter(struct btree_node_iter *ite
        struct bkey_packed *orig_pos = bch2_btree_node_iter_peek_all(iter, b);
        struct btree_node_iter_set *set;
        struct bset_tree *t;
-       unsigned end;
+       unsigned end = 0;
 
        bch2_btree_node_iter_verify(iter, b);
 
index c8809a59a765912323ff341772c7886964280dc9..1036b72f1ae626cfec676305d1fe1f665e38eb99 100644 (file)
@@ -1881,7 +1881,8 @@ void __bch2_btree_node_write(struct bch_fs *c, struct btree *b,
 
        trace_btree_write(b, bytes_to_write, sectors_to_write);
 
-       wbio = container_of(bio_alloc_bioset(NULL, 1 << order,
+       wbio = container_of(bio_alloc_bioset(NULL,
+                               buf_pages(data, sectors_to_write << 9),
                                REQ_OP_WRITE|REQ_META|REQ_FUA,
                                GFP_NOIO,
                                &c->btree_bio),
index 3dc24b39022f8278733711d4f76f83c08a682759..0bcc4346285cf2f9fa9512142f814bab75f9b12c 100644 (file)
@@ -429,7 +429,6 @@ static int journal_read_bucket(struct bch_dev *ca,
 {
        struct bch_fs *c = ca->fs;
        struct journal_device *ja = &ca->journal;
-       struct bio *bio = ja->bio;
        struct jset *j = NULL;
        unsigned sectors, sectors_read = 0;
        u64 offset = bucket_to_sector(ca, ja->buckets[bucket]),
@@ -441,15 +440,22 @@ static int journal_read_bucket(struct bch_dev *ca,
 
        while (offset < end) {
                if (!sectors_read) {
-reread:                        sectors_read = min_t(unsigned,
+                       struct bio *bio;
+                       unsigned nr_bvecs;
+reread:
+                       sectors_read = min_t(unsigned,
                                end - offset, buf->size >> 9);
+                       nr_bvecs = buf_pages(buf->data, sectors_read << 9);
+
+                       bio = bio_kmalloc(nr_bvecs, GFP_KERNEL);
+                       bio_init(bio, ca->disk_sb.bdev, bio->bi_inline_vecs, nr_bvecs, REQ_OP_READ);
 
-                       bio_reset(bio, ca->disk_sb.bdev, REQ_OP_READ);
                        bio->bi_iter.bi_sector  = offset;
                        bio->bi_iter.bi_size    = sectors_read << 9;
                        bch2_bio_map(bio, buf->data);
 
                        ret = submit_bio_wait(bio);
+                       kfree(bio);
 
                        if (bch2_dev_io_err_on(ret, ca,
                                               "journal read from sector %llu",