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:
parent
41f2a9c81f
commit
4c484d66b7
|
@ -903,7 +903,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;
|
||||||
|
@ -912,10 +912,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,
|
||||||
|
|
Loading…
Reference in New Issue