Print this page
2619 asynchronous destruction of ZFS file systems
2747 SPA versioning with zfs feature flags
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <gwilson@delphix.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
Approved by: Dan McDonald <danmcd@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/dnode.c
          +++ new/usr/src/uts/common/fs/zfs/dnode.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
       23 + * Copyright (c) 2012 by Delphix. All rights reserved.
  23   24   */
  24   25  
  25   26  #include <sys/zfs_context.h>
  26   27  #include <sys/dbuf.h>
  27   28  #include <sys/dnode.h>
  28   29  #include <sys/dmu.h>
  29   30  #include <sys/dmu_impl.h>
  30   31  #include <sys/dmu_tx.h>
  31   32  #include <sys/dmu_objset.h>
  32   33  #include <sys/dsl_dir.h>
↓ open down ↓ 153 lines elided ↑ open up ↑
 186  187  #ifdef ZFS_DEBUG
 187  188  void
 188  189  dnode_verify(dnode_t *dn)
 189  190  {
 190  191          int drop_struct_lock = FALSE;
 191  192  
 192  193          ASSERT(dn->dn_phys);
 193  194          ASSERT(dn->dn_objset);
 194  195          ASSERT(dn->dn_handle->dnh_dnode == dn);
 195  196  
 196      -        ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
      197 +        ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
 197  198  
 198  199          if (!(zfs_flags & ZFS_DEBUG_DNODE_VERIFY))
 199  200                  return;
 200  201  
 201  202          if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
 202  203                  rw_enter(&dn->dn_struct_rwlock, RW_READER);
 203  204                  drop_struct_lock = TRUE;
 204  205          }
 205  206          if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) {
 206  207                  int i;
 207  208                  ASSERT3U(dn->dn_indblkshift, >=, 0);
 208  209                  ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT);
 209  210                  if (dn->dn_datablkshift) {
 210  211                          ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
 211  212                          ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
 212  213                          ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
 213  214                  }
 214  215                  ASSERT3U(dn->dn_nlevels, <=, 30);
 215      -                ASSERT3U(dn->dn_type, <=, DMU_OT_NUMTYPES);
      216 +                ASSERT(DMU_OT_IS_VALID(dn->dn_type));
 216  217                  ASSERT3U(dn->dn_nblkptr, >=, 1);
 217  218                  ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
 218  219                  ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN);
 219  220                  ASSERT3U(dn->dn_datablksz, ==,
 220  221                      dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
 221  222                  ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0);
 222  223                  ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) +
 223  224                      dn->dn_bonuslen, <=, DN_MAX_BONUSLEN);
 224  225                  for (i = 0; i < TXG_SIZE; i++) {
 225  226                          ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels);
↓ open down ↓ 45 lines elided ↑ open up ↑
 271  272          if (dnp->dn_bonuslen != 0) {
 272  273                  /*
 273  274                   * Note that the bonus length calculated here may be
 274  275                   * longer than the actual bonus buffer.  This is because
 275  276                   * we always put the bonus buffer after the last block
 276  277                   * pointer (instead of packing it against the end of the
 277  278                   * dnode buffer).
 278  279                   */
 279  280                  int off = (dnp->dn_nblkptr-1) * sizeof (blkptr_t);
 280  281                  size_t len = DN_MAX_BONUSLEN - off;
 281      -                ASSERT3U(dnp->dn_bonustype, <, DMU_OT_NUMTYPES);
 282      -                dmu_ot[dnp->dn_bonustype].ot_byteswap(dnp->dn_bonus + off, len);
      282 +                ASSERT(DMU_OT_IS_VALID(dnp->dn_bonustype));
      283 +                dmu_object_byteswap_t byteswap =
      284 +                    DMU_OT_BYTESWAP(dnp->dn_bonustype);
      285 +                dmu_ot_byteswap[byteswap].ob_func(dnp->dn_bonus + off, len);
 283  286          }
 284  287  
 285  288          /* Swap SPILL block if we have one */
 286  289          if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR)
 287  290                  byteswap_uint64_array(&dnp->dn_spill, sizeof (blkptr_t));
 288  291  
 289  292  }
 290  293  
 291  294  void
 292  295  dnode_buf_byteswap(void *vbuf, size_t size)
