MFV r254071:
Fix a regression introduced by fix for Illumos bug #3834. Quote from Matthew Ahrens on the Illumos issue: ztest fails this assertion because ztest_dmu_read_write() does dmu_tx_hold_free(tx, bigobj, bigoff, bigsize); and then dmu_object_set_checksum(os, bigobj, (enum zio_checksum)ztest_random_dsl_prop(ZFS_PROP_CHECKSUM), tx); If the region to free is past the end of the file, the DMU assumes that there will be nothing to do for this object. However, ztest does set_checksum(), which must modify the dnode. The fix is for ztest to also call dmu_tx_hold_bonus(tx, bigobj); so we can account for the dirty data associated with setting the checksum Illumos ZFS issues: 3955 ztest failure: assertion refcount_count(&tx->tx_space_written) + delta <= tx->tx_space_towrite
This commit is contained in:
parent
8897697280
commit
7291294314
@ -3607,6 +3607,9 @@ ztest_dmu_read_write(ztest_ds_t *zd, uint64_t id)
|
||||
else
|
||||
dmu_tx_hold_write(tx, bigobj, bigoff, bigsize);
|
||||
|
||||
/* This accounts for setting the checksum/compression. */
|
||||
dmu_tx_hold_bonus(tx, bigobj);
|
||||
|
||||
txg = ztest_tx_assign(tx, TXG_MIGHTWAIT, FTAG);
|
||||
if (txg == 0) {
|
||||
umem_free(packbuf, packsize);
|
||||
|
@ -448,12 +448,12 @@ dmu_tx_count_free(dmu_tx_hold_t *txh, uint64_t off, uint64_t len)
|
||||
blkid = off >> dn->dn_datablkshift;
|
||||
nblks = (len + dn->dn_datablksz - 1) >> dn->dn_datablkshift;
|
||||
|
||||
if (blkid >= dn->dn_maxblkid) {
|
||||
if (blkid > dn->dn_maxblkid) {
|
||||
rw_exit(&dn->dn_struct_rwlock);
|
||||
return;
|
||||
}
|
||||
if (blkid + nblks > dn->dn_maxblkid)
|
||||
nblks = dn->dn_maxblkid - blkid;
|
||||
nblks = dn->dn_maxblkid - blkid + 1;
|
||||
|
||||
}
|
||||
l0span = nblks; /* save for later use to calc level > 1 overhead */
|
||||
|
Loading…
Reference in New Issue
Block a user