bcachefs: Fix assert in bch2_alloc_v4_invalid()
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 6 May 2024 02:02:28 +0000 (22:02 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 6 May 2024 14:58:17 +0000 (10:58 -0400)
Reported-by: syzbot+10827fa6b176e1acf1d0@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/alloc_background.h

index 4ff56fa4d539201e648f28a9225e9d71a59907f0..534ba2b02bd6527fa3f05665c88b8335c351bab3 100644 (file)
@@ -244,10 +244,10 @@ int bch2_alloc_v4_invalid(struct bch_fs *c, struct bkey_s_c k,
        struct bkey_s_c_alloc_v4 a = bkey_s_c_to_alloc_v4(k);
        int ret = 0;
 
-       bkey_fsck_err_on(alloc_v4_u64s(a.v) > bkey_val_u64s(k.k), c, err,
+       bkey_fsck_err_on(alloc_v4_u64s_noerror(a.v) > bkey_val_u64s(k.k), c, err,
                         alloc_v4_val_size_bad,
                         "bad val size (%u > %zu)",
-                        alloc_v4_u64s(a.v), bkey_val_u64s(k.k));
+                        alloc_v4_u64s_noerror(a.v), bkey_val_u64s(k.k));
 
        bkey_fsck_err_on(!BCH_ALLOC_V4_BACKPOINTERS_START(a.v) &&
                         BCH_ALLOC_V4_NR_BACKPOINTERS(a.v), c, err,
index 052b2fac25d693c7dddba5077fc9caeec2d246dd..2790e516383d59dccf7a75f0782abe797e1f51bc 100644 (file)
@@ -126,13 +126,17 @@ static inline struct bpos alloc_freespace_pos(struct bpos pos, struct bch_alloc_
        return pos;
 }
 
-static inline unsigned alloc_v4_u64s(const struct bch_alloc_v4 *a)
+static inline unsigned alloc_v4_u64s_noerror(const struct bch_alloc_v4 *a)
 {
-       unsigned ret = (BCH_ALLOC_V4_BACKPOINTERS_START(a) ?:
+       return (BCH_ALLOC_V4_BACKPOINTERS_START(a) ?:
                        BCH_ALLOC_V4_U64s_V0) +
                BCH_ALLOC_V4_NR_BACKPOINTERS(a) *
                (sizeof(struct bch_backpointer) / sizeof(u64));
+}
 
+static inline unsigned alloc_v4_u64s(const struct bch_alloc_v4 *a)
+{
+       unsigned ret = alloc_v4_u64s_noerror(a);
        BUG_ON(ret > U8_MAX - BKEY_U64s);
        return ret;
 }