68 lines
2.3 KiB
Diff
68 lines
2.3 KiB
Diff
From 703b8d61ec2cef306f5379847adc089069333897 Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Wed, 9 Oct 2024 21:26:05 -0400
|
|
Subject: [PATCH 022/233] bcachefs: improved bkey_val_copy()
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Factor out some common code, add typechecking.
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/btree_iter.h | 28 +++++++++++++---------------
|
|
1 file changed, 13 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h
|
|
index 550db3654f2c..dda07a320488 100644
|
|
--- a/fs/bcachefs/btree_iter.h
|
|
+++ b/fs/bcachefs/btree_iter.h
|
|
@@ -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);
|
|
}
|
|
|
|
--
|
|
2.45.2
|
|
|