↓ open down ↓ 107 lines elided ↑ open up ↑
 400  403          dn->dn_checksum = dnp->dn_checksum;
 401  404          dn->dn_compress = dnp->dn_compress;
 402  405          dn->dn_bonustype = dnp->dn_bonustype;
 403  406          dn->dn_bonuslen = dnp->dn_bonuslen;
 404  407          dn->dn_maxblkid = dnp->dn_maxblkid;
 405  408          dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0);
 406  409          dn->dn_id_flags = 0;
 407  410  
 408  411          dmu_zfetch_init(&dn->dn_zfetch, dn);
 409  412  
 410      -        ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
      413 +        ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
 411  414  
 412  415          mutex_enter(&os->os_lock);
 413  416          list_insert_head(&os->os_dnodes, dn);
 414  417          membar_producer();
 415  418          /*
 416  419           * Everything else must be valid before assigning dn_objset makes the
 417  420           * dnode eligible for dnode_move().
 418  421           */
 419  422          dn->dn_objset = os;
 420  423          mutex_exit(&os->os_lock);
↓ open down ↓ 68 lines elided ↑ open up ↑
 489  492  
 490  493          ibs = MIN(MAX(ibs, DN_MIN_INDBLKSHIFT), DN_MAX_INDBLKSHIFT);
 491  494  
 492  495          dprintf("os=%p obj=%llu txg=%llu blocksize=%d ibs=%d\n", dn->dn_objset,
 493  496              dn->dn_object, tx->tx_txg, blocksize, ibs);
 494  497  
 495  498          ASSERT(dn->dn_type == DMU_OT_NONE);
 496  499          ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0);
 497  500          ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
 498  501          ASSERT(ot != DMU_OT_NONE);
 499      -        ASSERT3U(ot, <, DMU_OT_NUMTYPES);
      502 +        ASSERT(DMU_OT_IS_VALID(ot));
 500  503          ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
 501  504              (bonustype == DMU_OT_SA && bonuslen == 0) ||
 502  505              (bonustype != DMU_OT_NONE && bonuslen != 0));
 503      -        ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
      506 +        ASSERT(DMU_OT_IS_VALID(bonustype));
 504  507          ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
 505  508          ASSERT(dn->dn_type == DMU_OT_NONE);
 506  509          ASSERT3U(dn->dn_maxblkid, ==, 0);
 507  510          ASSERT3U(dn->dn_allocated_txg, ==, 0);
 508  511          ASSERT3U(dn->dn_assigned_txg, ==, 0);
 509  512          ASSERT(refcount_is_zero(&dn->dn_tx_holds));
 510  513          ASSERT3U(refcount_count(&dn->dn_holds), <=, 1);
 511  514          ASSERT3P(list_head(&dn->dn_dbufs), ==, NULL);
 512  515  
 513  516          for (i = 0; i < TXG_SIZE; i++) {
↓ open down ↓ 47 lines elided ↑ open up ↑
 561  564          int nblkptr;
 562  565  
 563  566          ASSERT3U(blocksize, >=, SPA_MINBLOCKSIZE);
 564  567          ASSERT3U(blocksize, <=, SPA_MAXBLOCKSIZE);
 565  568          ASSERT3U(blocksize % SPA_MINBLOCKSIZE, ==, 0);
 566  569          ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
 567  570          ASSERT(tx->tx_txg != 0);
 568  571          ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
 569  572              (bonustype != DMU_OT_NONE && bonuslen != 0) ||
 570  573              (bonustype == DMU_OT_SA && bonuslen == 0));
 571      -        ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
      574 +        ASSERT(DMU_OT_IS_VALID(bonustype));
 572  575          ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
 573  576  
 574  577          /* clean up any unreferenced dbufs */
 575  578          dnode_evict_dbufs(dn);
 576  579  
 577  580          dn->dn_id_flags = 0;
 578  581  
 579  582          rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
 580  583          dnode_setdirty(dn, tx);
 581  584          if (dn->dn_datablksz != blocksize) {
↓ open down ↓ 1412 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX