mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 11:18:52 +03:00
Assert that a dnode's bonuslen never exceeds its recorded size
This patch introduces an assertion that can catch pitfalls in development where there is a mismatch between the size of reads and writes between a *_phys structure and its respective in-core structure when bonus buffers are used. This debugging-aid should be complementary to the verification done by ztest in ztest_verify_dnode_bt(). A side to this patch is that we now clear out any extra bytes past a bonus buffer's new size when the buffer is shrinking. Reviewed-by: Matt Ahrens <matt@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tom Caputi <tcaputi@datto.com> Signed-off-by: Serapheim Dimitropoulos <serapheim@delphix.com> Closes #8348
This commit is contained in:
committed by
Brian Behlendorf
parent
e2b31b58e8
commit
0e37a0f4f3
@@ -390,6 +390,14 @@ dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx)
|
||||
rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
|
||||
ASSERT3U(newsize, <=, DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots) -
|
||||
(dn->dn_nblkptr-1) * sizeof (blkptr_t));
|
||||
|
||||
if (newsize < dn->dn_bonuslen) {
|
||||
/* clear any data after the end of the new size */
|
||||
size_t diff = dn->dn_bonuslen - newsize;
|
||||
char *data_end = ((char *)dn->dn_bonus->db.db_data) + newsize;
|
||||
bzero(data_end, diff);
|
||||
}
|
||||
|
||||
dn->dn_bonuslen = newsize;
|
||||
if (newsize == 0)
|
||||
dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = DN_ZERO_BONUSLEN;
|
||||
|
||||
Reference in New Issue
Block a user