]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: improved bkey_val_copy()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 10 Oct 2024 01:26:05 +0000 (21:26 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:15 +0000 (01:36 -0500)
Factor out some common code, add typechecking.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.h

index 550db3654f2cc3c8fea1b05ba77948b308245caa..dda07a3204880abf80029f5540654f4922e3b24a 100644 (file)
@@ -594,13 +594,18 @@ static inline struct bkey_s_c bch2_bkey_get_iter(struct btree_trans *trans,
        bkey_s_c_to_##_type(__bch2_bkey_get_iter(_trans, _iter,                 \
                                       _btree_id, _pos, _flags, KEY_TYPE_##_type))
 
+static inline void __bkey_val_copy(void *dst_v, unsigned dst_size, struct bkey_s_c src_k)
+{
+       unsigned b = min_t(unsigned, dst_size, bkey_val_bytes(src_k.k));
+       memcpy(dst_v, src_k.v, b);
+       if (unlikely(b < dst_size))
+               memset(dst_v + b, 0, dst_size - b);
+}
+
 #define bkey_val_copy(_dst_v, _src_k)                                  \
 do {                                                                   \
-       unsigned b = min_t(unsigned, sizeof(*_dst_v),                   \
-                          bkey_val_bytes(_src_k.k));                   \
-       memcpy(_dst_v, _src_k.v, b);                                    \
-       if (b < sizeof(*_dst_v))                                        \
-               memset((void *) (_dst_v) + b, 0, sizeof(*_dst_v) - b);  \
+       BUILD_BUG_ON(!__typecheck(*_dst_v, *_src_k.v));                 \
+       __bkey_val_copy(_dst_v, sizeof(*_dst_v), _src_k.s_c);           \
 } while (0)
 
 static inline int __bch2_bkey_get_val_typed(struct btree_trans *trans,
@@ -609,17 +614,10 @@ static inline int __bch2_bkey_get_val_typed(struct btree_trans *trans,
                                unsigned val_size, void *val)
 {
        struct btree_iter iter;
-       struct bkey_s_c k;
-       int ret;
-
-       k = __bch2_bkey_get_iter(trans, &iter, btree_id, pos, flags, type);
-       ret = bkey_err(k);
+       struct bkey_s_c k = __bch2_bkey_get_iter(trans, &iter, btree_id, pos, flags, type);
+       int ret = bkey_err(k);
        if (!ret) {
-               unsigned b = min_t(unsigned, bkey_val_bytes(k.k), val_size);
-
-               memcpy(val, k.v, b);
-               if (unlikely(b < sizeof(*val)))
-                       memset((void *) val + b, 0, sizeof(*val) - b);
+               __bkey_val_copy(val, val_size, k);
                bch2_trans_iter_exit(trans, &iter);
        }