From 304d469dcdcb47a6c4e993a62007a8b7c81a212a Mon Sep 17 00:00:00 2001 From: Julian Heuking Date: Fri, 30 Nov 2018 11:20:44 +0900 Subject: [PATCH] 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 Reviewed-by: Brian Behlendorf Reviewed-by: Matt Ahrens Signed-off-by: Jorgen Lundman Closes #8519 --- module/zfs/dnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/zfs/dnode.c b/module/zfs/dnode.c index 35aefa7cb..2903bc78d 100644 --- a/module/zfs/dnode.c +++ b/module/zfs/dnode.c @@ -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() -- 2.40.0