aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorAlexander Motin <[email protected]>2024-05-09 10:39:57 -0400
committerBrian Behlendorf <[email protected]>2024-05-29 08:54:19 -0700
commit4c484d66b7f8fe595fdb89d91797e3e8fa686dab (patch)
tree1f6c85cf96e356095d3ed11faa04f42fa61d1fb5 /module
parent41f2a9c81f6151cd01fc455f13b8330aa72718a6 (diff)
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 <[email protected]> Reviewed-by: Brian Atkinson <[email protected]> Signed-off-by: Alexander Motin <[email protected]> Sponsored by: iXsystems, Inc. Closes #16165
Diffstat (limited to 'module')
-rw-r--r--module/zfs/zfs_log.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/module/zfs/zfs_log.c b/module/zfs/zfs_log.c
index 50325907b..006b91198 100644
--- a/module/zfs/zfs_log.c
+++ b/module/zfs/zfs_log.c
@@ -903,7 +903,7 @@ zfs_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype, znode_t *zp,
itx_t *itx;
lr_clone_range_t *lr;
uint64_t partlen, max_log_data;
- size_t i, partnbps;
+ size_t partnbps;
if (zil_replaying(zilog, tx) || zp->z_unlinked)
return;
@@ -912,10 +912,8 @@ zfs_log_clone_range(zilog_t *zilog, dmu_tx_t *tx, int txtype, znode_t *zp,
while (nbps > 0) {
partnbps = MIN(nbps, max_log_data / sizeof (bps[0]));
- partlen = 0;
- for (i = 0; i < partnbps; i++) {
- partlen += BP_GET_LSIZE(&bps[i]);
- }
+ partlen = partnbps * blksz;
+ ASSERT3U(partlen, <, len + blksz);
partlen = MIN(partlen, len);
itx = zil_itx_create(txtype,