diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-11-30 00:24:20 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-04-29 13:44:32 -0400 |
commit | 196ca030a203da22ff3af1dec0ba9921dff08bbc (patch) | |
tree | bc61ee8d6700b00d6dfb1b7046570f5ea2fbab53 | |
parent | 9679ee9be1109c4bb7b3b282a4c6c13b3460698e (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.h | 5 | ||||
-rw-r--r-- | fs/bcachefs/io_write.c | 12 |
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, |