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>2024-06-13 16:42:43 -0400
commit70a23495459d504798ae8ea7c70e069a918fa939 (patch)
treed0916111664e6361d79d4eacb09f2158ed591bdc
parentf1eeb83f78f46f433f6ab9cf5872cc783a34d26f (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.c13
2 files changed, 15 insertions, 3 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 e1f51f5c48da..af699c40cc05 100644
--- a/fs/bcachefs/io_write.c
+++ b/fs/bcachefs/io_write.c
@@ -689,7 +689,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;
@@ -733,8 +733,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,
@@ -948,7 +956,6 @@ static int bch2_write_extent(struct bch_write_op *op, struct write_point *wp,
case PREP_ENCODED_CHECKSUM_ERR:
goto csum_err;
case PREP_ENCODED_DO_WRITE:
- /* XXX look for bug here */
if (ec_buf) {
dst = bch2_write_bio_alloc(c, wp, src,
&page_alloc_failed,