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/zio.c
          +++ new/usr/src/uts/common/fs/zfs/zio.c
↓ open down ↓ 611 lines elided ↑ open up ↑
 612  612      void *data, uint64_t size, const zio_prop_t *zp,
 613  613      zio_done_func_t *ready, zio_done_func_t *done, void *private,
 614  614      int priority, enum zio_flag flags, const zbookmark_t *zb)
 615  615  {
 616  616          zio_t *zio;
 617  617  
 618  618          ASSERT(zp->zp_checksum >= ZIO_CHECKSUM_OFF &&
 619  619              zp->zp_checksum < ZIO_CHECKSUM_FUNCTIONS &&
 620  620              zp->zp_compress >= ZIO_COMPRESS_OFF &&
 621  621              zp->zp_compress < ZIO_COMPRESS_FUNCTIONS &&
 622      -            zp->zp_type < DMU_OT_NUMTYPES &&
      622 +            DMU_OT_IS_VALID(zp->zp_type) &&
 623  623              zp->zp_level < 32 &&
 624  624              zp->zp_copies > 0 &&
 625  625              zp->zp_copies <= spa_max_replication(spa) &&
 626  626              zp->zp_dedup <= 1 &&
 627  627              zp->zp_dedup_verify <= 1);
 628  628  
 629  629          zio = zio_create(pio, spa, txg, bp, data, size, done, private,
 630  630              ZIO_TYPE_WRITE, priority, flags, NULL, 0, zb,
 631  631              ZIO_STAGE_OPEN, (flags & ZIO_FLAG_DDT_CHILD) ?
 632  632              ZIO_DDT_CHILD_WRITE_PIPELINE : ZIO_WRITE_PIPELINE);
↓ open down ↓ 263 lines elided ↑ open up ↑
 896  896  
 897  897          if (BP_GET_COMPRESS(bp) != ZIO_COMPRESS_OFF &&
 898  898              zio->io_child_type == ZIO_CHILD_LOGICAL &&
 899  899              !(zio->io_flags & ZIO_FLAG_RAW)) {
 900  900                  uint64_t psize = BP_GET_PSIZE(bp);
 901  901                  void *cbuf = zio_buf_alloc(psize);
 902  902  
 903  903                  zio_push_transform(zio, cbuf, psize, psize, zio_decompress);
 904  904          }
 905  905  
 906      -        if (!dmu_ot[BP_GET_TYPE(bp)].ot_metadata && BP_GET_LEVEL(bp) == 0)
      906 +        if (!DMU_OT_IS_METADATA(BP_GET_TYPE(bp)) && BP_GET_LEVEL(bp) == 0)
 907  907                  zio->io_flags |= ZIO_FLAG_DONT_CACHE;
 908  908  
 909  909          if (BP_GET_TYPE(bp) == DMU_OT_DDT_ZAP)
 910  910                  zio->io_flags |= ZIO_FLAG_DONT_CACHE;
 911  911  
 912  912          if (BP_GET_DEDUP(bp) && zio->io_child_type == ZIO_CHILD_LOGICAL)
 913  913                  zio->io_pipeline = ZIO_DDT_READ_PIPELINE;
 914  914  
 915  915          return (ZIO_PIPELINE_CONTINUE);
 916  916  }
↓ open down ↓ 2065 lines elided ↑ open up ↑
2982 2982          zio_dva_allocate,
2983 2983          zio_dva_free,
2984 2984          zio_dva_claim,
2985 2985          zio_ready,
2986 2986          zio_vdev_io_start,
2987 2987          zio_vdev_io_done,
2988 2988          zio_vdev_io_assess,
2989 2989          zio_checksum_verify,
2990 2990          zio_done
2991 2991  };
     2992 +
     2993 +/* dnp is the dnode for zb1->zb_object */
     2994 +boolean_t
     2995 +zbookmark_is_before(const dnode_phys_t *dnp, const zbookmark_t *zb1,
     2996 +    const zbookmark_t *zb2)
     2997 +{
     2998 +        uint64_t zb1nextL0, zb2thisobj;
     2999 +
     3000 +        ASSERT(zb1->zb_objset == zb2->zb_objset);
     3001 +        ASSERT(zb2->zb_level == 0);
     3002 +
     3003 +        /*
     3004 +         * A bookmark in the deadlist is considered to be after
     3005 +         * everything else.
     3006 +         */
     3007 +        if (zb2->zb_object == DMU_DEADLIST_OBJECT)
     3008 +                return (B_TRUE);
     3009 +
     3010 +        /* The objset_phys_t isn't before anything. */
     3011 +        if (dnp == NULL)
     3012 +                return (B_FALSE);
     3013 +
     3014 +        zb1nextL0 = (zb1->zb_blkid + 1) <<
     3015 +            ((zb1->zb_level) * (dnp->dn_indblkshift - SPA_BLKPTRSHIFT));
     3016 +
     3017 +        zb2thisobj = zb2->zb_object ? zb2->zb_object :
     3018 +            zb2->zb_blkid << (DNODE_BLOCK_SHIFT - DNODE_SHIFT);
     3019 +
     3020 +        if (zb1->zb_object == DMU_META_DNODE_OBJECT) {
     3021 +                uint64_t nextobj = zb1nextL0 *
     3022 +                    (dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT) >> DNODE_SHIFT;
     3023 +                return (nextobj <= zb2thisobj);
     3024 +        }
     3025 +
     3026 +        if (zb1->zb_object < zb2thisobj)
     3027 +                return (B_TRUE);
     3028 +        if (zb1->zb_object > zb2thisobj)
     3029 +                return (B_FALSE);
     3030 +        if (zb2->zb_object == DMU_META_DNODE_OBJECT)
     3031 +                return (B_FALSE);
     3032 +        return (zb1nextL0 <= zb2->zb_blkid);
     3033 +}
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX