Add missing dmu_zfetch_fini() in dnode_move_impl()
As it turns out, on the Windows platform when rw_init() is called (rather its bedrock call ExInitializeResourceLite) it is placed on an active-list of locks, and is removed at rw_destroy() time. dnode_move() has logic to copy over the old-dnode to new-dnode, including calling dmu_zfetch_init(new-dnode). But due to the missing dmu_zfetch_fini(old-dnode), kmem will call dnode_dest() to release the memory (and in debug builds fill pattern 0xdeadbeef) over the Windows active-lock's prev/next list pointers, making Windows sad. But on other platforms, the contents of dmu_zfetch_fini() is one call to list_destroy() and one to rw_destroy(), which is effectively a no-op call and is not required. This commit is mostly for "correctness" and can be skipped there. Porting Notes: * This leak exists on Linux but currently can never happen because the dnode_move() functionality is not supported. openzfsonosx-commit: openzfsonosx/zfs@d95fe517 Authored by: Julian Heuking <JulianH@beckhoff.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Matt Ahrens <mahrens@delphix.com> Signed-off-by: Jorgen Lundman <lundman@lundman.net> Closes #8519
This commit is contained in:
parent
73c25a78e6
commit
304d469dcd
@ -840,7 +840,7 @@ dnode_move_impl(dnode_t *odn, dnode_t *ndn)
|
||||
offsetof(dmu_buf_impl_t, db_link));
|
||||
odn->dn_dbufs_count = 0;
|
||||
odn->dn_bonus = NULL;
|
||||
odn->dn_zfetch.zf_dnode = NULL;
|
||||
dmu_zfetch_fini(&odn->dn_zfetch);
|
||||
|
||||
/*
|
||||
* Set the low bit of the objset pointer to ensure that dnode_move()
|
||||
|
Loading…
Reference in New Issue
Block a user