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>


 602             data, size, done, private,
 603             ZIO_TYPE_READ, priority, flags, NULL, 0, zb,
 604             ZIO_STAGE_OPEN, (flags & ZIO_FLAG_DDT_CHILD) ?
 605             ZIO_DDT_CHILD_READ_PIPELINE : ZIO_READ_PIPELINE);
 606 
 607         return (zio);
 608 }
 609 
 610 zio_t *
 611 zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
 612     void *data, uint64_t size, const zio_prop_t *zp,
 613     zio_done_func_t *ready, zio_done_func_t *done, void *private,
 614     int priority, enum zio_flag flags, const zbookmark_t *zb)
 615 {
 616         zio_t *zio;
 617 
 618         ASSERT(zp->zp_checksum >= ZIO_CHECKSUM_OFF &&
 619             zp->zp_checksum < ZIO_CHECKSUM_FUNCTIONS &&
 620             zp->zp_compress >= ZIO_COMPRESS_OFF &&
 621             zp->zp_compress < ZIO_COMPRESS_FUNCTIONS &&
 622             zp->zp_type < DMU_OT_NUMTYPES &&
 623             zp->zp_level < 32 &&
 624             zp->zp_copies > 0 &&
 625             zp->zp_copies <= spa_max_replication(spa) &&
 626             zp->zp_dedup <= 1 &&
 627             zp->zp_dedup_verify <= 1);
 628 
 629         zio = zio_create(pio, spa, txg, bp, data, size, done, private,
 630             ZIO_TYPE_WRITE, priority, flags, NULL, 0, zb,
 631             ZIO_STAGE_OPEN, (flags & ZIO_FLAG_DDT_CHILD) ?
 632             ZIO_DDT_CHILD_WRITE_PIPELINE : ZIO_WRITE_PIPELINE);
 633 
 634         zio->io_ready = ready;
 635         zio->io_prop = *zp;
 636 
 637         return (zio);
 638 }
 639 
 640 zio_t *
 641 zio_rewrite(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp, void *data,
 642     uint64_t size, zio_done_func_t *done, void *private, int priority,


 886 /*
 887  * ==========================================================================
 888  * Prepare to read and write logical blocks
 889  * ==========================================================================
 890  */
 891 
 892 static int
 893 zio_read_bp_init(zio_t *zio)
 894 {
 895         blkptr_t *bp = zio->io_bp;
 896 
 897         if (BP_GET_COMPRESS(bp) != ZIO_COMPRESS_OFF &&
 898             zio->io_child_type == ZIO_CHILD_LOGICAL &&
 899             !(zio->io_flags & ZIO_FLAG_RAW)) {
 900                 uint64_t psize = BP_GET_PSIZE(bp);
 901                 void *cbuf = zio_buf_alloc(psize);
 902 
 903                 zio_push_transform(zio, cbuf, psize, psize, zio_decompress);
 904         }
 905 
 906         if (!dmu_ot[BP_GET_TYPE(bp)].ot_metadata && BP_GET_LEVEL(bp) == 0)
 907                 zio->io_flags |= ZIO_FLAG_DONT_CACHE;
 908 
 909         if (BP_GET_TYPE(bp) == DMU_OT_DDT_ZAP)
 910                 zio->io_flags |= ZIO_FLAG_DONT_CACHE;
 911 
 912         if (BP_GET_DEDUP(bp) && zio->io_child_type == ZIO_CHILD_LOGICAL)
 913                 zio->io_pipeline = ZIO_DDT_READ_PIPELINE;
 914 
 915         return (ZIO_PIPELINE_CONTINUE);
 916 }
 917 
 918 static int
 919 zio_write_bp_init(zio_t *zio)
 920 {
 921         spa_t *spa = zio->io_spa;
 922         zio_prop_t *zp = &zio->io_prop;
 923         enum zio_compress compress = zp->zp_compress;
 924         blkptr_t *bp = zio->io_bp;
 925         uint64_t lsize = zio->io_size;
 926         uint64_t psize = lsize;


2972         zio_free_bp_init,
2973         zio_issue_async,
2974         zio_write_bp_init,
2975         zio_checksum_generate,
2976         zio_ddt_read_start,
2977         zio_ddt_read_done,
2978         zio_ddt_write,
2979         zio_ddt_free,
2980         zio_gang_assemble,
2981         zio_gang_issue,
2982         zio_dva_allocate,
2983         zio_dva_free,
2984         zio_dva_claim,
2985         zio_ready,
2986         zio_vdev_io_start,
2987         zio_vdev_io_done,
2988         zio_vdev_io_assess,
2989         zio_checksum_verify,
2990         zio_done
2991 };












































 602             data, size, done, private,
 603             ZIO_TYPE_READ, priority, flags, NULL, 0, zb,
 604             ZIO_STAGE_OPEN, (flags & ZIO_FLAG_DDT_CHILD) ?
 605             ZIO_DDT_CHILD_READ_PIPELINE : ZIO_READ_PIPELINE);
 606 
 607         return (zio);
 608 }
 609 
 610 zio_t *
 611 zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
 612     void *data, uint64_t size, const zio_prop_t *zp,
 613     zio_done_func_t *ready, zio_done_func_t *done, void *private,
 614     int priority, enum zio_flag flags, const zbookmark_t *zb)
 615 {
 616         zio_t *zio;
 617 
 618         ASSERT(zp->zp_checksum >= ZIO_CHECKSUM_OFF &&
 619             zp->zp_checksum < ZIO_CHECKSUM_FUNCTIONS &&
 620             zp->zp_compress >= ZIO_COMPRESS_OFF &&
 621             zp->zp_compress < ZIO_COMPRESS_FUNCTIONS &&
 622             DMU_OT_IS_VALID(zp->zp_type) &&
 623             zp->zp_level < 32 &&
 624             zp->zp_copies > 0 &&
 625             zp->zp_copies <= spa_max_replication(spa) &&
 626             zp->zp_dedup <= 1 &&
 627             zp->zp_dedup_verify <= 1);
 628 
 629         zio = zio_create(pio, spa, txg, bp, data, size, done, private,
 630             ZIO_TYPE_WRITE, priority, flags, NULL, 0, zb,
 631             ZIO_STAGE_OPEN, (flags & ZIO_FLAG_DDT_CHILD) ?
 632             ZIO_DDT_CHILD_WRITE_PIPELINE : ZIO_WRITE_PIPELINE);
 633 
 634         zio->io_ready = ready;
 635         zio->io_prop = *zp;
 636 
 637         return (zio);
 638 }
 639 
 640 zio_t *
 641 zio_rewrite(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp, void *data,
 642     uint64_t size, zio_done_func_t *done, void *private, int priority,


 886 /*
 887  * ==========================================================================
 888  * Prepare to read and write logical blocks
 889  * ==========================================================================
 890  */
 891 
 892 static int
 893 zio_read_bp_init(zio_t *zio)
 894 {
 895         blkptr_t *bp = zio->io_bp;
 896 
 897         if (BP_GET_COMPRESS(bp) != ZIO_COMPRESS_OFF &&
 898             zio->io_child_type == ZIO_CHILD_LOGICAL &&
 899             !(zio->io_flags & ZIO_FLAG_RAW)) {
 900                 uint64_t psize = BP_GET_PSIZE(bp);
 901                 void *cbuf = zio_buf_alloc(psize);
 902 
 903                 zio_push_transform(zio, cbuf, psize, psize, zio_decompress);
 904         }
 905 
 906         if (!DMU_OT_IS_METADATA(BP_GET_TYPE(bp)) && BP_GET_LEVEL(bp) == 0)
 907                 zio->io_flags |= ZIO_FLAG_DONT_CACHE;
 908 
 909         if (BP_GET_TYPE(bp) == DMU_OT_DDT_ZAP)
 910                 zio->io_flags |= ZIO_FLAG_DONT_CACHE;
 911 
 912         if (BP_GET_DEDUP(bp) && zio->io_child_type == ZIO_CHILD_LOGICAL)
 913                 zio->io_pipeline = ZIO_DDT_READ_PIPELINE;
 914 
 915         return (ZIO_PIPELINE_CONTINUE);
 916 }
 917 
 918 static int
 919 zio_write_bp_init(zio_t *zio)
 920 {
 921         spa_t *spa = zio->io_spa;
 922         zio_prop_t *zp = &zio->io_prop;
 923         enum zio_compress compress = zp->zp_compress;
 924         blkptr_t *bp = zio->io_bp;
 925         uint64_t lsize = zio->io_size;
 926         uint64_t psize = lsize;


2972         zio_free_bp_init,
2973         zio_issue_async,
2974         zio_write_bp_init,
2975         zio_checksum_generate,
2976         zio_ddt_read_start,
2977         zio_ddt_read_done,
2978         zio_ddt_write,
2979         zio_ddt_free,
2980         zio_gang_assemble,
2981         zio_gang_issue,
2982         zio_dva_allocate,
2983         zio_dva_free,
2984         zio_dva_claim,
2985         zio_ready,
2986         zio_vdev_io_start,
2987         zio_vdev_io_done,
2988         zio_vdev_io_assess,
2989         zio_checksum_verify,
2990         zio_done
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 }