Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
 
 #define bkey_next(_k)          vstruct_next(_k)
 
-static inline unsigned bkey_val_u64s(const struct bkey *k)
-{
-       return k->u64s - BKEY_U64s;
-}
+#define bkey_val_u64s(_k)      ((_k)->u64s - BKEY_U64s)
 
 static inline size_t bkey_val_bytes(const struct bkey *k)
 {
 
 
        EBUG_ON(bkey_written(b, m));
 
+       if (bkey_val_u64s(l) > BKEY_EXTENT_VAL_U64s_MAX ||
+           bkey_val_u64s(r) > BKEY_EXTENT_VAL_U64s_MAX)
+               return BCH_MERGE_NOMERGE;
+
        /*
         * We need to save copies of both l and r, because we might get a
         * partial merge (which modifies both) and then fails to repack