Fix ZIL clone records for legacy holes

Previous code overengineered cloned range calculation by using
BP_GET_LSIZE(). The problem is that legacy holes don't have the
logical size, so result will be wrong.  But we also don't need
to look on every block size, since they all must be identical.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes #16165
This commit is contained in:
Alexander Motin 2024-05-09 10:39:57 -04:00 committed by GitHub
parent af5dbed319
commit 3400127a75
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 3 additions and 5 deletions

View File

@ -895,7 +895,7 @@ zfs_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype, znode_t *zp,
itx_t *itx; itx_t *itx;
lr_clone_range_t *lr; lr_clone_range_t *lr;
uint64_t partlen, max_log_data; uint64_t partlen, max_log_data;
size_t i, partnbps; size_t partnbps;
if (zil_replaying(zilog, tx) || zp->z_unlinked) if (zil_replaying(zilog, tx) || zp->z_unlinked)
return; return;
@ -904,10 +904,8 @@ zfs_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype, znode_t *zp,
while (nbps > 0) { while (nbps > 0) {
partnbps = MIN(nbps, max_log_data / sizeof (bps[0])); partnbps = MIN(nbps, max_log_data / sizeof (bps[0]));
partlen = 0; partlen = partnbps * blksz;
for (i = 0; i < partnbps; i++) { ASSERT3U(partlen, <, len + blksz);
partlen += BP_GET_LSIZE(&bps[i]);
}
partlen = MIN(partlen, len); partlen = MIN(partlen, len);
itx = zil_itx_create(txtype, itx = zil_itx_create(txtype,