summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-11-30 00:24:20 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2025-04-29 13:44:32 -0400
commit196ca030a203da22ff3af1dec0ba9921dff08bbc (patch)
treebc61ee8d6700b00d6dfb1b7046570f5ea2fbab53
parent9679ee9be1109c4bb7b3b282a4c6c13b3460698e (diff)
bcachefs: extent_block_checksums
todo: - nonces? - alignment - extent merging - need a better bch2_checksum_merge() Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/extent_block_checksums.h5
-rw-r--r--fs/bcachefs/io_write.c12
2 files changed, 15 insertions, 2 deletions
diff --git a/fs/bcachefs/extent_block_checksums.h b/fs/bcachefs/extent_block_checksums.h
index 4cd3f0a40c2f..8c46ca0749a6 100644
--- a/fs/bcachefs/extent_block_checksums.h
+++ b/fs/bcachefs/extent_block_checksums.h
@@ -9,6 +9,11 @@ static inline unsigned extent_block_checksums_nr_crcs(struct bkey_s_c_extent_blo
return (e.k->size + e.v->front_pad + e.v->back_pad) >> e.v->csum_blocksize_bits;
}
+static inline void *extent_block_checksums_crc(struct bkey_s_extent_block_checksums e, unsigned idx)
+{
+ return (void *) &e.v->ptrs[e.v->nr_ptrs] + idx * bch_crc_bytes[e.v->csum_type];
+}
+
static inline unsigned extent_block_checksums_crc_bytes(struct bkey_s_c_extent_block_checksums e)
{
return round_up(extent_block_checksums_nr_crcs(e) * bch_crc_bytes[e.v->csum_type], sizeof(u64));
diff --git a/fs/bcachefs/io_write.c b/fs/bcachefs/io_write.c
index 00648efb6a5c..7561e730737b 100644
--- a/fs/bcachefs/io_write.c
+++ b/fs/bcachefs/io_write.c
@@ -779,7 +779,7 @@ static void bch2_write_endio(struct bio *bio)
static inline bool use_block_checksums(struct bch_write_op *op,
struct bch_extent_crc_unpacked crc)
{
- if (!crc.csum_type &&
+ if (!crc.csum_type ||
crc.compression_type ||
!op->opts.checksum_blocksize)
return false;
@@ -824,8 +824,16 @@ static void init_append_extent(struct bch_write_op *op,
e->v.csum_blocksize_bits = ilog2(op->opts.checksum_blocksize >> 9);
e->v.nr_ptrs = wp->ptrs.nr;
+ struct bkey_s_extent_block_checksums e_s = extent_block_checksums_i_to_s(e);
+
+ unsigned nr_crcs = extent_block_checksums_nr_crcs(e_s.c);
+ for (unsigned i = 0; i < nr_crcs; i++) {
+ void *crc = extent_block_checksums_crc(e_s, i);
+
+ }
+
ptrs = e->v.ptrs;
- set_bkey_val_u64s(&e->k, extent_block_checksums_val_u64s(extent_block_checksums_i_to_s_c(e)));
+ set_bkey_val_u64s(&e->k, extent_block_checksums_val_u64s(e_s.c));
}
bch2_alloc_sectors_append_ptrs_inlined(op->c, wp, crc.compressed_size,