From: Kent Overstreet Date: Tue, 25 Mar 2025 15:40:35 +0000 (-0400) Subject: bcachefs: Fix nonce inconsistency in bch2_write_prep_encoded_data() X-Git-Tag: v6.15-rc1~83^2~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5af61dbd96275e184adcfe615507b0f04ed7b328;p=thirdparty%2Fkernel%2Flinux.git bcachefs: Fix nonce inconsistency in bch2_write_prep_encoded_data() If we're moving an extent that was partially overwritten, bch2_write_rechecksum() will trim it to the currenty live range. If we then also want to compress it, it'll be decrypted - but the nonce has been advanced for the overwritten start of the extent that we dropped, and we were using the nonce we calculated before rechecksum(). Reported-by: Gabriel de Perthuis Fixes: 127d90d2823e ("bcachefs: bch2_write_prep_encoded_data() now returns errcode") Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/io_write.c b/fs/bcachefs/io_write.c index 29671075e3f1d..14c5c5c98d51d 100644 --- a/fs/bcachefs/io_write.c +++ b/fs/bcachefs/io_write.c @@ -839,7 +839,6 @@ static noinline int bch2_write_prep_encoded_data(struct bch_write_op *op, struct { struct bch_fs *c = op->c; struct bio *bio = &op->wbio.bio; - struct nonce nonce = extent_nonce(op->version, op->crc); int ret = 0; BUG_ON(bio_sectors(bio) != op->crc.compressed_size); @@ -866,6 +865,7 @@ static noinline int bch2_write_prep_encoded_data(struct bch_write_op *op, struct */ if (crc_is_compressed(op->crc)) { /* Last point we can still verify checksum: */ + struct nonce nonce = extent_nonce(op->version, op->crc); struct bch_csum csum = bch2_checksum_bio(c, op->crc.csum_type, nonce, bio); if (bch2_crc_cmp(op->crc.csum, csum) && !c->opts.no_data_io) goto csum_err; @@ -905,6 +905,7 @@ static noinline int bch2_write_prep_encoded_data(struct bch_write_op *op, struct */ if (bch2_csum_type_is_encryption(op->crc.csum_type) && (op->compression_opt || op->crc.csum_type != op->csum_type)) { + struct nonce nonce = extent_nonce(op->version, op->crc); struct bch_csum csum = bch2_checksum_bio(c, op->crc.csum_type, nonce, bio); if (bch2_crc_cmp(op->crc.csum, csum) && !c->opts.no_data_io) goto csum_err;