diff options
author | Alexander Motin <[email protected]> | 2024-05-09 10:39:57 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2024-05-29 08:54:19 -0700 |
commit | 4c484d66b7f8fe595fdb89d91797e3e8fa686dab (patch) | |
tree | 1f6c85cf96e356095d3ed11faa04f42fa61d1fb5 /module | |
parent | 41f2a9c81f6151cd01fc455f13b8330aa72718a6 (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.c | 8 |
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, |