Skip to content

Commit ac10a96

Browse files
koverstreetKent Overstreet
authored andcommitted
bcachefs: Some fixes for building in userspace
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>
1 parent b564513 commit ac10a96

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

fs/bcachefs/bset.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1672,7 +1672,7 @@ struct bkey_packed *bch2_btree_node_iter_prev_filter(struct btree_node_iter *ite
16721672
struct bkey_packed *orig_pos = bch2_btree_node_iter_peek_all(iter, b);
16731673
struct btree_node_iter_set *set;
16741674
struct bset_tree *t;
1675-
unsigned end;
1675+
unsigned end = 0;
16761676

16771677
bch2_btree_node_iter_verify(iter, b);
16781678

fs/bcachefs/btree_io.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1881,7 +1881,8 @@ void __bch2_btree_node_write(struct bch_fs *c, struct btree *b,
18811881

18821882
trace_btree_write(b, bytes_to_write, sectors_to_write);
18831883

1884-
wbio = container_of(bio_alloc_bioset(NULL, 1 << order,
1884+
wbio = container_of(bio_alloc_bioset(NULL,
1885+
buf_pages(data, sectors_to_write << 9),
18851886
REQ_OP_WRITE|REQ_META|REQ_FUA,
18861887
GFP_NOIO,
18871888
&c->btree_bio),

fs/bcachefs/journal_io.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,6 @@ static int journal_read_bucket(struct bch_dev *ca,
429429
{
430430
struct bch_fs *c = ca->fs;
431431
struct journal_device *ja = &ca->journal;
432-
struct bio *bio = ja->bio;
433432
struct jset *j = NULL;
434433
unsigned sectors, sectors_read = 0;
435434
u64 offset = bucket_to_sector(ca, ja->buckets[bucket]),
@@ -441,15 +440,22 @@ static int journal_read_bucket(struct bch_dev *ca,
441440

442441
while (offset < end) {
443442
if (!sectors_read) {
444-
reread: sectors_read = min_t(unsigned,
443+
struct bio *bio;
444+
unsigned nr_bvecs;
445+
reread:
446+
sectors_read = min_t(unsigned,
445447
end - offset, buf->size >> 9);
448+
nr_bvecs = buf_pages(buf->data, sectors_read << 9);
449+
450+
bio = bio_kmalloc(nr_bvecs, GFP_KERNEL);
451+
bio_init(bio, ca->disk_sb.bdev, bio->bi_inline_vecs, nr_bvecs, REQ_OP_READ);
446452

447-
bio_reset(bio, ca->disk_sb.bdev, REQ_OP_READ);
448453
bio->bi_iter.bi_sector = offset;
449454
bio->bi_iter.bi_size = sectors_read << 9;
450455
bch2_bio_map(bio, buf->data);
451456

452457
ret = submit_bio_wait(bio);
458+
kfree(bio);
453459

454460
if (bch2_dev_io_err_on(ret, ca,
455461
"journal read from sector %llu",

0 commit comments

Comments
 (0)