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 }
|