Print this page
6267 dn_bonus evicted too early
Reviewed by: Richard Yao <ryao@gentoo.org>
Reviewed by: Xin LI <delphij@freebsd.org>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>


 665                             zfs_prop_to_name(ZFS_PROP_SYNC),
 666                             sync_changed_cb, os));
 667                         VERIFY0(dsl_prop_unregister(ds,
 668                             zfs_prop_to_name(ZFS_PROP_REDUNDANT_METADATA),
 669                             redundant_metadata_changed_cb, os));
 670                         VERIFY0(dsl_prop_unregister(ds,
 671                             zfs_prop_to_name(ZFS_PROP_RECORDSIZE),
 672                             recordsize_changed_cb, os));
 673                 }
 674                 VERIFY0(dsl_prop_unregister(ds,
 675                     zfs_prop_to_name(ZFS_PROP_PRIMARYCACHE),
 676                     primary_cache_changed_cb, os));
 677                 VERIFY0(dsl_prop_unregister(ds,
 678                     zfs_prop_to_name(ZFS_PROP_SECONDARYCACHE),
 679                     secondary_cache_changed_cb, os));
 680         }
 681 
 682         if (os->os_sa)
 683                 sa_tear_down(os);
 684 
 685         os->os_evicting = B_TRUE;
 686         dmu_objset_evict_dbufs(os);
 687 
 688         mutex_enter(&os->os_lock);
 689         spa_evicting_os_register(os->os_spa, os);
 690         if (list_is_empty(&os->os_dnodes)) {
 691                 mutex_exit(&os->os_lock);
 692                 dmu_objset_evict_done(os);
 693         } else {
 694                 mutex_exit(&os->os_lock);
 695         }
 696 }
 697 
 698 void
 699 dmu_objset_evict_done(objset_t *os)
 700 {
 701         ASSERT3P(list_head(&os->os_dnodes), ==, NULL);
 702 
 703         dnode_special_close(&os->os_meta_dnode);
 704         if (DMU_USERUSED_DNODE(os)) {
 705                 dnode_special_close(&os->os_userused_dnode);




 665                             zfs_prop_to_name(ZFS_PROP_SYNC),
 666                             sync_changed_cb, os));
 667                         VERIFY0(dsl_prop_unregister(ds,
 668                             zfs_prop_to_name(ZFS_PROP_REDUNDANT_METADATA),
 669                             redundant_metadata_changed_cb, os));
 670                         VERIFY0(dsl_prop_unregister(ds,
 671                             zfs_prop_to_name(ZFS_PROP_RECORDSIZE),
 672                             recordsize_changed_cb, os));
 673                 }
 674                 VERIFY0(dsl_prop_unregister(ds,
 675                     zfs_prop_to_name(ZFS_PROP_PRIMARYCACHE),
 676                     primary_cache_changed_cb, os));
 677                 VERIFY0(dsl_prop_unregister(ds,
 678                     zfs_prop_to_name(ZFS_PROP_SECONDARYCACHE),
 679                     secondary_cache_changed_cb, os));
 680         }
 681 
 682         if (os->os_sa)
 683                 sa_tear_down(os);
 684 

 685         dmu_objset_evict_dbufs(os);
 686 
 687         mutex_enter(&os->os_lock);
 688         spa_evicting_os_register(os->os_spa, os);
 689         if (list_is_empty(&os->os_dnodes)) {
 690                 mutex_exit(&os->os_lock);
 691                 dmu_objset_evict_done(os);
 692         } else {
 693                 mutex_exit(&os->os_lock);
 694         }
 695 }
 696 
 697 void
 698 dmu_objset_evict_done(objset_t *os)
 699 {
 700         ASSERT3P(list_head(&os->os_dnodes), ==, NULL);
 701 
 702         dnode_special_close(&os->os_meta_dnode);
 703         if (DMU_USERUSED_DNODE(os)) {
 704                 dnode_special_close(&os->os_userused_dnode);