The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/module/zfs/dnode.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * The contents of this file are subject to the terms of the
    5  * Common Development and Distribution License (the "License").
    6  * You may not use this file except in compliance with the License.
    7  *
    8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
    9  * or https://opensource.org/licenses/CDDL-1.0.
   10  * See the License for the specific language governing permissions
   11  * and limitations under the License.
   12  *
   13  * When distributing Covered Code, include this CDDL HEADER in each
   14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   15  * If applicable, add the following below this CDDL HEADER, with the
   16  * fields enclosed by brackets "[]" replaced with your own identifying
   17  * information: Portions Copyright [yyyy] [name of copyright owner]
   18  *
   19  * CDDL HEADER END
   20  */
   21 /*
   22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
   23  * Copyright (c) 2012, 2020 by Delphix. All rights reserved.
   24  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
   25  */
   26 
   27 #include <sys/zfs_context.h>
   28 #include <sys/dbuf.h>
   29 #include <sys/dnode.h>
   30 #include <sys/dmu.h>
   31 #include <sys/dmu_impl.h>
   32 #include <sys/dmu_tx.h>
   33 #include <sys/dmu_objset.h>
   34 #include <sys/dsl_dir.h>
   35 #include <sys/dsl_dataset.h>
   36 #include <sys/spa.h>
   37 #include <sys/zio.h>
   38 #include <sys/dmu_zfetch.h>
   39 #include <sys/range_tree.h>
   40 #include <sys/trace_zfs.h>
   41 #include <sys/zfs_project.h>
   42 
   43 dnode_stats_t dnode_stats = {
   44         { "dnode_hold_dbuf_hold",               KSTAT_DATA_UINT64 },
   45         { "dnode_hold_dbuf_read",               KSTAT_DATA_UINT64 },
   46         { "dnode_hold_alloc_hits",              KSTAT_DATA_UINT64 },
   47         { "dnode_hold_alloc_misses",            KSTAT_DATA_UINT64 },
   48         { "dnode_hold_alloc_interior",          KSTAT_DATA_UINT64 },
   49         { "dnode_hold_alloc_lock_retry",        KSTAT_DATA_UINT64 },
   50         { "dnode_hold_alloc_lock_misses",       KSTAT_DATA_UINT64 },
   51         { "dnode_hold_alloc_type_none",         KSTAT_DATA_UINT64 },
   52         { "dnode_hold_free_hits",               KSTAT_DATA_UINT64 },
   53         { "dnode_hold_free_misses",             KSTAT_DATA_UINT64 },
   54         { "dnode_hold_free_lock_misses",        KSTAT_DATA_UINT64 },
   55         { "dnode_hold_free_lock_retry",         KSTAT_DATA_UINT64 },
   56         { "dnode_hold_free_overflow",           KSTAT_DATA_UINT64 },
   57         { "dnode_hold_free_refcount",           KSTAT_DATA_UINT64 },
   58         { "dnode_free_interior_lock_retry",     KSTAT_DATA_UINT64 },
   59         { "dnode_allocate",                     KSTAT_DATA_UINT64 },
   60         { "dnode_reallocate",                   KSTAT_DATA_UINT64 },
   61         { "dnode_buf_evict",                    KSTAT_DATA_UINT64 },
   62         { "dnode_alloc_next_chunk",             KSTAT_DATA_UINT64 },
   63         { "dnode_alloc_race",                   KSTAT_DATA_UINT64 },
   64         { "dnode_alloc_next_block",             KSTAT_DATA_UINT64 },
   65         { "dnode_move_invalid",                 KSTAT_DATA_UINT64 },
   66         { "dnode_move_recheck1",                KSTAT_DATA_UINT64 },
   67         { "dnode_move_recheck2",                KSTAT_DATA_UINT64 },
   68         { "dnode_move_special",                 KSTAT_DATA_UINT64 },
   69         { "dnode_move_handle",                  KSTAT_DATA_UINT64 },
   70         { "dnode_move_rwlock",                  KSTAT_DATA_UINT64 },
   71         { "dnode_move_active",                  KSTAT_DATA_UINT64 },
   72 };
   73 
   74 dnode_sums_t dnode_sums;
   75 
   76 static kstat_t *dnode_ksp;
   77 static kmem_cache_t *dnode_cache;
   78 
   79 static dnode_phys_t dnode_phys_zero __maybe_unused;
   80 
   81 int zfs_default_bs = SPA_MINBLOCKSHIFT;
   82 int zfs_default_ibs = DN_MAX_INDBLKSHIFT;
   83 
   84 #ifdef  _KERNEL
   85 static kmem_cbrc_t dnode_move(void *, void *, size_t, void *);
   86 #endif /* _KERNEL */
   87 
   88 static int
   89 dbuf_compare(const void *x1, const void *x2)
   90 {
   91         const dmu_buf_impl_t *d1 = x1;
   92         const dmu_buf_impl_t *d2 = x2;
   93 
   94         int cmp = TREE_CMP(d1->db_level, d2->db_level);
   95         if (likely(cmp))
   96                 return (cmp);
   97 
   98         cmp = TREE_CMP(d1->db_blkid, d2->db_blkid);
   99         if (likely(cmp))
  100                 return (cmp);
  101 
  102         if (d1->db_state == DB_SEARCH) {
  103                 ASSERT3S(d2->db_state, !=, DB_SEARCH);
  104                 return (-1);
  105         } else if (d2->db_state == DB_SEARCH) {
  106                 ASSERT3S(d1->db_state, !=, DB_SEARCH);
  107                 return (1);
  108         }
  109 
  110         return (TREE_PCMP(d1, d2));
  111 }
  112 
  113 static int
  114 dnode_cons(void *arg, void *unused, int kmflag)
  115 {
  116         (void) unused, (void) kmflag;
  117         dnode_t *dn = arg;
  118 
  119         rw_init(&dn->dn_struct_rwlock, NULL, RW_NOLOCKDEP, NULL);
  120         mutex_init(&dn->dn_mtx, NULL, MUTEX_DEFAULT, NULL);
  121         mutex_init(&dn->dn_dbufs_mtx, NULL, MUTEX_DEFAULT, NULL);
  122         cv_init(&dn->dn_notxholds, NULL, CV_DEFAULT, NULL);
  123         cv_init(&dn->dn_nodnholds, NULL, CV_DEFAULT, NULL);
  124 
  125         /*
  126          * Every dbuf has a reference, and dropping a tracked reference is
  127          * O(number of references), so don't track dn_holds.
  128          */
  129         zfs_refcount_create_untracked(&dn->dn_holds);
  130         zfs_refcount_create(&dn->dn_tx_holds);
  131         list_link_init(&dn->dn_link);
  132 
  133         memset(dn->dn_next_type, 0, sizeof (dn->dn_next_type));
  134         memset(dn->dn_next_nblkptr, 0, sizeof (dn->dn_next_nblkptr));
  135         memset(dn->dn_next_nlevels, 0, sizeof (dn->dn_next_nlevels));
  136         memset(dn->dn_next_indblkshift, 0, sizeof (dn->dn_next_indblkshift));
  137         memset(dn->dn_next_bonustype, 0, sizeof (dn->dn_next_bonustype));
  138         memset(dn->dn_rm_spillblk, 0, sizeof (dn->dn_rm_spillblk));
  139         memset(dn->dn_next_bonuslen, 0, sizeof (dn->dn_next_bonuslen));
  140         memset(dn->dn_next_blksz, 0, sizeof (dn->dn_next_blksz));
  141         memset(dn->dn_next_maxblkid, 0, sizeof (dn->dn_next_maxblkid));
  142 
  143         for (int i = 0; i < TXG_SIZE; i++) {
  144                 multilist_link_init(&dn->dn_dirty_link[i]);
  145                 dn->dn_free_ranges[i] = NULL;
  146                 list_create(&dn->dn_dirty_records[i],
  147                     sizeof (dbuf_dirty_record_t),
  148                     offsetof(dbuf_dirty_record_t, dr_dirty_node));
  149         }
  150 
  151         dn->dn_allocated_txg = 0;
  152         dn->dn_free_txg = 0;
  153         dn->dn_assigned_txg = 0;
  154         dn->dn_dirty_txg = 0;
  155         dn->dn_dirtyctx = 0;
  156         dn->dn_dirtyctx_firstset = NULL;
  157         dn->dn_bonus = NULL;
  158         dn->dn_have_spill = B_FALSE;
  159         dn->dn_zio = NULL;
  160         dn->dn_oldused = 0;
  161         dn->dn_oldflags = 0;
  162         dn->dn_olduid = 0;
  163         dn->dn_oldgid = 0;
  164         dn->dn_oldprojid = ZFS_DEFAULT_PROJID;
  165         dn->dn_newuid = 0;
  166         dn->dn_newgid = 0;
  167         dn->dn_newprojid = ZFS_DEFAULT_PROJID;
  168         dn->dn_id_flags = 0;
  169 
  170         dn->dn_dbufs_count = 0;
  171         avl_create(&dn->dn_dbufs, dbuf_compare, sizeof (dmu_buf_impl_t),
  172             offsetof(dmu_buf_impl_t, db_link));
  173 
  174         dn->dn_moved = 0;
  175         return (0);
  176 }
  177 
  178 static void
  179 dnode_dest(void *arg, void *unused)
  180 {
  181         (void) unused;
  182         dnode_t *dn = arg;
  183 
  184         rw_destroy(&dn->dn_struct_rwlock);
  185         mutex_destroy(&dn->dn_mtx);
  186         mutex_destroy(&dn->dn_dbufs_mtx);
  187         cv_destroy(&dn->dn_notxholds);
  188         cv_destroy(&dn->dn_nodnholds);
  189         zfs_refcount_destroy(&dn->dn_holds);
  190         zfs_refcount_destroy(&dn->dn_tx_holds);
  191         ASSERT(!list_link_active(&dn->dn_link));
  192 
  193         for (int i = 0; i < TXG_SIZE; i++) {
  194                 ASSERT(!multilist_link_active(&dn->dn_dirty_link[i]));
  195                 ASSERT3P(dn->dn_free_ranges[i], ==, NULL);
  196                 list_destroy(&dn->dn_dirty_records[i]);
  197                 ASSERT0(dn->dn_next_nblkptr[i]);
  198                 ASSERT0(dn->dn_next_nlevels[i]);
  199                 ASSERT0(dn->dn_next_indblkshift[i]);
  200                 ASSERT0(dn->dn_next_bonustype[i]);
  201                 ASSERT0(dn->dn_rm_spillblk[i]);
  202                 ASSERT0(dn->dn_next_bonuslen[i]);
  203                 ASSERT0(dn->dn_next_blksz[i]);
  204                 ASSERT0(dn->dn_next_maxblkid[i]);
  205         }
  206 
  207         ASSERT0(dn->dn_allocated_txg);
  208         ASSERT0(dn->dn_free_txg);
  209         ASSERT0(dn->dn_assigned_txg);
  210         ASSERT0(dn->dn_dirty_txg);
  211         ASSERT0(dn->dn_dirtyctx);
  212         ASSERT3P(dn->dn_dirtyctx_firstset, ==, NULL);
  213         ASSERT3P(dn->dn_bonus, ==, NULL);
  214         ASSERT(!dn->dn_have_spill);
  215         ASSERT3P(dn->dn_zio, ==, NULL);
  216         ASSERT0(dn->dn_oldused);
  217         ASSERT0(dn->dn_oldflags);
  218         ASSERT0(dn->dn_olduid);
  219         ASSERT0(dn->dn_oldgid);
  220         ASSERT0(dn->dn_oldprojid);
  221         ASSERT0(dn->dn_newuid);
  222         ASSERT0(dn->dn_newgid);
  223         ASSERT0(dn->dn_newprojid);
  224         ASSERT0(dn->dn_id_flags);
  225 
  226         ASSERT0(dn->dn_dbufs_count);
  227         avl_destroy(&dn->dn_dbufs);
  228 }
  229 
  230 static int
  231 dnode_kstats_update(kstat_t *ksp, int rw)
  232 {
  233         dnode_stats_t *ds = ksp->ks_data;
  234 
  235         if (rw == KSTAT_WRITE)
  236                 return (EACCES);
  237         ds->dnode_hold_dbuf_hold.value.ui64 =
  238             wmsum_value(&dnode_sums.dnode_hold_dbuf_hold);
  239         ds->dnode_hold_dbuf_read.value.ui64 =
  240             wmsum_value(&dnode_sums.dnode_hold_dbuf_read);
  241         ds->dnode_hold_alloc_hits.value.ui64 =
  242             wmsum_value(&dnode_sums.dnode_hold_alloc_hits);
  243         ds->dnode_hold_alloc_misses.value.ui64 =
  244             wmsum_value(&dnode_sums.dnode_hold_alloc_misses);
  245         ds->dnode_hold_alloc_interior.value.ui64 =
  246             wmsum_value(&dnode_sums.dnode_hold_alloc_interior);
  247         ds->dnode_hold_alloc_lock_retry.value.ui64 =
  248             wmsum_value(&dnode_sums.dnode_hold_alloc_lock_retry);
  249         ds->dnode_hold_alloc_lock_misses.value.ui64 =
  250             wmsum_value(&dnode_sums.dnode_hold_alloc_lock_misses);
  251         ds->dnode_hold_alloc_type_none.value.ui64 =
  252             wmsum_value(&dnode_sums.dnode_hold_alloc_type_none);
  253         ds->dnode_hold_free_hits.value.ui64 =
  254             wmsum_value(&dnode_sums.dnode_hold_free_hits);
  255         ds->dnode_hold_free_misses.value.ui64 =
  256             wmsum_value(&dnode_sums.dnode_hold_free_misses);
  257         ds->dnode_hold_free_lock_misses.value.ui64 =
  258             wmsum_value(&dnode_sums.dnode_hold_free_lock_misses);
  259         ds->dnode_hold_free_lock_retry.value.ui64 =
  260             wmsum_value(&dnode_sums.dnode_hold_free_lock_retry);
  261         ds->dnode_hold_free_refcount.value.ui64 =
  262             wmsum_value(&dnode_sums.dnode_hold_free_refcount);
  263         ds->dnode_hold_free_overflow.value.ui64 =
  264             wmsum_value(&dnode_sums.dnode_hold_free_overflow);
  265         ds->dnode_free_interior_lock_retry.value.ui64 =
  266             wmsum_value(&dnode_sums.dnode_free_interior_lock_retry);
  267         ds->dnode_allocate.value.ui64 =
  268             wmsum_value(&dnode_sums.dnode_allocate);
  269         ds->dnode_reallocate.value.ui64 =
  270             wmsum_value(&dnode_sums.dnode_reallocate);
  271         ds->dnode_buf_evict.value.ui64 =
  272             wmsum_value(&dnode_sums.dnode_buf_evict);
  273         ds->dnode_alloc_next_chunk.value.ui64 =
  274             wmsum_value(&dnode_sums.dnode_alloc_next_chunk);
  275         ds->dnode_alloc_race.value.ui64 =
  276             wmsum_value(&dnode_sums.dnode_alloc_race);
  277         ds->dnode_alloc_next_block.value.ui64 =
  278             wmsum_value(&dnode_sums.dnode_alloc_next_block);
  279         ds->dnode_move_invalid.value.ui64 =
  280             wmsum_value(&dnode_sums.dnode_move_invalid);
  281         ds->dnode_move_recheck1.value.ui64 =
  282             wmsum_value(&dnode_sums.dnode_move_recheck1);
  283         ds->dnode_move_recheck2.value.ui64 =
  284             wmsum_value(&dnode_sums.dnode_move_recheck2);
  285         ds->dnode_move_special.value.ui64 =
  286             wmsum_value(&dnode_sums.dnode_move_special);
  287         ds->dnode_move_handle.value.ui64 =
  288             wmsum_value(&dnode_sums.dnode_move_handle);
  289         ds->dnode_move_rwlock.value.ui64 =
  290             wmsum_value(&dnode_sums.dnode_move_rwlock);
  291         ds->dnode_move_active.value.ui64 =
  292             wmsum_value(&dnode_sums.dnode_move_active);
  293         return (0);
  294 }
  295 
  296 void
  297 dnode_init(void)
  298 {
  299         ASSERT(dnode_cache == NULL);
  300         dnode_cache = kmem_cache_create("dnode_t", sizeof (dnode_t),
  301             0, dnode_cons, dnode_dest, NULL, NULL, NULL, 0);
  302         kmem_cache_set_move(dnode_cache, dnode_move);
  303 
  304         wmsum_init(&dnode_sums.dnode_hold_dbuf_hold, 0);
  305         wmsum_init(&dnode_sums.dnode_hold_dbuf_read, 0);
  306         wmsum_init(&dnode_sums.dnode_hold_alloc_hits, 0);
  307         wmsum_init(&dnode_sums.dnode_hold_alloc_misses, 0);
  308         wmsum_init(&dnode_sums.dnode_hold_alloc_interior, 0);
  309         wmsum_init(&dnode_sums.dnode_hold_alloc_lock_retry, 0);
  310         wmsum_init(&dnode_sums.dnode_hold_alloc_lock_misses, 0);
  311         wmsum_init(&dnode_sums.dnode_hold_alloc_type_none, 0);
  312         wmsum_init(&dnode_sums.dnode_hold_free_hits, 0);
  313         wmsum_init(&dnode_sums.dnode_hold_free_misses, 0);
  314         wmsum_init(&dnode_sums.dnode_hold_free_lock_misses, 0);
  315         wmsum_init(&dnode_sums.dnode_hold_free_lock_retry, 0);
  316         wmsum_init(&dnode_sums.dnode_hold_free_refcount, 0);
  317         wmsum_init(&dnode_sums.dnode_hold_free_overflow, 0);
  318         wmsum_init(&dnode_sums.dnode_free_interior_lock_retry, 0);
  319         wmsum_init(&dnode_sums.dnode_allocate, 0);
  320         wmsum_init(&dnode_sums.dnode_reallocate, 0);
  321         wmsum_init(&dnode_sums.dnode_buf_evict, 0);
  322         wmsum_init(&dnode_sums.dnode_alloc_next_chunk, 0);
  323         wmsum_init(&dnode_sums.dnode_alloc_race, 0);
  324         wmsum_init(&dnode_sums.dnode_alloc_next_block, 0);
  325         wmsum_init(&dnode_sums.dnode_move_invalid, 0);
  326         wmsum_init(&dnode_sums.dnode_move_recheck1, 0);
  327         wmsum_init(&dnode_sums.dnode_move_recheck2, 0);
  328         wmsum_init(&dnode_sums.dnode_move_special, 0);
  329         wmsum_init(&dnode_sums.dnode_move_handle, 0);
  330         wmsum_init(&dnode_sums.dnode_move_rwlock, 0);
  331         wmsum_init(&dnode_sums.dnode_move_active, 0);
  332 
  333         dnode_ksp = kstat_create("zfs", 0, "dnodestats", "misc",
  334             KSTAT_TYPE_NAMED, sizeof (dnode_stats) / sizeof (kstat_named_t),
  335             KSTAT_FLAG_VIRTUAL);
  336         if (dnode_ksp != NULL) {
  337                 dnode_ksp->ks_data = &dnode_stats;
  338                 dnode_ksp->ks_update = dnode_kstats_update;
  339                 kstat_install(dnode_ksp);
  340         }
  341 }
  342 
  343 void
  344 dnode_fini(void)
  345 {
  346         if (dnode_ksp != NULL) {
  347                 kstat_delete(dnode_ksp);
  348                 dnode_ksp = NULL;
  349         }
  350 
  351         wmsum_fini(&dnode_sums.dnode_hold_dbuf_hold);
  352         wmsum_fini(&dnode_sums.dnode_hold_dbuf_read);
  353         wmsum_fini(&dnode_sums.dnode_hold_alloc_hits);
  354         wmsum_fini(&dnode_sums.dnode_hold_alloc_misses);
  355         wmsum_fini(&dnode_sums.dnode_hold_alloc_interior);
  356         wmsum_fini(&dnode_sums.dnode_hold_alloc_lock_retry);
  357         wmsum_fini(&dnode_sums.dnode_hold_alloc_lock_misses);
  358         wmsum_fini(&dnode_sums.dnode_hold_alloc_type_none);
  359         wmsum_fini(&dnode_sums.dnode_hold_free_hits);
  360         wmsum_fini(&dnode_sums.dnode_hold_free_misses);
  361         wmsum_fini(&dnode_sums.dnode_hold_free_lock_misses);
  362         wmsum_fini(&dnode_sums.dnode_hold_free_lock_retry);
  363         wmsum_fini(&dnode_sums.dnode_hold_free_refcount);
  364         wmsum_fini(&dnode_sums.dnode_hold_free_overflow);
  365         wmsum_fini(&dnode_sums.dnode_free_interior_lock_retry);
  366         wmsum_fini(&dnode_sums.dnode_allocate);
  367         wmsum_fini(&dnode_sums.dnode_reallocate);
  368         wmsum_fini(&dnode_sums.dnode_buf_evict);
  369         wmsum_fini(&dnode_sums.dnode_alloc_next_chunk);
  370         wmsum_fini(&dnode_sums.dnode_alloc_race);
  371         wmsum_fini(&dnode_sums.dnode_alloc_next_block);
  372         wmsum_fini(&dnode_sums.dnode_move_invalid);
  373         wmsum_fini(&dnode_sums.dnode_move_recheck1);
  374         wmsum_fini(&dnode_sums.dnode_move_recheck2);
  375         wmsum_fini(&dnode_sums.dnode_move_special);
  376         wmsum_fini(&dnode_sums.dnode_move_handle);
  377         wmsum_fini(&dnode_sums.dnode_move_rwlock);
  378         wmsum_fini(&dnode_sums.dnode_move_active);
  379 
  380         kmem_cache_destroy(dnode_cache);
  381         dnode_cache = NULL;
  382 }
  383 
  384 
  385 #ifdef ZFS_DEBUG
  386 void
  387 dnode_verify(dnode_t *dn)
  388 {
  389         int drop_struct_lock = FALSE;
  390 
  391         ASSERT(dn->dn_phys);
  392         ASSERT(dn->dn_objset);
  393         ASSERT(dn->dn_handle->dnh_dnode == dn);
  394 
  395         ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
  396 
  397         if (!(zfs_flags & ZFS_DEBUG_DNODE_VERIFY))
  398                 return;
  399 
  400         if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
  401                 rw_enter(&dn->dn_struct_rwlock, RW_READER);
  402                 drop_struct_lock = TRUE;
  403         }
  404         if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) {
  405                 int i;
  406                 int max_bonuslen = DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots);
  407                 ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT);
  408                 if (dn->dn_datablkshift) {
  409                         ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
  410                         ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
  411                         ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
  412                 }
  413                 ASSERT3U(dn->dn_nlevels, <=, 30);
  414                 ASSERT(DMU_OT_IS_VALID(dn->dn_type));
  415                 ASSERT3U(dn->dn_nblkptr, >=, 1);
  416                 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
  417                 ASSERT3U(dn->dn_bonuslen, <=, max_bonuslen);
  418                 ASSERT3U(dn->dn_datablksz, ==,
  419                     dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
  420                 ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0);
  421                 ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) +
  422                     dn->dn_bonuslen, <=, max_bonuslen);
  423                 for (i = 0; i < TXG_SIZE; i++) {
  424                         ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels);
  425                 }
  426         }
  427         if (dn->dn_phys->dn_type != DMU_OT_NONE)
  428                 ASSERT3U(dn->dn_phys->dn_nlevels, <=, dn->dn_nlevels);
  429         ASSERT(DMU_OBJECT_IS_SPECIAL(dn->dn_object) || dn->dn_dbuf != NULL);
  430         if (dn->dn_dbuf != NULL) {
  431                 ASSERT3P(dn->dn_phys, ==,
  432                     (dnode_phys_t *)dn->dn_dbuf->db.db_data +
  433                     (dn->dn_object % (dn->dn_dbuf->db.db_size >> DNODE_SHIFT)));
  434         }
  435         if (drop_struct_lock)
  436                 rw_exit(&dn->dn_struct_rwlock);
  437 }
  438 #endif
  439 
  440 void
  441 dnode_byteswap(dnode_phys_t *dnp)
  442 {
  443         uint64_t *buf64 = (void*)&dnp->dn_blkptr;
  444         int i;
  445 
  446         if (dnp->dn_type == DMU_OT_NONE) {
  447                 memset(dnp, 0, sizeof (dnode_phys_t));
  448                 return;
  449         }
  450 
  451         dnp->dn_datablkszsec = BSWAP_16(dnp->dn_datablkszsec);
  452         dnp->dn_bonuslen = BSWAP_16(dnp->dn_bonuslen);
  453         dnp->dn_extra_slots = BSWAP_8(dnp->dn_extra_slots);
  454         dnp->dn_maxblkid = BSWAP_64(dnp->dn_maxblkid);
  455         dnp->dn_used = BSWAP_64(dnp->dn_used);
  456 
  457         /*
  458          * dn_nblkptr is only one byte, so it's OK to read it in either
  459          * byte order.  We can't read dn_bouslen.
  460          */
  461         ASSERT(dnp->dn_indblkshift <= SPA_MAXBLOCKSHIFT);
  462         ASSERT(dnp->dn_nblkptr <= DN_MAX_NBLKPTR);
  463         for (i = 0; i < dnp->dn_nblkptr * sizeof (blkptr_t)/8; i++)
  464                 buf64[i] = BSWAP_64(buf64[i]);
  465 
  466         /*
  467          * OK to check dn_bonuslen for zero, because it won't matter if
  468          * we have the wrong byte order.  This is necessary because the
  469          * dnode dnode is smaller than a regular dnode.
  470          */
  471         if (dnp->dn_bonuslen != 0) {
  472                 dmu_object_byteswap_t byteswap;
  473                 ASSERT(DMU_OT_IS_VALID(dnp->dn_bonustype));
  474                 byteswap = DMU_OT_BYTESWAP(dnp->dn_bonustype);
  475                 dmu_ot_byteswap[byteswap].ob_func(DN_BONUS(dnp),
  476                     DN_MAX_BONUS_LEN(dnp));
  477         }
  478 
  479         /* Swap SPILL block if we have one */
  480         if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR)
  481                 byteswap_uint64_array(DN_SPILL_BLKPTR(dnp), sizeof (blkptr_t));
  482 }
  483 
  484 void
  485 dnode_buf_byteswap(void *vbuf, size_t size)
  486 {
  487         int i = 0;
  488 
  489         ASSERT3U(sizeof (dnode_phys_t), ==, (1<<DNODE_SHIFT));
  490         ASSERT((size & (sizeof (dnode_phys_t)-1)) == 0);
  491 
  492         while (i < size) {
  493                 dnode_phys_t *dnp = (void *)(((char *)vbuf) + i);
  494                 dnode_byteswap(dnp);
  495 
  496                 i += DNODE_MIN_SIZE;
  497                 if (dnp->dn_type != DMU_OT_NONE)
  498                         i += dnp->dn_extra_slots * DNODE_MIN_SIZE;
  499         }
  500 }
  501 
  502 void
  503 dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx)
  504 {
  505         ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
  506 
  507         dnode_setdirty(dn, tx);
  508         rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
  509         ASSERT3U(newsize, <=, DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots) -
  510             (dn->dn_nblkptr-1) * sizeof (blkptr_t));
  511 
  512         if (newsize < dn->dn_bonuslen) {
  513                 /* clear any data after the end of the new size */
  514                 size_t diff = dn->dn_bonuslen - newsize;
  515                 char *data_end = ((char *)dn->dn_bonus->db.db_data) + newsize;
  516                 memset(data_end, 0, diff);
  517         }
  518 
  519         dn->dn_bonuslen = newsize;
  520         if (newsize == 0)
  521                 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = DN_ZERO_BONUSLEN;
  522         else
  523                 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen;
  524         rw_exit(&dn->dn_struct_rwlock);
  525 }
  526 
  527 void
  528 dnode_setbonus_type(dnode_t *dn, dmu_object_type_t newtype, dmu_tx_t *tx)
  529 {
  530         ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
  531         dnode_setdirty(dn, tx);
  532         rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
  533         dn->dn_bonustype = newtype;
  534         dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype;
  535         rw_exit(&dn->dn_struct_rwlock);
  536 }
  537 
  538 void
  539 dnode_rm_spill(dnode_t *dn, dmu_tx_t *tx)
  540 {
  541         ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
  542         ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
  543         dnode_setdirty(dn, tx);
  544         dn->dn_rm_spillblk[tx->tx_txg & TXG_MASK] = DN_KILL_SPILLBLK;
  545         dn->dn_have_spill = B_FALSE;
  546 }
  547 
  548 static void
  549 dnode_setdblksz(dnode_t *dn, int size)
  550 {
  551         ASSERT0(P2PHASE(size, SPA_MINBLOCKSIZE));
  552         ASSERT3U(size, <=, SPA_MAXBLOCKSIZE);
  553         ASSERT3U(size, >=, SPA_MINBLOCKSIZE);
  554         ASSERT3U(size >> SPA_MINBLOCKSHIFT, <,
  555             1<<(sizeof (dn->dn_phys->dn_datablkszsec) * 8));
  556         dn->dn_datablksz = size;
  557         dn->dn_datablkszsec = size >> SPA_MINBLOCKSHIFT;
  558         dn->dn_datablkshift = ISP2(size) ? highbit64(size - 1) : 0;
  559 }
  560 
  561 static dnode_t *
  562 dnode_create(objset_t *os, dnode_phys_t *dnp, dmu_buf_impl_t *db,
  563     uint64_t object, dnode_handle_t *dnh)
  564 {
  565         dnode_t *dn;
  566 
  567         dn = kmem_cache_alloc(dnode_cache, KM_SLEEP);
  568         dn->dn_moved = 0;
  569 
  570         /*
  571          * Defer setting dn_objset until the dnode is ready to be a candidate
  572          * for the dnode_move() callback.
  573          */
  574         dn->dn_object = object;
  575         dn->dn_dbuf = db;
  576         dn->dn_handle = dnh;
  577         dn->dn_phys = dnp;
  578 
  579         if (dnp->dn_datablkszsec) {
  580                 dnode_setdblksz(dn, dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT);
  581         } else {
  582                 dn->dn_datablksz = 0;
  583                 dn->dn_datablkszsec = 0;
  584                 dn->dn_datablkshift = 0;
  585         }
  586         dn->dn_indblkshift = dnp->dn_indblkshift;
  587         dn->dn_nlevels = dnp->dn_nlevels;
  588         dn->dn_type = dnp->dn_type;
  589         dn->dn_nblkptr = dnp->dn_nblkptr;
  590         dn->dn_checksum = dnp->dn_checksum;
  591         dn->dn_compress = dnp->dn_compress;
  592         dn->dn_bonustype = dnp->dn_bonustype;
  593         dn->dn_bonuslen = dnp->dn_bonuslen;
  594         dn->dn_num_slots = dnp->dn_extra_slots + 1;
  595         dn->dn_maxblkid = dnp->dn_maxblkid;
  596         dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0);
  597         dn->dn_id_flags = 0;
  598 
  599         dmu_zfetch_init(&dn->dn_zfetch, dn);
  600 
  601         ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
  602         ASSERT(zrl_is_locked(&dnh->dnh_zrlock));
  603         ASSERT(!DN_SLOT_IS_PTR(dnh->dnh_dnode));
  604 
  605         mutex_enter(&os->os_lock);
  606 
  607         /*
  608          * Exclude special dnodes from os_dnodes so an empty os_dnodes
  609          * signifies that the special dnodes have no references from
  610          * their children (the entries in os_dnodes).  This allows
  611          * dnode_destroy() to easily determine if the last child has
  612          * been removed and then complete eviction of the objset.
  613          */
  614         if (!DMU_OBJECT_IS_SPECIAL(object))
  615                 list_insert_head(&os->os_dnodes, dn);
  616         membar_producer();
  617 
  618         /*
  619          * Everything else must be valid before assigning dn_objset
  620          * makes the dnode eligible for dnode_move().
  621          */
  622         dn->dn_objset = os;
  623 
  624         dnh->dnh_dnode = dn;
  625         mutex_exit(&os->os_lock);
  626 
  627         arc_space_consume(sizeof (dnode_t), ARC_SPACE_DNODE);
  628 
  629         return (dn);
  630 }
  631 
  632 /*
  633  * Caller must be holding the dnode handle, which is released upon return.
  634  */
  635 static void
  636 dnode_destroy(dnode_t *dn)
  637 {
  638         objset_t *os = dn->dn_objset;
  639         boolean_t complete_os_eviction = B_FALSE;
  640 
  641         ASSERT((dn->dn_id_flags & DN_ID_NEW_EXIST) == 0);
  642 
  643         mutex_enter(&os->os_lock);
  644         POINTER_INVALIDATE(&dn->dn_objset);
  645         if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
  646                 list_remove(&os->os_dnodes, dn);
  647                 complete_os_eviction =
  648                     list_is_empty(&os->os_dnodes) &&
  649                     list_link_active(&os->os_evicting_node);
  650         }
  651         mutex_exit(&os->os_lock);
  652 
  653         /* the dnode can no longer move, so we can release the handle */
  654         if (!zrl_is_locked(&dn->dn_handle->dnh_zrlock))
  655                 zrl_remove(&dn->dn_handle->dnh_zrlock);
  656 
  657         dn->dn_allocated_txg = 0;
  658         dn->dn_free_txg = 0;
  659         dn->dn_assigned_txg = 0;
  660         dn->dn_dirty_txg = 0;
  661 
  662         dn->dn_dirtyctx = 0;
  663         dn->dn_dirtyctx_firstset = NULL;
  664         if (dn->dn_bonus != NULL) {
  665                 mutex_enter(&dn->dn_bonus->db_mtx);
  666                 dbuf_destroy(dn->dn_bonus);
  667                 dn->dn_bonus = NULL;
  668         }
  669         dn->dn_zio = NULL;
  670 
  671         dn->dn_have_spill = B_FALSE;
  672         dn->dn_oldused = 0;
  673         dn->dn_oldflags = 0;
  674         dn->dn_olduid = 0;
  675         dn->dn_oldgid = 0;
  676         dn->dn_oldprojid = ZFS_DEFAULT_PROJID;
  677         dn->dn_newuid = 0;
  678         dn->dn_newgid = 0;
  679         dn->dn_newprojid = ZFS_DEFAULT_PROJID;
  680         dn->dn_id_flags = 0;
  681 
  682         dmu_zfetch_fini(&dn->dn_zfetch);
  683         kmem_cache_free(dnode_cache, dn);
  684         arc_space_return(sizeof (dnode_t), ARC_SPACE_DNODE);
  685 
  686         if (complete_os_eviction)
  687                 dmu_objset_evict_done(os);
  688 }
  689 
  690 void
  691 dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs,
  692     dmu_object_type_t bonustype, int bonuslen, int dn_slots, dmu_tx_t *tx)
  693 {
  694         int i;
  695 
  696         ASSERT3U(dn_slots, >, 0);
  697         ASSERT3U(dn_slots << DNODE_SHIFT, <=,
  698             spa_maxdnodesize(dmu_objset_spa(dn->dn_objset)));
  699         ASSERT3U(blocksize, <=,
  700             spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
  701         if (blocksize == 0)
  702                 blocksize = 1 << zfs_default_bs;
  703         else
  704                 blocksize = P2ROUNDUP(blocksize, SPA_MINBLOCKSIZE);
  705 
  706         if (ibs == 0)
  707                 ibs = zfs_default_ibs;
  708 
  709         ibs = MIN(MAX(ibs, DN_MIN_INDBLKSHIFT), DN_MAX_INDBLKSHIFT);
  710 
  711         dprintf("os=%p obj=%llu txg=%llu blocksize=%d ibs=%d dn_slots=%d\n",
  712             dn->dn_objset, (u_longlong_t)dn->dn_object,
  713             (u_longlong_t)tx->tx_txg, blocksize, ibs, dn_slots);
  714         DNODE_STAT_BUMP(dnode_allocate);
  715 
  716         ASSERT(dn->dn_type == DMU_OT_NONE);
  717         ASSERT0(memcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)));
  718         ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
  719         ASSERT(ot != DMU_OT_NONE);
  720         ASSERT(DMU_OT_IS_VALID(ot));
  721         ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
  722             (bonustype == DMU_OT_SA && bonuslen == 0) ||
  723             (bonustype != DMU_OT_NONE && bonuslen != 0));
  724         ASSERT(DMU_OT_IS_VALID(bonustype));
  725         ASSERT3U(bonuslen, <=, DN_SLOTS_TO_BONUSLEN(dn_slots));
  726         ASSERT(dn->dn_type == DMU_OT_NONE);
  727         ASSERT0(dn->dn_maxblkid);
  728         ASSERT0(dn->dn_allocated_txg);
  729         ASSERT0(dn->dn_assigned_txg);
  730         ASSERT(zfs_refcount_is_zero(&dn->dn_tx_holds));
  731         ASSERT3U(zfs_refcount_count(&dn->dn_holds), <=, 1);
  732         ASSERT(avl_is_empty(&dn->dn_dbufs));
  733 
  734         for (i = 0; i < TXG_SIZE; i++) {
  735                 ASSERT0(dn->dn_next_nblkptr[i]);
  736                 ASSERT0(dn->dn_next_nlevels[i]);
  737                 ASSERT0(dn->dn_next_indblkshift[i]);
  738                 ASSERT0(dn->dn_next_bonuslen[i]);
  739                 ASSERT0(dn->dn_next_bonustype[i]);
  740                 ASSERT0(dn->dn_rm_spillblk[i]);
  741                 ASSERT0(dn->dn_next_blksz[i]);
  742                 ASSERT0(dn->dn_next_maxblkid[i]);
  743                 ASSERT(!multilist_link_active(&dn->dn_dirty_link[i]));
  744                 ASSERT3P(list_head(&dn->dn_dirty_records[i]), ==, NULL);
  745                 ASSERT3P(dn->dn_free_ranges[i], ==, NULL);
  746         }
  747 
  748         dn->dn_type = ot;
  749         dnode_setdblksz(dn, blocksize);
  750         dn->dn_indblkshift = ibs;
  751         dn->dn_nlevels = 1;
  752         dn->dn_num_slots = dn_slots;
  753         if (bonustype == DMU_OT_SA) /* Maximize bonus space for SA */
  754                 dn->dn_nblkptr = 1;
  755         else {
  756                 dn->dn_nblkptr = MIN(DN_MAX_NBLKPTR,
  757                     1 + ((DN_SLOTS_TO_BONUSLEN(dn_slots) - bonuslen) >>
  758                     SPA_BLKPTRSHIFT));
  759         }
  760 
  761         dn->dn_bonustype = bonustype;
  762         dn->dn_bonuslen = bonuslen;
  763         dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
  764         dn->dn_compress = ZIO_COMPRESS_INHERIT;
  765         dn->dn_dirtyctx = 0;
  766 
  767         dn->dn_free_txg = 0;
  768         dn->dn_dirtyctx_firstset = NULL;
  769         dn->dn_dirty_txg = 0;
  770 
  771         dn->dn_allocated_txg = tx->tx_txg;
  772         dn->dn_id_flags = 0;
  773 
  774         dnode_setdirty(dn, tx);
  775         dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs;
  776         dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen;
  777         dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype;
  778         dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = dn->dn_datablksz;
  779 }
  780 
  781 void
  782 dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize,
  783     dmu_object_type_t bonustype, int bonuslen, int dn_slots,
  784     boolean_t keep_spill, dmu_tx_t *tx)
  785 {
  786         int nblkptr;
  787 
  788         ASSERT3U(blocksize, >=, SPA_MINBLOCKSIZE);
  789         ASSERT3U(blocksize, <=,
  790             spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
  791         ASSERT0(blocksize % SPA_MINBLOCKSIZE);
  792         ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
  793         ASSERT(tx->tx_txg != 0);
  794         ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
  795             (bonustype != DMU_OT_NONE && bonuslen != 0) ||
  796             (bonustype == DMU_OT_SA && bonuslen == 0));
  797         ASSERT(DMU_OT_IS_VALID(bonustype));
  798         ASSERT3U(bonuslen, <=,
  799             DN_BONUS_SIZE(spa_maxdnodesize(dmu_objset_spa(dn->dn_objset))));
  800         ASSERT3U(bonuslen, <=, DN_BONUS_SIZE(dn_slots << DNODE_SHIFT));
  801 
  802         dnode_free_interior_slots(dn);
  803         DNODE_STAT_BUMP(dnode_reallocate);
  804 
  805         /* clean up any unreferenced dbufs */
  806         dnode_evict_dbufs(dn);
  807 
  808         dn->dn_id_flags = 0;
  809 
  810         rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
  811         dnode_setdirty(dn, tx);
  812         if (dn->dn_datablksz != blocksize) {
  813                 /* change blocksize */
  814                 ASSERT0(dn->dn_maxblkid);
  815                 ASSERT(BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) ||
  816                     dnode_block_freed(dn, 0));
  817 
  818                 dnode_setdblksz(dn, blocksize);
  819                 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = blocksize;
  820         }
  821         if (dn->dn_bonuslen != bonuslen)
  822                 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = bonuslen;
  823 
  824         if (bonustype == DMU_OT_SA) /* Maximize bonus space for SA */
  825                 nblkptr = 1;
  826         else
  827                 nblkptr = MIN(DN_MAX_NBLKPTR,
  828                     1 + ((DN_SLOTS_TO_BONUSLEN(dn_slots) - bonuslen) >>
  829                     SPA_BLKPTRSHIFT));
  830         if (dn->dn_bonustype != bonustype)
  831                 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = bonustype;
  832         if (dn->dn_nblkptr != nblkptr)
  833                 dn->dn_next_nblkptr[tx->tx_txg & TXG_MASK] = nblkptr;
  834         if (dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR && !keep_spill) {
  835                 dbuf_rm_spill(dn, tx);
  836                 dnode_rm_spill(dn, tx);
  837         }
  838 
  839         rw_exit(&dn->dn_struct_rwlock);
  840 
  841         /* change type */
  842         dn->dn_type = ot;
  843 
  844         /* change bonus size and type */
  845         mutex_enter(&dn->dn_mtx);
  846         dn->dn_bonustype = bonustype;
  847         dn->dn_bonuslen = bonuslen;
  848         dn->dn_num_slots = dn_slots;
  849         dn->dn_nblkptr = nblkptr;
  850         dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
  851         dn->dn_compress = ZIO_COMPRESS_INHERIT;
  852         ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
  853 
  854         /* fix up the bonus db_size */
  855         if (dn->dn_bonus) {
  856                 dn->dn_bonus->db.db_size =
  857                     DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots) -
  858                     (dn->dn_nblkptr-1) * sizeof (blkptr_t);
  859                 ASSERT(dn->dn_bonuslen <= dn->dn_bonus->db.db_size);
  860         }
  861 
  862         dn->dn_allocated_txg = tx->tx_txg;
  863         mutex_exit(&dn->dn_mtx);
  864 }
  865 
  866 #ifdef  _KERNEL
  867 static void
  868 dnode_move_impl(dnode_t *odn, dnode_t *ndn)
  869 {
  870         ASSERT(!RW_LOCK_HELD(&odn->dn_struct_rwlock));
  871         ASSERT(MUTEX_NOT_HELD(&odn->dn_mtx));
  872         ASSERT(MUTEX_NOT_HELD(&odn->dn_dbufs_mtx));
  873 
  874         /* Copy fields. */
  875         ndn->dn_objset = odn->dn_objset;
  876         ndn->dn_object = odn->dn_object;
  877         ndn->dn_dbuf = odn->dn_dbuf;
  878         ndn->dn_handle = odn->dn_handle;
  879         ndn->dn_phys = odn->dn_phys;
  880         ndn->dn_type = odn->dn_type;
  881         ndn->dn_bonuslen = odn->dn_bonuslen;
  882         ndn->dn_bonustype = odn->dn_bonustype;
  883         ndn->dn_nblkptr = odn->dn_nblkptr;
  884         ndn->dn_checksum = odn->dn_checksum;
  885         ndn->dn_compress = odn->dn_compress;
  886         ndn->dn_nlevels = odn->dn_nlevels;
  887         ndn->dn_indblkshift = odn->dn_indblkshift;
  888         ndn->dn_datablkshift = odn->dn_datablkshift;
  889         ndn->dn_datablkszsec = odn->dn_datablkszsec;
  890         ndn->dn_datablksz = odn->dn_datablksz;
  891         ndn->dn_maxblkid = odn->dn_maxblkid;
  892         ndn->dn_num_slots = odn->dn_num_slots;
  893         memcpy(ndn->dn_next_type, odn->dn_next_type,
  894             sizeof (odn->dn_next_type));
  895         memcpy(ndn->dn_next_nblkptr, odn->dn_next_nblkptr,
  896             sizeof (odn->dn_next_nblkptr));
  897         memcpy(ndn->dn_next_nlevels, odn->dn_next_nlevels,
  898             sizeof (odn->dn_next_nlevels));
  899         memcpy(ndn->dn_next_indblkshift, odn->dn_next_indblkshift,
  900             sizeof (odn->dn_next_indblkshift));
  901         memcpy(ndn->dn_next_bonustype, odn->dn_next_bonustype,
  902             sizeof (odn->dn_next_bonustype));
  903         memcpy(ndn->dn_rm_spillblk, odn->dn_rm_spillblk,
  904             sizeof (odn->dn_rm_spillblk));
  905         memcpy(ndn->dn_next_bonuslen, odn->dn_next_bonuslen,
  906             sizeof (odn->dn_next_bonuslen));
  907         memcpy(ndn->dn_next_blksz, odn->dn_next_blksz,
  908             sizeof (odn->dn_next_blksz));
  909         memcpy(ndn->dn_next_maxblkid, odn->dn_next_maxblkid,
  910             sizeof (odn->dn_next_maxblkid));
  911         for (int i = 0; i < TXG_SIZE; i++) {
  912                 list_move_tail(&ndn->dn_dirty_records[i],
  913                     &odn->dn_dirty_records[i]);
  914         }
  915         memcpy(ndn->dn_free_ranges, odn->dn_free_ranges,
  916             sizeof (odn->dn_free_ranges));
  917         ndn->dn_allocated_txg = odn->dn_allocated_txg;
  918         ndn->dn_free_txg = odn->dn_free_txg;
  919         ndn->dn_assigned_txg = odn->dn_assigned_txg;
  920         ndn->dn_dirty_txg = odn->dn_dirty_txg;
  921         ndn->dn_dirtyctx = odn->dn_dirtyctx;
  922         ndn->dn_dirtyctx_firstset = odn->dn_dirtyctx_firstset;
  923         ASSERT(zfs_refcount_count(&odn->dn_tx_holds) == 0);
  924         zfs_refcount_transfer(&ndn->dn_holds, &odn->dn_holds);
  925         ASSERT(avl_is_empty(&ndn->dn_dbufs));
  926         avl_swap(&ndn->dn_dbufs, &odn->dn_dbufs);
  927         ndn->dn_dbufs_count = odn->dn_dbufs_count;
  928         ndn->dn_bonus = odn->dn_bonus;
  929         ndn->dn_have_spill = odn->dn_have_spill;
  930         ndn->dn_zio = odn->dn_zio;
  931         ndn->dn_oldused = odn->dn_oldused;
  932         ndn->dn_oldflags = odn->dn_oldflags;
  933         ndn->dn_olduid = odn->dn_olduid;
  934         ndn->dn_oldgid = odn->dn_oldgid;
  935         ndn->dn_oldprojid = odn->dn_oldprojid;
  936         ndn->dn_newuid = odn->dn_newuid;
  937         ndn->dn_newgid = odn->dn_newgid;
  938         ndn->dn_newprojid = odn->dn_newprojid;
  939         ndn->dn_id_flags = odn->dn_id_flags;
  940         dmu_zfetch_init(&ndn->dn_zfetch, ndn);
  941 
  942         /*
  943          * Update back pointers. Updating the handle fixes the back pointer of
  944          * every descendant dbuf as well as the bonus dbuf.
  945          */
  946         ASSERT(ndn->dn_handle->dnh_dnode == odn);
  947         ndn->dn_handle->dnh_dnode = ndn;
  948 
  949         /*
  950          * Invalidate the original dnode by clearing all of its back pointers.
  951          */
  952         odn->dn_dbuf = NULL;
  953         odn->dn_handle = NULL;
  954         avl_create(&odn->dn_dbufs, dbuf_compare, sizeof (dmu_buf_impl_t),
  955             offsetof(dmu_buf_impl_t, db_link));
  956         odn->dn_dbufs_count = 0;
  957         odn->dn_bonus = NULL;
  958         dmu_zfetch_fini(&odn->dn_zfetch);
  959 
  960         /*
  961          * Set the low bit of the objset pointer to ensure that dnode_move()
  962          * recognizes the dnode as invalid in any subsequent callback.
  963          */
  964         POINTER_INVALIDATE(&odn->dn_objset);
  965 
  966         /*
  967          * Satisfy the destructor.
  968          */
  969         for (int i = 0; i < TXG_SIZE; i++) {
  970                 list_create(&odn->dn_dirty_records[i],
  971                     sizeof (dbuf_dirty_record_t),
  972                     offsetof(dbuf_dirty_record_t, dr_dirty_node));
  973                 odn->dn_free_ranges[i] = NULL;
  974                 odn->dn_next_nlevels[i] = 0;
  975                 odn->dn_next_indblkshift[i] = 0;
  976                 odn->dn_next_bonustype[i] = 0;
  977                 odn->dn_rm_spillblk[i] = 0;
  978                 odn->dn_next_bonuslen[i] = 0;
  979                 odn->dn_next_blksz[i] = 0;
  980         }
  981         odn->dn_allocated_txg = 0;
  982         odn->dn_free_txg = 0;
  983         odn->dn_assigned_txg = 0;
  984         odn->dn_dirty_txg = 0;
  985         odn->dn_dirtyctx = 0;
  986         odn->dn_dirtyctx_firstset = NULL;
  987         odn->dn_have_spill = B_FALSE;
  988         odn->dn_zio = NULL;
  989         odn->dn_oldused = 0;
  990         odn->dn_oldflags = 0;
  991         odn->dn_olduid = 0;
  992         odn->dn_oldgid = 0;
  993         odn->dn_oldprojid = ZFS_DEFAULT_PROJID;
  994         odn->dn_newuid = 0;
  995         odn->dn_newgid = 0;
  996         odn->dn_newprojid = ZFS_DEFAULT_PROJID;
  997         odn->dn_id_flags = 0;
  998 
  999         /*
 1000          * Mark the dnode.
 1001          */
 1002         ndn->dn_moved = 1;
 1003         odn->dn_moved = (uint8_t)-1;
 1004 }
 1005 
 1006 static kmem_cbrc_t
 1007 dnode_move(void *buf, void *newbuf, size_t size, void *arg)
 1008 {
 1009         dnode_t *odn = buf, *ndn = newbuf;
 1010         objset_t *os;
 1011         int64_t refcount;
 1012         uint32_t dbufs;
 1013 
 1014         /*
 1015          * The dnode is on the objset's list of known dnodes if the objset
 1016          * pointer is valid. We set the low bit of the objset pointer when
 1017          * freeing the dnode to invalidate it, and the memory patterns written
 1018          * by kmem (baddcafe and deadbeef) set at least one of the two low bits.
 1019          * A newly created dnode sets the objset pointer last of all to indicate
 1020          * that the dnode is known and in a valid state to be moved by this
 1021          * function.
 1022          */
 1023         os = odn->dn_objset;
 1024         if (!POINTER_IS_VALID(os)) {
 1025                 DNODE_STAT_BUMP(dnode_move_invalid);
 1026                 return (KMEM_CBRC_DONT_KNOW);
 1027         }
 1028 
 1029         /*
 1030          * Ensure that the objset does not go away during the move.
 1031          */
 1032         rw_enter(&os_lock, RW_WRITER);
 1033         if (os != odn->dn_objset) {
 1034                 rw_exit(&os_lock);
 1035                 DNODE_STAT_BUMP(dnode_move_recheck1);
 1036                 return (KMEM_CBRC_DONT_KNOW);
 1037         }
 1038 
 1039         /*
 1040          * If the dnode is still valid, then so is the objset. We know that no
 1041          * valid objset can be freed while we hold os_lock, so we can safely
 1042          * ensure that the objset remains in use.
 1043          */
 1044         mutex_enter(&os->os_lock);
 1045 
 1046         /*
 1047          * Recheck the objset pointer in case the dnode was removed just before
 1048          * acquiring the lock.
 1049          */
 1050         if (os != odn->dn_objset) {
 1051                 mutex_exit(&os->os_lock);
 1052                 rw_exit(&os_lock);
 1053                 DNODE_STAT_BUMP(dnode_move_recheck2);
 1054                 return (KMEM_CBRC_DONT_KNOW);
 1055         }
 1056 
 1057         /*
 1058          * At this point we know that as long as we hold os->os_lock, the dnode
 1059          * cannot be freed and fields within the dnode can be safely accessed.
 1060          * The objset listing this dnode cannot go away as long as this dnode is
 1061          * on its list.
 1062          */
 1063         rw_exit(&os_lock);
 1064         if (DMU_OBJECT_IS_SPECIAL(odn->dn_object)) {
 1065                 mutex_exit(&os->os_lock);
 1066                 DNODE_STAT_BUMP(dnode_move_special);
 1067                 return (KMEM_CBRC_NO);
 1068         }
 1069         ASSERT(odn->dn_dbuf != NULL); /* only "special" dnodes have no parent */
 1070 
 1071         /*
 1072          * Lock the dnode handle to prevent the dnode from obtaining any new
 1073          * holds. This also prevents the descendant dbufs and the bonus dbuf
 1074          * from accessing the dnode, so that we can discount their holds. The
 1075          * handle is safe to access because we know that while the dnode cannot
 1076          * go away, neither can its handle. Once we hold dnh_zrlock, we can
 1077          * safely move any dnode referenced only by dbufs.
 1078          */
 1079         if (!zrl_tryenter(&odn->dn_handle->dnh_zrlock)) {
 1080                 mutex_exit(&os->os_lock);
 1081                 DNODE_STAT_BUMP(dnode_move_handle);
 1082                 return (KMEM_CBRC_LATER);
 1083         }
 1084 
 1085         /*
 1086          * Ensure a consistent view of the dnode's holds and the dnode's dbufs.
 1087          * We need to guarantee that there is a hold for every dbuf in order to
 1088          * determine whether the dnode is actively referenced. Falsely matching
 1089          * a dbuf to an active hold would lead to an unsafe move. It's possible
 1090          * that a thread already having an active dnode hold is about to add a
 1091          * dbuf, and we can't compare hold and dbuf counts while the add is in
 1092          * progress.
 1093          */
 1094         if (!rw_tryenter(&odn->dn_struct_rwlock, RW_WRITER)) {
 1095                 zrl_exit(&odn->dn_handle->dnh_zrlock);
 1096                 mutex_exit(&os->os_lock);
 1097                 DNODE_STAT_BUMP(dnode_move_rwlock);
 1098                 return (KMEM_CBRC_LATER);
 1099         }
 1100 
 1101         /*
 1102          * A dbuf may be removed (evicted) without an active dnode hold. In that
 1103          * case, the dbuf count is decremented under the handle lock before the
 1104          * dbuf's hold is released. This order ensures that if we count the hold
 1105          * after the dbuf is removed but before its hold is released, we will
 1106          * treat the unmatched hold as active and exit safely. If we count the
 1107          * hold before the dbuf is removed, the hold is discounted, and the
 1108          * removal is blocked until the move completes.
 1109          */
 1110         refcount = zfs_refcount_count(&odn->dn_holds);
 1111         ASSERT(refcount >= 0);
 1112         dbufs = DN_DBUFS_COUNT(odn);
 1113 
 1114         /* We can't have more dbufs than dnode holds. */
 1115         ASSERT3U(dbufs, <=, refcount);
 1116         DTRACE_PROBE3(dnode__move, dnode_t *, odn, int64_t, refcount,
 1117             uint32_t, dbufs);
 1118 
 1119         if (refcount > dbufs) {
 1120                 rw_exit(&odn->dn_struct_rwlock);
 1121                 zrl_exit(&odn->dn_handle->dnh_zrlock);
 1122                 mutex_exit(&os->os_lock);
 1123                 DNODE_STAT_BUMP(dnode_move_active);
 1124                 return (KMEM_CBRC_LATER);
 1125         }
 1126 
 1127         rw_exit(&odn->dn_struct_rwlock);
 1128 
 1129         /*
 1130          * At this point we know that anyone with a hold on the dnode is not
 1131          * actively referencing it. The dnode is known and in a valid state to
 1132          * move. We're holding the locks needed to execute the critical section.
 1133          */
 1134         dnode_move_impl(odn, ndn);
 1135 
 1136         list_link_replace(&odn->dn_link, &ndn->dn_link);
 1137         /* If the dnode was safe to move, the refcount cannot have changed. */
 1138         ASSERT(refcount == zfs_refcount_count(&ndn->dn_holds));
 1139         ASSERT(dbufs == DN_DBUFS_COUNT(ndn));
 1140         zrl_exit(&ndn->dn_handle->dnh_zrlock); /* handle has moved */
 1141         mutex_exit(&os->os_lock);
 1142 
 1143         return (KMEM_CBRC_YES);
 1144 }
 1145 #endif  /* _KERNEL */
 1146 
 1147 static void
 1148 dnode_slots_hold(dnode_children_t *children, int idx, int slots)
 1149 {
 1150         ASSERT3S(idx + slots, <=, DNODES_PER_BLOCK);
 1151 
 1152         for (int i = idx; i < idx + slots; i++) {
 1153                 dnode_handle_t *dnh = &children->dnc_children[i];
 1154                 zrl_add(&dnh->dnh_zrlock);
 1155         }
 1156 }
 1157 
 1158 static void
 1159 dnode_slots_rele(dnode_children_t *children, int idx, int slots)
 1160 {
 1161         ASSERT3S(idx + slots, <=, DNODES_PER_BLOCK);
 1162 
 1163         for (int i = idx; i < idx + slots; i++) {
 1164                 dnode_handle_t *dnh = &children->dnc_children[i];
 1165 
 1166                 if (zrl_is_locked(&dnh->dnh_zrlock))
 1167                         zrl_exit(&dnh->dnh_zrlock);
 1168                 else
 1169                         zrl_remove(&dnh->dnh_zrlock);
 1170         }
 1171 }
 1172 
 1173 static int
 1174 dnode_slots_tryenter(dnode_children_t *children, int idx, int slots)
 1175 {
 1176         ASSERT3S(idx + slots, <=, DNODES_PER_BLOCK);
 1177 
 1178         for (int i = idx; i < idx + slots; i++) {
 1179                 dnode_handle_t *dnh = &children->dnc_children[i];
 1180 
 1181                 if (!zrl_tryenter(&dnh->dnh_zrlock)) {
 1182                         for (int j = idx; j < i; j++) {
 1183                                 dnh = &children->dnc_children[j];
 1184                                 zrl_exit(&dnh->dnh_zrlock);
 1185                         }
 1186 
 1187                         return (0);
 1188                 }
 1189         }
 1190 
 1191         return (1);
 1192 }
 1193 
 1194 static void
 1195 dnode_set_slots(dnode_children_t *children, int idx, int slots, void *ptr)
 1196 {
 1197         ASSERT3S(idx + slots, <=, DNODES_PER_BLOCK);
 1198 
 1199         for (int i = idx; i < idx + slots; i++) {
 1200                 dnode_handle_t *dnh = &children->dnc_children[i];
 1201                 dnh->dnh_dnode = ptr;
 1202         }
 1203 }
 1204 
 1205 static boolean_t
 1206 dnode_check_slots_free(dnode_children_t *children, int idx, int slots)
 1207 {
 1208         ASSERT3S(idx + slots, <=, DNODES_PER_BLOCK);
 1209 
 1210         /*
 1211          * If all dnode slots are either already free or
 1212          * evictable return B_TRUE.
 1213          */
 1214         for (int i = idx; i < idx + slots; i++) {
 1215                 dnode_handle_t *dnh = &children->dnc_children[i];
 1216                 dnode_t *dn = dnh->dnh_dnode;
 1217 
 1218                 if (dn == DN_SLOT_FREE) {
 1219                         continue;
 1220                 } else if (DN_SLOT_IS_PTR(dn)) {
 1221                         mutex_enter(&dn->dn_mtx);
 1222                         boolean_t can_free = (dn->dn_type == DMU_OT_NONE &&
 1223                             zfs_refcount_is_zero(&dn->dn_holds) &&
 1224                             !DNODE_IS_DIRTY(dn));
 1225                         mutex_exit(&dn->dn_mtx);
 1226 
 1227                         if (!can_free)
 1228                                 return (B_FALSE);
 1229                         else
 1230                                 continue;
 1231                 } else {
 1232                         return (B_FALSE);
 1233                 }
 1234         }
 1235 
 1236         return (B_TRUE);
 1237 }
 1238 
 1239 static void
 1240 dnode_reclaim_slots(dnode_children_t *children, int idx, int slots)
 1241 {
 1242         ASSERT3S(idx + slots, <=, DNODES_PER_BLOCK);
 1243 
 1244         for (int i = idx; i < idx + slots; i++) {
 1245                 dnode_handle_t *dnh = &children->dnc_children[i];
 1246 
 1247                 ASSERT(zrl_is_locked(&dnh->dnh_zrlock));
 1248 
 1249                 if (DN_SLOT_IS_PTR(dnh->dnh_dnode)) {
 1250                         ASSERT3S(dnh->dnh_dnode->dn_type, ==, DMU_OT_NONE);
 1251                         dnode_destroy(dnh->dnh_dnode);
 1252                         dnh->dnh_dnode = DN_SLOT_FREE;
 1253                 }
 1254         }
 1255 }
 1256 
 1257 void
 1258 dnode_free_interior_slots(dnode_t *dn)
 1259 {
 1260         dnode_children_t *children = dmu_buf_get_user(&dn->dn_dbuf->db);
 1261         int epb = dn->dn_dbuf->db.db_size >> DNODE_SHIFT;
 1262         int idx = (dn->dn_object & (epb - 1)) + 1;
 1263         int slots = dn->dn_num_slots - 1;
 1264 
 1265         if (slots == 0)
 1266                 return;
 1267 
 1268         ASSERT3S(idx + slots, <=, DNODES_PER_BLOCK);
 1269 
 1270         while (!dnode_slots_tryenter(children, idx, slots)) {
 1271                 DNODE_STAT_BUMP(dnode_free_interior_lock_retry);
 1272                 kpreempt(KPREEMPT_SYNC);
 1273         }
 1274 
 1275         dnode_set_slots(children, idx, slots, DN_SLOT_FREE);
 1276         dnode_slots_rele(children, idx, slots);
 1277 }
 1278 
 1279 void
 1280 dnode_special_close(dnode_handle_t *dnh)
 1281 {
 1282         dnode_t *dn = dnh->dnh_dnode;
 1283 
 1284         /*
 1285          * Ensure dnode_rele_and_unlock() has released dn_mtx, after final
 1286          * zfs_refcount_remove()
 1287          */
 1288         mutex_enter(&dn->dn_mtx);
 1289         if (zfs_refcount_count(&dn->dn_holds) > 0)
 1290                 cv_wait(&dn->dn_nodnholds, &dn->dn_mtx);
 1291         mutex_exit(&dn->dn_mtx);
 1292         ASSERT3U(zfs_refcount_count(&dn->dn_holds), ==, 0);
 1293 
 1294         ASSERT(dn->dn_dbuf == NULL ||
 1295             dmu_buf_get_user(&dn->dn_dbuf->db) == NULL);
 1296         zrl_add(&dnh->dnh_zrlock);
 1297         dnode_destroy(dn); /* implicit zrl_remove() */
 1298         zrl_destroy(&dnh->dnh_zrlock);
 1299         dnh->dnh_dnode = NULL;
 1300 }
 1301 
 1302 void
 1303 dnode_special_open(objset_t *os, dnode_phys_t *dnp, uint64_t object,
 1304     dnode_handle_t *dnh)
 1305 {
 1306         dnode_t *dn;
 1307 
 1308         zrl_init(&dnh->dnh_zrlock);
 1309         VERIFY3U(1, ==, zrl_tryenter(&dnh->dnh_zrlock));
 1310 
 1311         dn = dnode_create(os, dnp, NULL, object, dnh);
 1312         DNODE_VERIFY(dn);
 1313 
 1314         zrl_exit(&dnh->dnh_zrlock);
 1315 }
 1316 
 1317 static void
 1318 dnode_buf_evict_async(void *dbu)
 1319 {
 1320         dnode_children_t *dnc = dbu;
 1321 
 1322         DNODE_STAT_BUMP(dnode_buf_evict);
 1323 
 1324         for (int i = 0; i < dnc->dnc_count; i++) {
 1325                 dnode_handle_t *dnh = &dnc->dnc_children[i];
 1326                 dnode_t *dn;
 1327 
 1328                 /*
 1329                  * The dnode handle lock guards against the dnode moving to
 1330                  * another valid address, so there is no need here to guard
 1331                  * against changes to or from NULL.
 1332                  */
 1333                 if (!DN_SLOT_IS_PTR(dnh->dnh_dnode)) {
 1334                         zrl_destroy(&dnh->dnh_zrlock);
 1335                         dnh->dnh_dnode = DN_SLOT_UNINIT;
 1336                         continue;
 1337                 }
 1338 
 1339                 zrl_add(&dnh->dnh_zrlock);
 1340                 dn = dnh->dnh_dnode;
 1341                 /*
 1342                  * If there are holds on this dnode, then there should
 1343                  * be holds on the dnode's containing dbuf as well; thus
 1344                  * it wouldn't be eligible for eviction and this function
 1345                  * would not have been called.
 1346                  */
 1347                 ASSERT(zfs_refcount_is_zero(&dn->dn_holds));
 1348                 ASSERT(zfs_refcount_is_zero(&dn->dn_tx_holds));
 1349 
 1350                 dnode_destroy(dn); /* implicit zrl_remove() for first slot */
 1351                 zrl_destroy(&dnh->dnh_zrlock);
 1352                 dnh->dnh_dnode = DN_SLOT_UNINIT;
 1353         }
 1354         kmem_free(dnc, sizeof (dnode_children_t) +
 1355             dnc->dnc_count * sizeof (dnode_handle_t));
 1356 }
 1357 
 1358 /*
 1359  * When the DNODE_MUST_BE_FREE flag is set, the "slots" parameter is used
 1360  * to ensure the hole at the specified object offset is large enough to
 1361  * hold the dnode being created. The slots parameter is also used to ensure
 1362  * a dnode does not span multiple dnode blocks. In both of these cases, if
 1363  * a failure occurs, ENOSPC is returned. Keep in mind, these failure cases
 1364  * are only possible when using DNODE_MUST_BE_FREE.
 1365  *
 1366  * If the DNODE_MUST_BE_ALLOCATED flag is set, "slots" must be 0.
 1367  * dnode_hold_impl() will check if the requested dnode is already consumed
 1368  * as an extra dnode slot by an large dnode, in which case it returns
 1369  * ENOENT.
 1370  *
 1371  * If the DNODE_DRY_RUN flag is set, we don't actually hold the dnode, just
 1372  * return whether the hold would succeed or not. tag and dnp should set to
 1373  * NULL in this case.
 1374  *
 1375  * errors:
 1376  * EINVAL - Invalid object number or flags.
 1377  * ENOSPC - Hole too small to fulfill "slots" request (DNODE_MUST_BE_FREE)
 1378  * EEXIST - Refers to an allocated dnode (DNODE_MUST_BE_FREE)
 1379  *        - Refers to a freeing dnode (DNODE_MUST_BE_FREE)
 1380  *        - Refers to an interior dnode slot (DNODE_MUST_BE_ALLOCATED)
 1381  * ENOENT - The requested dnode is not allocated (DNODE_MUST_BE_ALLOCATED)
 1382  *        - The requested dnode is being freed (DNODE_MUST_BE_ALLOCATED)
 1383  * EIO    - I/O error when reading the meta dnode dbuf.
 1384  *
 1385  * succeeds even for free dnodes.
 1386  */
 1387 int
 1388 dnode_hold_impl(objset_t *os, uint64_t object, int flag, int slots,
 1389     const void *tag, dnode_t **dnp)
 1390 {
 1391         int epb, idx, err;
 1392         int drop_struct_lock = FALSE;
 1393         int type;
 1394         uint64_t blk;
 1395         dnode_t *mdn, *dn;
 1396         dmu_buf_impl_t *db;
 1397         dnode_children_t *dnc;
 1398         dnode_phys_t *dn_block;
 1399         dnode_handle_t *dnh;
 1400 
 1401         ASSERT(!(flag & DNODE_MUST_BE_ALLOCATED) || (slots == 0));
 1402         ASSERT(!(flag & DNODE_MUST_BE_FREE) || (slots > 0));
 1403         IMPLY(flag & DNODE_DRY_RUN, (tag == NULL) && (dnp == NULL));
 1404 
 1405         /*
 1406          * If you are holding the spa config lock as writer, you shouldn't
 1407          * be asking the DMU to do *anything* unless it's the root pool
 1408          * which may require us to read from the root filesystem while
 1409          * holding some (not all) of the locks as writer.
 1410          */
 1411         ASSERT(spa_config_held(os->os_spa, SCL_ALL, RW_WRITER) == 0 ||
 1412             (spa_is_root(os->os_spa) &&
 1413             spa_config_held(os->os_spa, SCL_STATE, RW_WRITER)));
 1414 
 1415         ASSERT((flag & DNODE_MUST_BE_ALLOCATED) || (flag & DNODE_MUST_BE_FREE));
 1416 
 1417         if (object == DMU_USERUSED_OBJECT || object == DMU_GROUPUSED_OBJECT ||
 1418             object == DMU_PROJECTUSED_OBJECT) {
 1419                 if (object == DMU_USERUSED_OBJECT)
 1420                         dn = DMU_USERUSED_DNODE(os);
 1421                 else if (object == DMU_GROUPUSED_OBJECT)
 1422                         dn = DMU_GROUPUSED_DNODE(os);
 1423                 else
 1424                         dn = DMU_PROJECTUSED_DNODE(os);
 1425                 if (dn == NULL)
 1426                         return (SET_ERROR(ENOENT));
 1427                 type = dn->dn_type;
 1428                 if ((flag & DNODE_MUST_BE_ALLOCATED) && type == DMU_OT_NONE)
 1429                         return (SET_ERROR(ENOENT));
 1430                 if ((flag & DNODE_MUST_BE_FREE) && type != DMU_OT_NONE)
 1431                         return (SET_ERROR(EEXIST));
 1432                 DNODE_VERIFY(dn);
 1433                 /* Don't actually hold if dry run, just return 0 */
 1434                 if (!(flag & DNODE_DRY_RUN)) {
 1435                         (void) zfs_refcount_add(&dn->dn_holds, tag);
 1436                         *dnp = dn;
 1437                 }
 1438                 return (0);
 1439         }
 1440 
 1441         if (object == 0 || object >= DN_MAX_OBJECT)
 1442                 return (SET_ERROR(EINVAL));
 1443 
 1444         mdn = DMU_META_DNODE(os);
 1445         ASSERT(mdn->dn_object == DMU_META_DNODE_OBJECT);
 1446 
 1447         DNODE_VERIFY(mdn);
 1448 
 1449         if (!RW_WRITE_HELD(&mdn->dn_struct_rwlock)) {
 1450                 rw_enter(&mdn->dn_struct_rwlock, RW_READER);
 1451                 drop_struct_lock = TRUE;
 1452         }
 1453 
 1454         blk = dbuf_whichblock(mdn, 0, object * sizeof (dnode_phys_t));
 1455         db = dbuf_hold(mdn, blk, FTAG);
 1456         if (drop_struct_lock)
 1457                 rw_exit(&mdn->dn_struct_rwlock);
 1458         if (db == NULL) {
 1459                 DNODE_STAT_BUMP(dnode_hold_dbuf_hold);
 1460                 return (SET_ERROR(EIO));
 1461         }
 1462 
 1463         /*
 1464          * We do not need to decrypt to read the dnode so it doesn't matter
 1465          * if we get the encrypted or decrypted version.
 1466          */
 1467         err = dbuf_read(db, NULL, DB_RF_CANFAIL |
 1468             DB_RF_NO_DECRYPT | DB_RF_NOPREFETCH);
 1469         if (err) {
 1470                 DNODE_STAT_BUMP(dnode_hold_dbuf_read);
 1471                 dbuf_rele(db, FTAG);
 1472                 return (err);
 1473         }
 1474 
 1475         ASSERT3U(db->db.db_size, >=, 1<<DNODE_SHIFT);
 1476         epb = db->db.db_size >> DNODE_SHIFT;
 1477 
 1478         idx = object & (epb - 1);
 1479         dn_block = (dnode_phys_t *)db->db.db_data;
 1480 
 1481         ASSERT(DB_DNODE(db)->dn_type == DMU_OT_DNODE);
 1482         dnc = dmu_buf_get_user(&db->db);
 1483         dnh = NULL;
 1484         if (dnc == NULL) {
 1485                 dnode_children_t *winner;
 1486                 int skip = 0;
 1487 
 1488                 dnc = kmem_zalloc(sizeof (dnode_children_t) +
 1489                     epb * sizeof (dnode_handle_t), KM_SLEEP);
 1490                 dnc->dnc_count = epb;
 1491                 dnh = &dnc->dnc_children[0];
 1492 
 1493                 /* Initialize dnode slot status from dnode_phys_t */
 1494                 for (int i = 0; i < epb; i++) {
 1495                         zrl_init(&dnh[i].dnh_zrlock);
 1496 
 1497                         if (skip) {
 1498                                 skip--;
 1499                                 continue;
 1500                         }
 1501 
 1502                         if (dn_block[i].dn_type != DMU_OT_NONE) {
 1503                                 int interior = dn_block[i].dn_extra_slots;
 1504 
 1505                                 dnode_set_slots(dnc, i, 1, DN_SLOT_ALLOCATED);
 1506                                 dnode_set_slots(dnc, i + 1, interior,
 1507                                     DN_SLOT_INTERIOR);
 1508                                 skip = interior;
 1509                         } else {
 1510                                 dnh[i].dnh_dnode = DN_SLOT_FREE;
 1511                                 skip = 0;
 1512                         }
 1513                 }
 1514 
 1515                 dmu_buf_init_user(&dnc->dnc_dbu, NULL,
 1516                     dnode_buf_evict_async, NULL);
 1517                 winner = dmu_buf_set_user(&db->db, &dnc->dnc_dbu);
 1518                 if (winner != NULL) {
 1519 
 1520                         for (int i = 0; i < epb; i++)
 1521                                 zrl_destroy(&dnh[i].dnh_zrlock);
 1522 
 1523                         kmem_free(dnc, sizeof (dnode_children_t) +
 1524                             epb * sizeof (dnode_handle_t));
 1525                         dnc = winner;
 1526                 }
 1527         }
 1528 
 1529         ASSERT(dnc->dnc_count == epb);
 1530 
 1531         if (flag & DNODE_MUST_BE_ALLOCATED) {
 1532                 slots = 1;
 1533 
 1534                 dnode_slots_hold(dnc, idx, slots);
 1535                 dnh = &dnc->dnc_children[idx];
 1536 
 1537                 if (DN_SLOT_IS_PTR(dnh->dnh_dnode)) {
 1538                         dn = dnh->dnh_dnode;
 1539                 } else if (dnh->dnh_dnode == DN_SLOT_INTERIOR) {
 1540                         DNODE_STAT_BUMP(dnode_hold_alloc_interior);
 1541                         dnode_slots_rele(dnc, idx, slots);
 1542                         dbuf_rele(db, FTAG);
 1543                         return (SET_ERROR(EEXIST));
 1544                 } else if (dnh->dnh_dnode != DN_SLOT_ALLOCATED) {
 1545                         DNODE_STAT_BUMP(dnode_hold_alloc_misses);
 1546                         dnode_slots_rele(dnc, idx, slots);
 1547                         dbuf_rele(db, FTAG);
 1548                         return (SET_ERROR(ENOENT));
 1549                 } else {
 1550                         dnode_slots_rele(dnc, idx, slots);
 1551                         while (!dnode_slots_tryenter(dnc, idx, slots)) {
 1552                                 DNODE_STAT_BUMP(dnode_hold_alloc_lock_retry);
 1553                                 kpreempt(KPREEMPT_SYNC);
 1554                         }
 1555 
 1556                         /*
 1557                          * Someone else won the race and called dnode_create()
 1558                          * after we checked DN_SLOT_IS_PTR() above but before
 1559                          * we acquired the lock.
 1560                          */
 1561                         if (DN_SLOT_IS_PTR(dnh->dnh_dnode)) {
 1562                                 DNODE_STAT_BUMP(dnode_hold_alloc_lock_misses);
 1563                                 dn = dnh->dnh_dnode;
 1564                         } else {
 1565                                 dn = dnode_create(os, dn_block + idx, db,
 1566                                     object, dnh);
 1567                         }
 1568                 }
 1569 
 1570                 mutex_enter(&dn->dn_mtx);
 1571                 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg != 0) {
 1572                         DNODE_STAT_BUMP(dnode_hold_alloc_type_none);
 1573                         mutex_exit(&dn->dn_mtx);
 1574                         dnode_slots_rele(dnc, idx, slots);
 1575                         dbuf_rele(db, FTAG);
 1576                         return (SET_ERROR(ENOENT));
 1577                 }
 1578 
 1579                 /* Don't actually hold if dry run, just return 0 */
 1580                 if (flag & DNODE_DRY_RUN) {
 1581                         mutex_exit(&dn->dn_mtx);
 1582                         dnode_slots_rele(dnc, idx, slots);
 1583                         dbuf_rele(db, FTAG);
 1584                         return (0);
 1585                 }
 1586 
 1587                 DNODE_STAT_BUMP(dnode_hold_alloc_hits);
 1588         } else if (flag & DNODE_MUST_BE_FREE) {
 1589 
 1590                 if (idx + slots - 1 >= DNODES_PER_BLOCK) {
 1591                         DNODE_STAT_BUMP(dnode_hold_free_overflow);
 1592                         dbuf_rele(db, FTAG);
 1593                         return (SET_ERROR(ENOSPC));
 1594                 }
 1595 
 1596                 dnode_slots_hold(dnc, idx, slots);
 1597 
 1598                 if (!dnode_check_slots_free(dnc, idx, slots)) {
 1599                         DNODE_STAT_BUMP(dnode_hold_free_misses);
 1600                         dnode_slots_rele(dnc, idx, slots);
 1601                         dbuf_rele(db, FTAG);
 1602                         return (SET_ERROR(ENOSPC));
 1603                 }
 1604 
 1605                 dnode_slots_rele(dnc, idx, slots);
 1606                 while (!dnode_slots_tryenter(dnc, idx, slots)) {
 1607                         DNODE_STAT_BUMP(dnode_hold_free_lock_retry);
 1608                         kpreempt(KPREEMPT_SYNC);
 1609                 }
 1610 
 1611                 if (!dnode_check_slots_free(dnc, idx, slots)) {
 1612                         DNODE_STAT_BUMP(dnode_hold_free_lock_misses);
 1613                         dnode_slots_rele(dnc, idx, slots);
 1614                         dbuf_rele(db, FTAG);
 1615                         return (SET_ERROR(ENOSPC));
 1616                 }
 1617 
 1618                 /*
 1619                  * Allocated but otherwise free dnodes which would
 1620                  * be in the interior of a multi-slot dnodes need
 1621                  * to be freed.  Single slot dnodes can be safely
 1622                  * re-purposed as a performance optimization.
 1623                  */
 1624                 if (slots > 1)
 1625                         dnode_reclaim_slots(dnc, idx + 1, slots - 1);
 1626 
 1627                 dnh = &dnc->dnc_children[idx];
 1628                 if (DN_SLOT_IS_PTR(dnh->dnh_dnode)) {
 1629                         dn = dnh->dnh_dnode;
 1630                 } else {
 1631                         dn = dnode_create(os, dn_block + idx, db,
 1632                             object, dnh);
 1633                 }
 1634 
 1635                 mutex_enter(&dn->dn_mtx);
 1636                 if (!zfs_refcount_is_zero(&dn->dn_holds) || dn->dn_free_txg) {
 1637                         DNODE_STAT_BUMP(dnode_hold_free_refcount);
 1638                         mutex_exit(&dn->dn_mtx);
 1639                         dnode_slots_rele(dnc, idx, slots);
 1640                         dbuf_rele(db, FTAG);
 1641                         return (SET_ERROR(EEXIST));
 1642                 }
 1643 
 1644                 /* Don't actually hold if dry run, just return 0 */
 1645                 if (flag & DNODE_DRY_RUN) {
 1646                         mutex_exit(&dn->dn_mtx);
 1647                         dnode_slots_rele(dnc, idx, slots);
 1648                         dbuf_rele(db, FTAG);
 1649                         return (0);
 1650                 }
 1651 
 1652                 dnode_set_slots(dnc, idx + 1, slots - 1, DN_SLOT_INTERIOR);
 1653                 DNODE_STAT_BUMP(dnode_hold_free_hits);
 1654         } else {
 1655                 dbuf_rele(db, FTAG);
 1656                 return (SET_ERROR(EINVAL));
 1657         }
 1658 
 1659         ASSERT0(dn->dn_free_txg);
 1660 
 1661         if (zfs_refcount_add(&dn->dn_holds, tag) == 1)
 1662                 dbuf_add_ref(db, dnh);
 1663 
 1664         mutex_exit(&dn->dn_mtx);
 1665 
 1666         /* Now we can rely on the hold to prevent the dnode from moving. */
 1667         dnode_slots_rele(dnc, idx, slots);
 1668 
 1669         DNODE_VERIFY(dn);
 1670         ASSERT3P(dnp, !=, NULL);
 1671         ASSERT3P(dn->dn_dbuf, ==, db);
 1672         ASSERT3U(dn->dn_object, ==, object);
 1673         dbuf_rele(db, FTAG);
 1674 
 1675         *dnp = dn;
 1676         return (0);
 1677 }
 1678 
 1679 /*
 1680  * Return held dnode if the object is allocated, NULL if not.
 1681  */
 1682 int
 1683 dnode_hold(objset_t *os, uint64_t object, const void *tag, dnode_t **dnp)
 1684 {
 1685         return (dnode_hold_impl(os, object, DNODE_MUST_BE_ALLOCATED, 0, tag,
 1686             dnp));
 1687 }
 1688 
 1689 /*
 1690  * Can only add a reference if there is already at least one
 1691  * reference on the dnode.  Returns FALSE if unable to add a
 1692  * new reference.
 1693  */
 1694 boolean_t
 1695 dnode_add_ref(dnode_t *dn, const void *tag)
 1696 {
 1697         mutex_enter(&dn->dn_mtx);
 1698         if (zfs_refcount_is_zero(&dn->dn_holds)) {
 1699                 mutex_exit(&dn->dn_mtx);
 1700                 return (FALSE);
 1701         }
 1702         VERIFY(1 < zfs_refcount_add(&dn->dn_holds, tag));
 1703         mutex_exit(&dn->dn_mtx);
 1704         return (TRUE);
 1705 }
 1706 
 1707 void
 1708 dnode_rele(dnode_t *dn, const void *tag)
 1709 {
 1710         mutex_enter(&dn->dn_mtx);
 1711         dnode_rele_and_unlock(dn, tag, B_FALSE);
 1712 }
 1713 
 1714 void
 1715 dnode_rele_and_unlock(dnode_t *dn, const void *tag, boolean_t evicting)
 1716 {
 1717         uint64_t refs;
 1718         /* Get while the hold prevents the dnode from moving. */
 1719         dmu_buf_impl_t *db = dn->dn_dbuf;
 1720         dnode_handle_t *dnh = dn->dn_handle;
 1721 
 1722         refs = zfs_refcount_remove(&dn->dn_holds, tag);
 1723         if (refs == 0)
 1724                 cv_broadcast(&dn->dn_nodnholds);
 1725         mutex_exit(&dn->dn_mtx);
 1726         /* dnode could get destroyed at this point, so don't use it anymore */
 1727 
 1728         /*
 1729          * It's unsafe to release the last hold on a dnode by dnode_rele() or
 1730          * indirectly by dbuf_rele() while relying on the dnode handle to
 1731          * prevent the dnode from moving, since releasing the last hold could
 1732          * result in the dnode's parent dbuf evicting its dnode handles. For
 1733          * that reason anyone calling dnode_rele() or dbuf_rele() without some
 1734          * other direct or indirect hold on the dnode must first drop the dnode
 1735          * handle.
 1736          */
 1737 #ifdef ZFS_DEBUG
 1738         ASSERT(refs > 0 || dnh->dnh_zrlock.zr_owner != curthread);
 1739 #endif
 1740 
 1741         /* NOTE: the DNODE_DNODE does not have a dn_dbuf */
 1742         if (refs == 0 && db != NULL) {
 1743                 /*
 1744                  * Another thread could add a hold to the dnode handle in
 1745                  * dnode_hold_impl() while holding the parent dbuf. Since the
 1746                  * hold on the parent dbuf prevents the handle from being
 1747                  * destroyed, the hold on the handle is OK. We can't yet assert
 1748                  * that the handle has zero references, but that will be
 1749                  * asserted anyway when the handle gets destroyed.
 1750                  */
 1751                 mutex_enter(&db->db_mtx);
 1752                 dbuf_rele_and_unlock(db, dnh, evicting);
 1753         }
 1754 }
 1755 
 1756 /*
 1757  * Test whether we can create a dnode at the specified location.
 1758  */
 1759 int
 1760 dnode_try_claim(objset_t *os, uint64_t object, int slots)
 1761 {
 1762         return (dnode_hold_impl(os, object, DNODE_MUST_BE_FREE | DNODE_DRY_RUN,
 1763             slots, NULL, NULL));
 1764 }
 1765 
 1766 /*
 1767  * Checks if the dnode contains any uncommitted dirty records.
 1768  */
 1769 boolean_t
 1770 dnode_is_dirty(dnode_t *dn)
 1771 {
 1772         mutex_enter(&dn->dn_mtx);
 1773 
 1774         for (int i = 0; i < TXG_SIZE; i++) {
 1775                 if (multilist_link_active(&dn->dn_dirty_link[i])) {
 1776                         mutex_exit(&dn->dn_mtx);
 1777                         return (B_TRUE);
 1778                 }
 1779         }
 1780 
 1781         mutex_exit(&dn->dn_mtx);
 1782 
 1783         return (B_FALSE);
 1784 }
 1785 
 1786 void
 1787 dnode_setdirty(dnode_t *dn, dmu_tx_t *tx)
 1788 {
 1789         objset_t *os = dn->dn_objset;
 1790         uint64_t txg = tx->tx_txg;
 1791 
 1792         if (DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
 1793                 dsl_dataset_dirty(os->os_dsl_dataset, tx);
 1794                 return;
 1795         }
 1796 
 1797         DNODE_VERIFY(dn);
 1798 
 1799 #ifdef ZFS_DEBUG
 1800         mutex_enter(&dn->dn_mtx);
 1801         ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg);
 1802         ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg);
 1803         mutex_exit(&dn->dn_mtx);
 1804 #endif
 1805 
 1806         /*
 1807          * Determine old uid/gid when necessary
 1808          */
 1809         dmu_objset_userquota_get_ids(dn, B_TRUE, tx);
 1810 
 1811         multilist_t *dirtylist = &os->os_dirty_dnodes[txg & TXG_MASK];
 1812         multilist_sublist_t *mls = multilist_sublist_lock_obj(dirtylist, dn);
 1813 
 1814         /*
 1815          * If we are already marked dirty, we're done.
 1816          */
 1817         if (multilist_link_active(&dn->dn_dirty_link[txg & TXG_MASK])) {
 1818                 multilist_sublist_unlock(mls);
 1819                 return;
 1820         }
 1821 
 1822         ASSERT(!zfs_refcount_is_zero(&dn->dn_holds) ||
 1823             !avl_is_empty(&dn->dn_dbufs));
 1824         ASSERT(dn->dn_datablksz != 0);
 1825         ASSERT0(dn->dn_next_bonuslen[txg & TXG_MASK]);
 1826         ASSERT0(dn->dn_next_blksz[txg & TXG_MASK]);
 1827         ASSERT0(dn->dn_next_bonustype[txg & TXG_MASK]);
 1828 
 1829         dprintf_ds(os->os_dsl_dataset, "obj=%llu txg=%llu\n",
 1830             (u_longlong_t)dn->dn_object, (u_longlong_t)txg);
 1831 
 1832         multilist_sublist_insert_head(mls, dn);
 1833 
 1834         multilist_sublist_unlock(mls);
 1835 
 1836         /*
 1837          * The dnode maintains a hold on its containing dbuf as
 1838          * long as there are holds on it.  Each instantiated child
 1839          * dbuf maintains a hold on the dnode.  When the last child
 1840          * drops its hold, the dnode will drop its hold on the
 1841          * containing dbuf. We add a "dirty hold" here so that the
 1842          * dnode will hang around after we finish processing its
 1843          * children.
 1844          */
 1845         VERIFY(dnode_add_ref(dn, (void *)(uintptr_t)tx->tx_txg));
 1846 
 1847         (void) dbuf_dirty(dn->dn_dbuf, tx);
 1848 
 1849         dsl_dataset_dirty(os->os_dsl_dataset, tx);
 1850 }
 1851 
 1852 void
 1853 dnode_free(dnode_t *dn, dmu_tx_t *tx)
 1854 {
 1855         mutex_enter(&dn->dn_mtx);
 1856         if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg) {
 1857                 mutex_exit(&dn->dn_mtx);
 1858                 return;
 1859         }
 1860         dn->dn_free_txg = tx->tx_txg;
 1861         mutex_exit(&dn->dn_mtx);
 1862 
 1863         dnode_setdirty(dn, tx);
 1864 }
 1865 
 1866 /*
 1867  * Try to change the block size for the indicated dnode.  This can only
 1868  * succeed if there are no blocks allocated or dirty beyond first block
 1869  */
 1870 int
 1871 dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx)
 1872 {
 1873         dmu_buf_impl_t *db;
 1874         int err;
 1875 
 1876         ASSERT3U(size, <=, spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
 1877         if (size == 0)
 1878                 size = SPA_MINBLOCKSIZE;
 1879         else
 1880                 size = P2ROUNDUP(size, SPA_MINBLOCKSIZE);
 1881 
 1882         if (ibs == dn->dn_indblkshift)
 1883                 ibs = 0;
 1884 
 1885         if (size >> SPA_MINBLOCKSHIFT == dn->dn_datablkszsec && ibs == 0)
 1886                 return (0);
 1887 
 1888         rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
 1889 
 1890         /* Check for any allocated blocks beyond the first */
 1891         if (dn->dn_maxblkid != 0)
 1892                 goto fail;
 1893 
 1894         mutex_enter(&dn->dn_dbufs_mtx);
 1895         for (db = avl_first(&dn->dn_dbufs); db != NULL;
 1896             db = AVL_NEXT(&dn->dn_dbufs, db)) {
 1897                 if (db->db_blkid != 0 && db->db_blkid != DMU_BONUS_BLKID &&
 1898                     db->db_blkid != DMU_SPILL_BLKID) {
 1899                         mutex_exit(&dn->dn_dbufs_mtx);
 1900                         goto fail;
 1901                 }
 1902         }
 1903         mutex_exit(&dn->dn_dbufs_mtx);
 1904 
 1905         if (ibs && dn->dn_nlevels != 1)
 1906                 goto fail;
 1907 
 1908         /* resize the old block */
 1909         err = dbuf_hold_impl(dn, 0, 0, TRUE, FALSE, FTAG, &db);
 1910         if (err == 0) {
 1911                 dbuf_new_size(db, size, tx);
 1912         } else if (err != ENOENT) {
 1913                 goto fail;
 1914         }
 1915 
 1916         dnode_setdblksz(dn, size);
 1917         dnode_setdirty(dn, tx);
 1918         dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = size;
 1919         if (ibs) {
 1920                 dn->dn_indblkshift = ibs;
 1921                 dn->dn_next_indblkshift[tx->tx_txg&TXG_MASK] = ibs;
 1922         }
 1923         /* release after we have fixed the blocksize in the dnode */
 1924         if (db)
 1925                 dbuf_rele(db, FTAG);
 1926 
 1927         rw_exit(&dn->dn_struct_rwlock);
 1928         return (0);
 1929 
 1930 fail:
 1931         rw_exit(&dn->dn_struct_rwlock);
 1932         return (SET_ERROR(ENOTSUP));
 1933 }
 1934 
 1935 static void
 1936 dnode_set_nlevels_impl(dnode_t *dn, int new_nlevels, dmu_tx_t *tx)
 1937 {
 1938         uint64_t txgoff = tx->tx_txg & TXG_MASK;
 1939         int old_nlevels = dn->dn_nlevels;
 1940         dmu_buf_impl_t *db;
 1941         list_t *list;
 1942         dbuf_dirty_record_t *new, *dr, *dr_next;
 1943 
 1944         ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
 1945 
 1946         ASSERT3U(new_nlevels, >, dn->dn_nlevels);
 1947         dn->dn_nlevels = new_nlevels;
 1948 
 1949         ASSERT3U(new_nlevels, >, dn->dn_next_nlevels[txgoff]);
 1950         dn->dn_next_nlevels[txgoff] = new_nlevels;
 1951 
 1952         /* dirty the left indirects */
 1953         db = dbuf_hold_level(dn, old_nlevels, 0, FTAG);
 1954         ASSERT(db != NULL);
 1955         new = dbuf_dirty(db, tx);
 1956         dbuf_rele(db, FTAG);
 1957 
 1958         /* transfer the dirty records to the new indirect */
 1959         mutex_enter(&dn->dn_mtx);
 1960         mutex_enter(&new->dt.di.dr_mtx);
 1961         list = &dn->dn_dirty_records[txgoff];
 1962         for (dr = list_head(list); dr; dr = dr_next) {
 1963                 dr_next = list_next(&dn->dn_dirty_records[txgoff], dr);
 1964 
 1965                 IMPLY(dr->dr_dbuf == NULL, old_nlevels == 1);
 1966                 if (dr->dr_dbuf == NULL ||
 1967                     (dr->dr_dbuf->db_level == old_nlevels - 1 &&
 1968                     dr->dr_dbuf->db_blkid != DMU_BONUS_BLKID &&
 1969                     dr->dr_dbuf->db_blkid != DMU_SPILL_BLKID)) {
 1970                         list_remove(&dn->dn_dirty_records[txgoff], dr);
 1971                         list_insert_tail(&new->dt.di.dr_children, dr);
 1972                         dr->dr_parent = new;
 1973                 }
 1974         }
 1975         mutex_exit(&new->dt.di.dr_mtx);
 1976         mutex_exit(&dn->dn_mtx);
 1977 }
 1978 
 1979 int
 1980 dnode_set_nlevels(dnode_t *dn, int nlevels, dmu_tx_t *tx)
 1981 {
 1982         int ret = 0;
 1983 
 1984         rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
 1985 
 1986         if (dn->dn_nlevels == nlevels) {
 1987                 ret = 0;
 1988                 goto out;
 1989         } else if (nlevels < dn->dn_nlevels) {
 1990                 ret = SET_ERROR(EINVAL);
 1991                 goto out;
 1992         }
 1993 
 1994         dnode_set_nlevels_impl(dn, nlevels, tx);
 1995 
 1996 out:
 1997         rw_exit(&dn->dn_struct_rwlock);
 1998         return (ret);
 1999 }
 2000 
 2001 /* read-holding callers must not rely on the lock being continuously held */
 2002 void
 2003 dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx, boolean_t have_read,
 2004     boolean_t force)
 2005 {
 2006         int epbs, new_nlevels;
 2007         uint64_t sz;
 2008 
 2009         ASSERT(blkid != DMU_BONUS_BLKID);
 2010 
 2011         ASSERT(have_read ?
 2012             RW_READ_HELD(&dn->dn_struct_rwlock) :
 2013             RW_WRITE_HELD(&dn->dn_struct_rwlock));
 2014 
 2015         /*
 2016          * if we have a read-lock, check to see if we need to do any work
 2017          * before upgrading to a write-lock.
 2018          */
 2019         if (have_read) {
 2020                 if (blkid <= dn->dn_maxblkid)
 2021                         return;
 2022 
 2023                 if (!rw_tryupgrade(&dn->dn_struct_rwlock)) {
 2024                         rw_exit(&dn->dn_struct_rwlock);
 2025                         rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
 2026                 }
 2027         }
 2028 
 2029         /*
 2030          * Raw sends (indicated by the force flag) require that we take the
 2031          * given blkid even if the value is lower than the current value.
 2032          */
 2033         if (!force && blkid <= dn->dn_maxblkid)
 2034                 goto out;
 2035 
 2036         /*
 2037          * We use the (otherwise unused) top bit of dn_next_maxblkid[txgoff]
 2038          * to indicate that this field is set. This allows us to set the
 2039          * maxblkid to 0 on an existing object in dnode_sync().
 2040          */
 2041         dn->dn_maxblkid = blkid;
 2042         dn->dn_next_maxblkid[tx->tx_txg & TXG_MASK] =
 2043             blkid | DMU_NEXT_MAXBLKID_SET;
 2044 
 2045         /*
 2046          * Compute the number of levels necessary to support the new maxblkid.
 2047          * Raw sends will ensure nlevels is set correctly for us.
 2048          */
 2049         new_nlevels = 1;
 2050         epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
 2051         for (sz = dn->dn_nblkptr;
 2052             sz <= blkid && sz >= dn->dn_nblkptr; sz <<= epbs)
 2053                 new_nlevels++;
 2054 
 2055         ASSERT3U(new_nlevels, <=, DN_MAX_LEVELS);
 2056 
 2057         if (!force) {
 2058                 if (new_nlevels > dn->dn_nlevels)
 2059                         dnode_set_nlevels_impl(dn, new_nlevels, tx);
 2060         } else {
 2061                 ASSERT3U(dn->dn_nlevels, >=, new_nlevels);
 2062         }
 2063 
 2064 out:
 2065         if (have_read)
 2066                 rw_downgrade(&dn->dn_struct_rwlock);
 2067 }
 2068 
 2069 static void
 2070 dnode_dirty_l1(dnode_t *dn, uint64_t l1blkid, dmu_tx_t *tx)
 2071 {
 2072         dmu_buf_impl_t *db = dbuf_hold_level(dn, 1, l1blkid, FTAG);
 2073         if (db != NULL) {
 2074                 dmu_buf_will_dirty(&db->db, tx);
 2075                 dbuf_rele(db, FTAG);
 2076         }
 2077 }
 2078 
 2079 /*
 2080  * Dirty all the in-core level-1 dbufs in the range specified by start_blkid
 2081  * and end_blkid.
 2082  */
 2083 static void
 2084 dnode_dirty_l1range(dnode_t *dn, uint64_t start_blkid, uint64_t end_blkid,
 2085     dmu_tx_t *tx)
 2086 {
 2087         dmu_buf_impl_t *db_search;
 2088         dmu_buf_impl_t *db;
 2089         avl_index_t where;
 2090 
 2091         db_search = kmem_zalloc(sizeof (dmu_buf_impl_t), KM_SLEEP);
 2092 
 2093         mutex_enter(&dn->dn_dbufs_mtx);
 2094 
 2095         db_search->db_level = 1;
 2096         db_search->db_blkid = start_blkid + 1;
 2097         db_search->db_state = DB_SEARCH;
 2098         for (;;) {
 2099 
 2100                 db = avl_find(&dn->dn_dbufs, db_search, &where);
 2101                 if (db == NULL)
 2102                         db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
 2103 
 2104                 if (db == NULL || db->db_level != 1 ||
 2105                     db->db_blkid >= end_blkid) {
 2106                         break;
 2107                 }
 2108 
 2109                 /*
 2110                  * Setup the next blkid we want to search for.
 2111                  */
 2112                 db_search->db_blkid = db->db_blkid + 1;
 2113                 ASSERT3U(db->db_blkid, >=, start_blkid);
 2114 
 2115                 /*
 2116                  * If the dbuf transitions to DB_EVICTING while we're trying
 2117                  * to dirty it, then we will be unable to discover it in
 2118                  * the dbuf hash table. This will result in a call to
 2119                  * dbuf_create() which needs to acquire the dn_dbufs_mtx
 2120                  * lock. To avoid a deadlock, we drop the lock before
 2121                  * dirtying the level-1 dbuf.
 2122                  */
 2123                 mutex_exit(&dn->dn_dbufs_mtx);
 2124                 dnode_dirty_l1(dn, db->db_blkid, tx);
 2125                 mutex_enter(&dn->dn_dbufs_mtx);
 2126         }
 2127 
 2128 #ifdef ZFS_DEBUG
 2129         /*
 2130          * Walk all the in-core level-1 dbufs and verify they have been dirtied.
 2131          */
 2132         db_search->db_level = 1;
 2133         db_search->db_blkid = start_blkid + 1;
 2134         db_search->db_state = DB_SEARCH;
 2135         db = avl_find(&dn->dn_dbufs, db_search, &where);
 2136         if (db == NULL)
 2137                 db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
 2138         for (; db != NULL; db = AVL_NEXT(&dn->dn_dbufs, db)) {
 2139                 if (db->db_level != 1 || db->db_blkid >= end_blkid)
 2140                         break;
 2141                 if (db->db_state != DB_EVICTING)
 2142                         ASSERT(db->db_dirtycnt > 0);
 2143         }
 2144 #endif
 2145         kmem_free(db_search, sizeof (dmu_buf_impl_t));
 2146         mutex_exit(&dn->dn_dbufs_mtx);
 2147 }
 2148 
 2149 void
 2150 dnode_set_dirtyctx(dnode_t *dn, dmu_tx_t *tx, const void *tag)
 2151 {
 2152         /*
 2153          * Don't set dirtyctx to SYNC if we're just modifying this as we
 2154          * initialize the objset.
 2155          */
 2156         if (dn->dn_dirtyctx == DN_UNDIRTIED) {
 2157                 dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
 2158 
 2159                 if (ds != NULL) {
 2160                         rrw_enter(&ds->ds_bp_rwlock, RW_READER, tag);
 2161                 }
 2162                 if (!BP_IS_HOLE(dn->dn_objset->os_rootbp)) {
 2163                         if (dmu_tx_is_syncing(tx))
 2164                                 dn->dn_dirtyctx = DN_DIRTY_SYNC;
 2165                         else
 2166                                 dn->dn_dirtyctx = DN_DIRTY_OPEN;
 2167                         dn->dn_dirtyctx_firstset = tag;
 2168                 }
 2169                 if (ds != NULL) {
 2170                         rrw_exit(&ds->ds_bp_rwlock, tag);
 2171                 }
 2172         }
 2173 }
 2174 
 2175 static void
 2176 dnode_partial_zero(dnode_t *dn, uint64_t off, uint64_t blkoff, uint64_t len,
 2177     dmu_tx_t *tx)
 2178 {
 2179         dmu_buf_impl_t *db;
 2180         int res;
 2181 
 2182         rw_enter(&dn->dn_struct_rwlock, RW_READER);
 2183         res = dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off), TRUE, FALSE,
 2184             FTAG, &db);
 2185         rw_exit(&dn->dn_struct_rwlock);
 2186         if (res == 0) {
 2187                 db_lock_type_t dblt;
 2188                 boolean_t dirty;
 2189 
 2190                 dblt = dmu_buf_lock_parent(db, RW_READER, FTAG);
 2191                 /* don't dirty if not on disk and not dirty */
 2192                 dirty = !list_is_empty(&db->db_dirty_records) ||
 2193                     (db->db_blkptr && !BP_IS_HOLE(db->db_blkptr));
 2194                 dmu_buf_unlock_parent(db, dblt, FTAG);
 2195                 if (dirty) {
 2196                         caddr_t data;
 2197 
 2198                         dmu_buf_will_dirty(&db->db, tx);
 2199                         data = db->db.db_data;
 2200                         memset(data + blkoff, 0, len);
 2201                 }
 2202                 dbuf_rele(db, FTAG);
 2203         }
 2204 }
 2205 
 2206 void
 2207 dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx)
 2208 {
 2209         uint64_t blkoff, blkid, nblks;
 2210         int blksz, blkshift, head, tail;
 2211         int trunc = FALSE;
 2212         int epbs;
 2213 
 2214         blksz = dn->dn_datablksz;
 2215         blkshift = dn->dn_datablkshift;
 2216         epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
 2217 
 2218         if (len == DMU_OBJECT_END) {
 2219                 len = UINT64_MAX - off;
 2220                 trunc = TRUE;
 2221         }
 2222 
 2223         /*
 2224          * First, block align the region to free:
 2225          */
 2226         if (ISP2(blksz)) {
 2227                 head = P2NPHASE(off, blksz);
 2228                 blkoff = P2PHASE(off, blksz);
 2229                 if ((off >> blkshift) > dn->dn_maxblkid)
 2230                         return;
 2231         } else {
 2232                 ASSERT(dn->dn_maxblkid == 0);
 2233                 if (off == 0 && len >= blksz) {
 2234                         /*
 2235                          * Freeing the whole block; fast-track this request.
 2236                          */
 2237                         blkid = 0;
 2238                         nblks = 1;
 2239                         if (dn->dn_nlevels > 1) {
 2240                                 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
 2241                                 dnode_dirty_l1(dn, 0, tx);
 2242                                 rw_exit(&dn->dn_struct_rwlock);
 2243                         }
 2244                         goto done;
 2245                 } else if (off >= blksz) {
 2246                         /* Freeing past end-of-data */
 2247                         return;
 2248                 } else {
 2249                         /* Freeing part of the block. */
 2250                         head = blksz - off;
 2251                         ASSERT3U(head, >, 0);
 2252                 }
 2253                 blkoff = off;
 2254         }
 2255         /* zero out any partial block data at the start of the range */
 2256         if (head) {
 2257                 ASSERT3U(blkoff + head, ==, blksz);
 2258                 if (len < head)
 2259                         head = len;
 2260                 dnode_partial_zero(dn, off, blkoff, head, tx);
 2261                 off += head;
 2262                 len -= head;
 2263         }
 2264 
 2265         /* If the range was less than one block, we're done */
 2266         if (len == 0)
 2267                 return;
 2268 
 2269         /* If the remaining range is past end of file, we're done */
 2270         if ((off >> blkshift) > dn->dn_maxblkid)
 2271                 return;
 2272 
 2273         ASSERT(ISP2(blksz));
 2274         if (trunc)
 2275                 tail = 0;
 2276         else
 2277                 tail = P2PHASE(len, blksz);
 2278 
 2279         ASSERT0(P2PHASE(off, blksz));
 2280         /* zero out any partial block data at the end of the range */
 2281         if (tail) {
 2282                 if (len < tail)
 2283                         tail = len;
 2284                 dnode_partial_zero(dn, off + len, 0, tail, tx);
 2285                 len -= tail;
 2286         }
 2287 
 2288         /* If the range did not include a full block, we are done */
 2289         if (len == 0)
 2290                 return;
 2291 
 2292         ASSERT(IS_P2ALIGNED(off, blksz));
 2293         ASSERT(trunc || IS_P2ALIGNED(len, blksz));
 2294         blkid = off >> blkshift;
 2295         nblks = len >> blkshift;
 2296         if (trunc)
 2297                 nblks += 1;
 2298 
 2299         /*
 2300          * Dirty all the indirect blocks in this range.  Note that only
 2301          * the first and last indirect blocks can actually be written
 2302          * (if they were partially freed) -- they must be dirtied, even if
 2303          * they do not exist on disk yet.  The interior blocks will
 2304          * be freed by free_children(), so they will not actually be written.
 2305          * Even though these interior blocks will not be written, we
 2306          * dirty them for two reasons:
 2307          *
 2308          *  - It ensures that the indirect blocks remain in memory until
 2309          *    syncing context.  (They have already been prefetched by
 2310          *    dmu_tx_hold_free(), so we don't have to worry about reading
 2311          *    them serially here.)
 2312          *
 2313          *  - The dirty space accounting will put pressure on the txg sync
 2314          *    mechanism to begin syncing, and to delay transactions if there
 2315          *    is a large amount of freeing.  Even though these indirect
 2316          *    blocks will not be written, we could need to write the same
 2317          *    amount of space if we copy the freed BPs into deadlists.
 2318          */
 2319         if (dn->dn_nlevels > 1) {
 2320                 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
 2321                 uint64_t first, last;
 2322 
 2323                 first = blkid >> epbs;
 2324                 dnode_dirty_l1(dn, first, tx);
 2325                 if (trunc)
 2326                         last = dn->dn_maxblkid >> epbs;
 2327                 else
 2328                         last = (blkid + nblks - 1) >> epbs;
 2329                 if (last != first)
 2330                         dnode_dirty_l1(dn, last, tx);
 2331 
 2332                 dnode_dirty_l1range(dn, first, last, tx);
 2333 
 2334                 int shift = dn->dn_datablkshift + dn->dn_indblkshift -
 2335                     SPA_BLKPTRSHIFT;
 2336                 for (uint64_t i = first + 1; i < last; i++) {
 2337                         /*
 2338                          * Set i to the blockid of the next non-hole
 2339                          * level-1 indirect block at or after i.  Note
 2340                          * that dnode_next_offset() operates in terms of
 2341                          * level-0-equivalent bytes.
 2342                          */
 2343                         uint64_t ibyte = i << shift;
 2344                         int err = dnode_next_offset(dn, DNODE_FIND_HAVELOCK,
 2345                             &ibyte, 2, 1, 0);
 2346                         i = ibyte >> shift;
 2347                         if (i >= last)
 2348                                 break;
 2349 
 2350                         /*
 2351                          * Normally we should not see an error, either
 2352                          * from dnode_next_offset() or dbuf_hold_level()
 2353                          * (except for ESRCH from dnode_next_offset).
 2354                          * If there is an i/o error, then when we read
 2355                          * this block in syncing context, it will use
 2356                          * ZIO_FLAG_MUSTSUCCEED, and thus hang/panic according
 2357                          * to the "failmode" property.  dnode_next_offset()
 2358                          * doesn't have a flag to indicate MUSTSUCCEED.
 2359                          */
 2360                         if (err != 0)
 2361                                 break;
 2362 
 2363                         dnode_dirty_l1(dn, i, tx);
 2364                 }
 2365                 rw_exit(&dn->dn_struct_rwlock);
 2366         }
 2367 
 2368 done:
 2369         /*
 2370          * Add this range to the dnode range list.
 2371          * We will finish up this free operation in the syncing phase.
 2372          */
 2373         mutex_enter(&dn->dn_mtx);
 2374         {
 2375                 int txgoff = tx->tx_txg & TXG_MASK;
 2376                 if (dn->dn_free_ranges[txgoff] == NULL) {
 2377                         dn->dn_free_ranges[txgoff] = range_tree_create(NULL,
 2378                             RANGE_SEG64, NULL, 0, 0);
 2379                 }
 2380                 range_tree_clear(dn->dn_free_ranges[txgoff], blkid, nblks);
 2381                 range_tree_add(dn->dn_free_ranges[txgoff], blkid, nblks);
 2382         }
 2383         dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n",
 2384             (u_longlong_t)blkid, (u_longlong_t)nblks,
 2385             (u_longlong_t)tx->tx_txg);
 2386         mutex_exit(&dn->dn_mtx);
 2387 
 2388         dbuf_free_range(dn, blkid, blkid + nblks - 1, tx);
 2389         dnode_setdirty(dn, tx);
 2390 }
 2391 
 2392 static boolean_t
 2393 dnode_spill_freed(dnode_t *dn)
 2394 {
 2395         int i;
 2396 
 2397         mutex_enter(&dn->dn_mtx);
 2398         for (i = 0; i < TXG_SIZE; i++) {
 2399                 if (dn->dn_rm_spillblk[i] == DN_KILL_SPILLBLK)
 2400                         break;
 2401         }
 2402         mutex_exit(&dn->dn_mtx);
 2403         return (i < TXG_SIZE);
 2404 }
 2405 
 2406 /* return TRUE if this blkid was freed in a recent txg, or FALSE if it wasn't */
 2407 uint64_t
 2408 dnode_block_freed(dnode_t *dn, uint64_t blkid)
 2409 {
 2410         int i;
 2411 
 2412         if (blkid == DMU_BONUS_BLKID)
 2413                 return (FALSE);
 2414 
 2415         if (dn->dn_free_txg)
 2416                 return (TRUE);
 2417 
 2418         if (blkid == DMU_SPILL_BLKID)
 2419                 return (dnode_spill_freed(dn));
 2420 
 2421         mutex_enter(&dn->dn_mtx);
 2422         for (i = 0; i < TXG_SIZE; i++) {
 2423                 if (dn->dn_free_ranges[i] != NULL &&
 2424                     range_tree_contains(dn->dn_free_ranges[i], blkid, 1))
 2425                         break;
 2426         }
 2427         mutex_exit(&dn->dn_mtx);
 2428         return (i < TXG_SIZE);
 2429 }
 2430 
 2431 /* call from syncing context when we actually write/free space for this dnode */
 2432 void
 2433 dnode_diduse_space(dnode_t *dn, int64_t delta)
 2434 {
 2435         uint64_t space;
 2436         dprintf_dnode(dn, "dn=%p dnp=%p used=%llu delta=%lld\n",
 2437             dn, dn->dn_phys,
 2438             (u_longlong_t)dn->dn_phys->dn_used,
 2439             (longlong_t)delta);
 2440 
 2441         mutex_enter(&dn->dn_mtx);
 2442         space = DN_USED_BYTES(dn->dn_phys);
 2443         if (delta > 0) {
 2444                 ASSERT3U(space + delta, >=, space); /* no overflow */
 2445         } else {
 2446                 ASSERT3U(space, >=, -delta); /* no underflow */
 2447         }
 2448         space += delta;
 2449         if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_DNODE_BYTES) {
 2450                 ASSERT((dn->dn_phys->dn_flags & DNODE_FLAG_USED_BYTES) == 0);
 2451                 ASSERT0(P2PHASE(space, 1<<DEV_BSHIFT));
 2452                 dn->dn_phys->dn_used = space >> DEV_BSHIFT;
 2453         } else {
 2454                 dn->dn_phys->dn_used = space;
 2455                 dn->dn_phys->dn_flags |= DNODE_FLAG_USED_BYTES;
 2456         }
 2457         mutex_exit(&dn->dn_mtx);
 2458 }
 2459 
 2460 /*
 2461  * Scans a block at the indicated "level" looking for a hole or data,
 2462  * depending on 'flags'.
 2463  *
 2464  * If level > 0, then we are scanning an indirect block looking at its
 2465  * pointers.  If level == 0, then we are looking at a block of dnodes.
 2466  *
 2467  * If we don't find what we are looking for in the block, we return ESRCH.
 2468  * Otherwise, return with *offset pointing to the beginning (if searching
 2469  * forwards) or end (if searching backwards) of the range covered by the
 2470  * block pointer we matched on (or dnode).
 2471  *
 2472  * The basic search algorithm used below by dnode_next_offset() is to
 2473  * use this function to search up the block tree (widen the search) until
 2474  * we find something (i.e., we don't return ESRCH) and then search back
 2475  * down the tree (narrow the search) until we reach our original search
 2476  * level.
 2477  */
 2478 static int
 2479 dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset,
 2480     int lvl, uint64_t blkfill, uint64_t txg)
 2481 {
 2482         dmu_buf_impl_t *db = NULL;
 2483         void *data = NULL;
 2484         uint64_t epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
 2485         uint64_t epb = 1ULL << epbs;
 2486         uint64_t minfill, maxfill;
 2487         boolean_t hole;
 2488         int i, inc, error, span;
 2489 
 2490         ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
 2491 
 2492         hole = ((flags & DNODE_FIND_HOLE) != 0);
 2493         inc = (flags & DNODE_FIND_BACKWARDS) ? -1 : 1;
 2494         ASSERT(txg == 0 || !hole);
 2495 
 2496         if (lvl == dn->dn_phys->dn_nlevels) {
 2497                 error = 0;
 2498                 epb = dn->dn_phys->dn_nblkptr;
 2499                 data = dn->dn_phys->dn_blkptr;
 2500         } else {
 2501                 uint64_t blkid = dbuf_whichblock(dn, lvl, *offset);
 2502                 error = dbuf_hold_impl(dn, lvl, blkid, TRUE, FALSE, FTAG, &db);
 2503                 if (error) {
 2504                         if (error != ENOENT)
 2505                                 return (error);
 2506                         if (hole)
 2507                                 return (0);
 2508                         /*
 2509                          * This can only happen when we are searching up
 2510                          * the block tree for data.  We don't really need to
 2511                          * adjust the offset, as we will just end up looking
 2512                          * at the pointer to this block in its parent, and its
 2513                          * going to be unallocated, so we will skip over it.
 2514                          */
 2515                         return (SET_ERROR(ESRCH));
 2516                 }
 2517                 error = dbuf_read(db, NULL,
 2518                     DB_RF_CANFAIL | DB_RF_HAVESTRUCT |
 2519                     DB_RF_NO_DECRYPT | DB_RF_NOPREFETCH);
 2520                 if (error) {
 2521                         dbuf_rele(db, FTAG);
 2522                         return (error);
 2523                 }
 2524                 data = db->db.db_data;
 2525                 rw_enter(&db->db_rwlock, RW_READER);
 2526         }
 2527 
 2528         if (db != NULL && txg != 0 && (db->db_blkptr == NULL ||
 2529             db->db_blkptr->blk_birth <= txg ||
 2530             BP_IS_HOLE(db->db_blkptr))) {
 2531                 /*
 2532                  * This can only happen when we are searching up the tree
 2533                  * and these conditions mean that we need to keep climbing.
 2534                  */
 2535                 error = SET_ERROR(ESRCH);
 2536         } else if (lvl == 0) {
 2537                 dnode_phys_t *dnp = data;
 2538 
 2539                 ASSERT(dn->dn_type == DMU_OT_DNODE);
 2540                 ASSERT(!(flags & DNODE_FIND_BACKWARDS));
 2541 
 2542                 for (i = (*offset >> DNODE_SHIFT) & (blkfill - 1);
 2543                     i < blkfill; i += dnp[i].dn_extra_slots + 1) {
 2544                         if ((dnp[i].dn_type == DMU_OT_NONE) == hole)
 2545                                 break;
 2546                 }
 2547 
 2548                 if (i == blkfill)
 2549                         error = SET_ERROR(ESRCH);
 2550 
 2551                 *offset = (*offset & ~(DNODE_BLOCK_SIZE - 1)) +
 2552                     (i << DNODE_SHIFT);
 2553         } else {
 2554                 blkptr_t *bp = data;
 2555                 uint64_t start = *offset;
 2556                 span = (lvl - 1) * epbs + dn->dn_datablkshift;
 2557                 minfill = 0;
 2558                 maxfill = blkfill << ((lvl - 1) * epbs);
 2559 
 2560                 if (hole)
 2561                         maxfill--;
 2562                 else
 2563                         minfill++;
 2564 
 2565                 if (span >= 8 * sizeof (*offset)) {
 2566                         /* This only happens on the highest indirection level */
 2567                         ASSERT3U((lvl - 1), ==, dn->dn_phys->dn_nlevels - 1);
 2568                         *offset = 0;
 2569                 } else {
 2570                         *offset = *offset >> span;
 2571                 }
 2572 
 2573                 for (i = BF64_GET(*offset, 0, epbs);
 2574                     i >= 0 && i < epb; i += inc) {
 2575                         if (BP_GET_FILL(&bp[i]) >= minfill &&
 2576                             BP_GET_FILL(&bp[i]) <= maxfill &&
 2577                             (hole || bp[i].blk_birth > txg))
 2578                                 break;
 2579                         if (inc > 0 || *offset > 0)
 2580                                 *offset += inc;
 2581                 }
 2582 
 2583                 if (span >= 8 * sizeof (*offset)) {
 2584                         *offset = start;
 2585                 } else {
 2586                         *offset = *offset << span;
 2587                 }
 2588 
 2589                 if (inc < 0) {
 2590                         /* traversing backwards; position offset at the end */
 2591                         ASSERT3U(*offset, <=, start);
 2592                         *offset = MIN(*offset + (1ULL << span) - 1, start);
 2593                 } else if (*offset < start) {
 2594                         *offset = start;
 2595                 }
 2596                 if (i < 0 || i >= epb)
 2597                         error = SET_ERROR(ESRCH);
 2598         }
 2599 
 2600         if (db != NULL) {
 2601                 rw_exit(&db->db_rwlock);
 2602                 dbuf_rele(db, FTAG);
 2603         }
 2604 
 2605         return (error);
 2606 }
 2607 
 2608 /*
 2609  * Find the next hole, data, or sparse region at or after *offset.
 2610  * The value 'blkfill' tells us how many items we expect to find
 2611  * in an L0 data block; this value is 1 for normal objects,
 2612  * DNODES_PER_BLOCK for the meta dnode, and some fraction of
 2613  * DNODES_PER_BLOCK when searching for sparse regions thereof.
 2614  *
 2615  * Examples:
 2616  *
 2617  * dnode_next_offset(dn, flags, offset, 1, 1, 0);
 2618  *      Finds the next/previous hole/data in a file.
 2619  *      Used in dmu_offset_next().
 2620  *
 2621  * dnode_next_offset(mdn, flags, offset, 0, DNODES_PER_BLOCK, txg);
 2622  *      Finds the next free/allocated dnode an objset's meta-dnode.
 2623  *      Only finds objects that have new contents since txg (ie.
 2624  *      bonus buffer changes and content removal are ignored).
 2625  *      Used in dmu_object_next().
 2626  *
 2627  * dnode_next_offset(mdn, DNODE_FIND_HOLE, offset, 2, DNODES_PER_BLOCK >> 2, 0);
 2628  *      Finds the next L2 meta-dnode bp that's at most 1/4 full.
 2629  *      Used in dmu_object_alloc().
 2630  */
 2631 int
 2632 dnode_next_offset(dnode_t *dn, int flags, uint64_t *offset,
 2633     int minlvl, uint64_t blkfill, uint64_t txg)
 2634 {
 2635         uint64_t initial_offset = *offset;
 2636         int lvl, maxlvl;
 2637         int error = 0;
 2638 
 2639         if (!(flags & DNODE_FIND_HAVELOCK))
 2640                 rw_enter(&dn->dn_struct_rwlock, RW_READER);
 2641 
 2642         if (dn->dn_phys->dn_nlevels == 0) {
 2643                 error = SET_ERROR(ESRCH);
 2644                 goto out;
 2645         }
 2646 
 2647         if (dn->dn_datablkshift == 0) {
 2648                 if (*offset < dn->dn_datablksz) {
 2649                         if (flags & DNODE_FIND_HOLE)
 2650                                 *offset = dn->dn_datablksz;
 2651                 } else {
 2652                         error = SET_ERROR(ESRCH);
 2653                 }
 2654                 goto out;
 2655         }
 2656 
 2657         maxlvl = dn->dn_phys->dn_nlevels;
 2658 
 2659         for (lvl = minlvl; lvl <= maxlvl; lvl++) {
 2660                 error = dnode_next_offset_level(dn,
 2661                     flags, offset, lvl, blkfill, txg);
 2662                 if (error != ESRCH)
 2663                         break;
 2664         }
 2665 
 2666         while (error == 0 && --lvl >= minlvl) {
 2667                 error = dnode_next_offset_level(dn,
 2668                     flags, offset, lvl, blkfill, txg);
 2669         }
 2670 
 2671         /*
 2672          * There's always a "virtual hole" at the end of the object, even
 2673          * if all BP's which physically exist are non-holes.
 2674          */
 2675         if ((flags & DNODE_FIND_HOLE) && error == ESRCH && txg == 0 &&
 2676             minlvl == 1 && blkfill == 1 && !(flags & DNODE_FIND_BACKWARDS)) {
 2677                 error = 0;
 2678         }
 2679 
 2680         if (error == 0 && (flags & DNODE_FIND_BACKWARDS ?
 2681             initial_offset < *offset : initial_offset > *offset))
 2682                 error = SET_ERROR(ESRCH);
 2683 out:
 2684         if (!(flags & DNODE_FIND_HAVELOCK))
 2685                 rw_exit(&dn->dn_struct_rwlock);
 2686 
 2687         return (error);
 2688 }
 2689 
 2690 #if defined(_KERNEL)
 2691 EXPORT_SYMBOL(dnode_hold);
 2692 EXPORT_SYMBOL(dnode_rele);
 2693 EXPORT_SYMBOL(dnode_set_nlevels);
 2694 EXPORT_SYMBOL(dnode_set_blksz);
 2695 EXPORT_SYMBOL(dnode_free_range);
 2696 EXPORT_SYMBOL(dnode_evict_dbufs);
 2697 EXPORT_SYMBOL(dnode_evict_bonus);
 2698 #endif
 2699 
 2700 ZFS_MODULE_PARAM(zfs, zfs_, default_bs, INT, ZMOD_RW,
 2701         "Default dnode block shift");
 2702 ZFS_MODULE_PARAM(zfs, zfs_, default_ibs, INT, ZMOD_RW,
 2703         "Default dnode indirect block shift");

Cache object: 172934ece7af99c23d30fe6f6fea0eac


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.