diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-11-30 00:24:20 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-06-13 16:42:43 -0400 |
commit | 70a23495459d504798ae8ea7c70e069a918fa939 (patch) | |
tree | d0916111664e6361d79d4eacb09f2158ed591bdc | |
parent | f1eeb83f78f46f433f6ab9cf5872cc783a34d26f (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 | 13 |
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, |