bcachefs: Fix for sb buffer being misaligned
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 8 Aug 2023 00:44:56 +0000 (20:44 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:10 +0000 (17:10 -0400)
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>
fs/bcachefs/super-io.c

index beb00f799fe4a4fefb0d3fedfedc6ed626b4adab..a58b9750b6cee2b41aeaf40e6a6c2789783d1270 100644 (file)
@@ -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;