]> granicus.if.org Git - zfs/commitdiff
Add missing dmu_zfetch_fini() in dnode_move_impl()
authorJulian Heuking <JulianH@beckhoff.com>
Fri, 30 Nov 2018 02:20:44 +0000 (11:20 +0900)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 20 Mar 2019 22:06:55 +0000 (15:06 -0700)
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

module/zfs/dnode.c

index 35aefa7cb93e154388ebe57622d2e15cd4afdeee..2903bc78d8d0333d5d70225ea85eccf170cef009 100644 (file)
@@ -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()