bcachefs: Fix for sb buffer being misaligned

On old kernels, kmalloc() may return an allocation that's not naturally
aligned - this resulted in a bug where we allocated a bio with not
enough biovecs. Fix this by using buf_pages().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2023-08-07 20:44:56 -04:00
parent c4e382e234
commit 6fe893eade

View File

@ -203,8 +203,14 @@ int bch2_sb_realloc(struct bch_sb_handle *sb, unsigned u64s)
if (dynamic_fault("bcachefs:add:super_realloc")) if (dynamic_fault("bcachefs:add:super_realloc"))
return -BCH_ERR_ENOMEM_sb_realloc_injected; return -BCH_ERR_ENOMEM_sb_realloc_injected;
new_sb = krealloc(sb->sb, new_buffer_size, GFP_NOFS|__GFP_ZERO);
if (!new_sb)
return -BCH_ERR_ENOMEM_sb_buf_realloc;
sb->sb = new_sb;
if (sb->have_bio) { if (sb->have_bio) {
unsigned nr_bvecs = DIV_ROUND_UP(new_buffer_size, PAGE_SIZE); unsigned nr_bvecs = buf_pages(sb->sb, new_buffer_size);
bio = bio_kmalloc(nr_bvecs, GFP_KERNEL); bio = bio_kmalloc(nr_bvecs, GFP_KERNEL);
if (!bio) if (!bio)
@ -216,11 +222,6 @@ int bch2_sb_realloc(struct bch_sb_handle *sb, unsigned u64s)
sb->bio = bio; sb->bio = bio;
} }
new_sb = krealloc(sb->sb, new_buffer_size, GFP_NOFS|__GFP_ZERO);
if (!new_sb)
return -BCH_ERR_ENOMEM_sb_buf_realloc;
sb->sb = new_sb;
sb->buffer_size = new_buffer_size; sb->buffer_size = new_buffer_size;
return 0; return 0;