{
        unsigned idx = 0;
        void *d = dst->v.data;
+       unsigned bytes;
 
        dst->v.fields   = 0;
        dst->v.gen      = src.gen;
        BCH_ALLOC_FIELDS()
 #undef  x
 
-       set_bkey_val_bytes(&dst->k, (void *) d - (void *) &dst->v);
+       bytes = (void *) d - (void *) &dst->v;
+       set_bkey_val_bytes(&dst->k, bytes);
+       memset_u64s_tail(&dst->v, 0, bytes);
 }
 
 static unsigned bch_alloc_val_u64s(const struct bch_alloc *a)
 
        u8 *end = (void *) &packed[1];
        u8 *last_nonzero_field = out;
        unsigned nr_fields = 0, last_nonzero_fieldnr = 0;
+       unsigned bytes;
 
        bkey_inode_init(&packed->inode.k_i);
        packed->inode.k.p.inode         = inode->bi_inum;
        out = last_nonzero_field;
        nr_fields = last_nonzero_fieldnr;
 
-       set_bkey_val_bytes(&packed->inode.k, out - (u8 *) &packed->inode.v);
-       memset(out, 0,
-              (u8 *) &packed->inode.v +
-              bkey_val_bytes(&packed->inode.k) - out);
+       bytes = out - (u8 *) &packed->inode.v;
+       set_bkey_val_bytes(&packed->inode.k, bytes);
+       memset_u64s_tail(&packed->inode.v, 0, bytes);
 
        SET_INODE_NR_FIELDS(&packed->inode.v, nr_fields);
 
 
                __memmove_u64s_up(dst, src, u64s);
 }
 
+/* Set the last few bytes up to a u64 boundary given an offset into a buffer. */
+static inline void memset_u64s_tail(void *s, int c, unsigned bytes)
+{
+       unsigned rem = round_up(bytes, sizeof(u64)) - bytes;
+
+       memset(s + bytes, c, rem);
+}
+
 void sort_cmp_size(void *base, size_t num, size_t size,
          int (*cmp_func)(const void *, const void *, size_t),
          void (*swap_func)(void *, void *, size_t));