Fix false assertion in dmu_tx_dirty_buf() on cloning

Same as writes block cloning can increase block size and number of
indirection levels.  That means it can dirty block 0 at level 0 or
at new top indirection level without explicitly holding them.

A block cloning test case for large offsets has been added.

Reviewed-by: Rob Norris <robn@despairlabs.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Co-authored-by: Ameer Hamza <ahamza@ixsystems.com>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes #16825
This commit is contained in:
Alexander Motin
2024-12-05 14:48:08 -05:00
committed by GitHub
parent 44446dccdb
commit e8b333e4d3
5 changed files with 95 additions and 1 deletions
+8
View File
@@ -800,6 +800,14 @@ dmu_tx_dirty_buf(dmu_tx_t *tx, dmu_buf_impl_t *db)
case THT_CLONE:
if (blkid >= beginblk && blkid <= endblk)
match_offset = TRUE;
/*
* They might have to increase nlevels,
* thus dirtying the new TLIBs. Or the
* might have to change the block size,
* thus dirying the new lvl=0 blk=0.
*/
if (blkid == 0)
match_offset = TRUE;
break;
default:
cmn_err(CE_PANIC, "bad txh_type %d",