Commit 6fe893ea authored by Kent Overstreet's avatar Kent Overstreet
Browse files

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: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent c4e382e2
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -203,8 +203,14 @@ int bch2_sb_realloc(struct bch_sb_handle *sb, unsigned u64s)
	if (dynamic_fault("bcachefs:add:super_realloc"))
		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) {
		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);
		if (!bio)
@@ -216,11 +222,6 @@ int bch2_sb_realloc(struct bch_sb_handle *sb, unsigned u64s)
		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;

	return 0;