Print this page
NEX-13140 DVA-throttle support for special-class
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-9752 backport illumos 6950 ARC should cache compressed data
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
6950 ARC should cache compressed data
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Don Brady <don.brady@intel.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
NEX-5795 Rename 'wrc' as 'wbc' in the source and in the tech docs
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
NEX-5318 Cleanup specialclass property (obsolete, not used) and fix related meta-to-special case
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
NEX-5058 WBC: Race between the purging of window and opening new one
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
NEX-2830 ZFS smart compression
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
4185 add new cryptographic checksums to ZFS: SHA-512, Skein, Edon-R (fix studio build)
4185 add new cryptographic checksums to ZFS: SHA-512, Skein, Edon-R
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Approved by: Garrett D'Amore <garrett@damore.org>
NEX-4582 update wrc test cases for allow to use write back cache per tree of datasets
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
5960 zfs recv should prefetch indirect blocks
5925 zfs receive -o origin=
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
NEX-4476 WRC: Allow to use write back cache per tree of datasets
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
Revert "NEX-4476 WRC: Allow to use write back cache per tree of datasets"
This reverts commit fe97b74444278a6f36fec93179133641296312da.
NEX-4476 WRC: Allow to use write back cache per tree of datasets
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
NEX-4044 remove sha1crc32 in preparation with upstream merge of edon-r and skien
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Alek Pinchuk <alek@nexenta.com>
Conflicts:
        usr/src/uts/common/fs/zfs/sys/zio_checksum.h
NEX-4028 use lz4 by default
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
NEX-4003 WRC: System panics on debug build
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
NEX-3508 CLONE - Port NEX-2946 Add UNMAP/TRIM functionality to ZFS and illumos
Reviewed by: Josef Sipek <josef.sipek@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Conflicts:
    usr/src/uts/common/io/scsi/targets/sd.c
    usr/src/uts/common/sys/scsi/targets/sddef.h
OS-80 support for vdev and CoS properties for the new I/O scheduler
OS-95 lint warning introduced by OS-61
OS-70 remove zio timer code
Issues #7: Reconsile L2ARC and "special" use by datasets
Support for secondarycache=data option
Align mutex tables in arc.c and dbuf.c to 64 bytes (cache line), place each kmutex_t on cache line by itself to avoid false sharing
re #12643 rb4064 ZFS meta refactoring - vdev utilization tracking, auto-dedup
re #12585 rb4049 ZFS++ work port - refactoring to improve separation of open/closed code, bug fixes, performance improvements - open code
re #12393 rb3935 Kerberos and smbd disagree about who is our AD server (fix elf runtime attributes check)
re #11612 rb3907 Failing vdev of a mirrored pool should not take zfs operations out of action for extended periods of time.
re #8346 rb2639 KT disk failures
Bug 11205: add missing libzfs_closed_stubs.c to fix opensource-only build.
ZFS plus work: special vdevs, cos, cos/vdev properties

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/sys/zio.h
          +++ new/usr/src/uts/common/fs/zfs/sys/zio.h
↓ open down ↓ 13 lines elided ↑ open up ↑
  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  /*
  23   23   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  24      - * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
       24 + * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
  25   25   * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
  26   26   * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
  27   27   * Copyright (c) 2013, Joyent, Inc. All rights reserved.
  28   28   * Copyright 2016 Toomas Soome <tsoome@me.com>
  29   29   */
  30   30  
  31   31  #ifndef _ZIO_H
  32   32  #define _ZIO_H
  33   33  
  34   34  #include <sys/zio_priority.h>
↓ open down ↓ 2 lines elided ↑ open up ↑
  37   37  #include <sys/txg.h>
  38   38  #include <sys/avl.h>
  39   39  #include <sys/fs/zfs.h>
  40   40  #include <sys/zio_impl.h>
  41   41  
  42   42  #ifdef  __cplusplus
  43   43  extern "C" {
  44   44  #endif
  45   45  
  46   46  /*
       47 + * Checksum state w.r.t. SHA256 acceleration.
       48 + */
       49 +typedef enum {
       50 +        CKSTATE_NONE = 0,
       51 +        CKSTATE_WAITING,
       52 +        CKSTATE_CHECKSUMMING,
       53 +        CKSTATE_CHECKSUM_DONE
       54 +} zio_checksum_state_t;
       55 +
       56 +/*
  47   57   * Embedded checksum
  48   58   */
  49   59  #define ZEC_MAGIC       0x210da7ab10c7a11ULL
  50   60  
  51   61  typedef struct zio_eck {
  52   62          uint64_t        zec_magic;      /* for validation, endianness   */
  53   63          zio_cksum_t     zec_cksum;      /* 256-bit checksum             */
  54   64  } zio_eck_t;
  55   65  
  56   66  /*
↓ open down ↓ 74 lines elided ↑ open up ↑
 131  141          (compress) == ZIO_COMPRESS_GZIP_7 ||            \
 132  142          (compress) == ZIO_COMPRESS_GZIP_8 ||            \
 133  143          (compress) == ZIO_COMPRESS_GZIP_9 ||            \
 134  144          (compress) == ZIO_COMPRESS_ON ||                \
 135  145          (compress) == ZIO_COMPRESS_OFF)
 136  146  
 137  147  #define ZIO_FAILURE_MODE_WAIT           0
 138  148  #define ZIO_FAILURE_MODE_CONTINUE       1
 139  149  #define ZIO_FAILURE_MODE_PANIC          2
 140  150  
      151 +/*
      152 + * Macro for asserting validity of the priorities obtained by conversion
      153 + * from CoS/vdev properties
      154 + */
      155 +#define ZIO_PRIORITY_QUEUEABLE_VALID(prio)      \
      156 +        (((prio) >= ZIO_PRIORITY_SYNC_READ) &&  \
      157 +        ((prio) < ZIO_PRIORITY_NUM_QUEUEABLE))
      158 +
      159 +#define ZIO_PIPELINE_CONTINUE           0x100
      160 +#define ZIO_PIPELINE_STOP               0x101
      161 +#define ZIO_PIPELINE_RESTART_STAGE      0x102
      162 +
 141  163  enum zio_flag {
 142  164          /*
 143  165           * Flags inherited by gang, ddt, and vdev children,
 144  166           * and that must be equal for two zios to aggregate
 145  167           */
 146  168          ZIO_FLAG_DONT_AGGREGATE = 1 << 0,
 147  169          ZIO_FLAG_IO_REPAIR      = 1 << 1,
 148  170          ZIO_FLAG_SELF_HEAL      = 1 << 2,
 149  171          ZIO_FLAG_RESILVER       = 1 << 3,
 150  172          ZIO_FLAG_SCRUB          = 1 << 4,
↓ open down ↓ 48 lines elided ↑ open up ↑
 199  221  #define ZIO_DDT_CHILD_FLAGS(zio)                                \
 200  222          (((zio)->io_flags & ZIO_FLAG_DDT_INHERIT) |             \
 201  223          ZIO_FLAG_DDT_CHILD | ZIO_FLAG_CANFAIL)
 202  224  
 203  225  #define ZIO_GANG_CHILD_FLAGS(zio)                               \
 204  226          (((zio)->io_flags & ZIO_FLAG_GANG_INHERIT) |            \
 205  227          ZIO_FLAG_GANG_CHILD | ZIO_FLAG_CANFAIL)
 206  228  
 207  229  #define ZIO_VDEV_CHILD_FLAGS(zio)                               \
 208  230          (((zio)->io_flags & ZIO_FLAG_VDEV_INHERIT) |            \
 209      -        ZIO_FLAG_DONT_PROPAGATE | ZIO_FLAG_CANFAIL)
      231 +        ZIO_FLAG_CANFAIL)
 210  232  
 211      -#define ZIO_CHILD_BIT(x)                (1 << (x))
 212      -#define ZIO_CHILD_BIT_IS_SET(val, x)    ((val) & (1 << (x)))
 213      -
 214  233  enum zio_child {
 215  234          ZIO_CHILD_VDEV = 0,
 216  235          ZIO_CHILD_GANG,
 217  236          ZIO_CHILD_DDT,
 218  237          ZIO_CHILD_LOGICAL,
 219  238          ZIO_CHILD_TYPES
 220  239  };
 221  240  
 222      -#define ZIO_CHILD_VDEV_BIT              ZIO_CHILD_BIT(ZIO_CHILD_VDEV)
 223      -#define ZIO_CHILD_GANG_BIT              ZIO_CHILD_BIT(ZIO_CHILD_GANG)
 224      -#define ZIO_CHILD_DDT_BIT               ZIO_CHILD_BIT(ZIO_CHILD_DDT)
 225      -#define ZIO_CHILD_LOGICAL_BIT           ZIO_CHILD_BIT(ZIO_CHILD_LOGICAL)
 226      -#define ZIO_CHILD_ALL_BITS                                      \
 227      -        (ZIO_CHILD_VDEV_BIT | ZIO_CHILD_GANG_BIT |              \
 228      -        ZIO_CHILD_DDT_BIT | ZIO_CHILD_LOGICAL_BIT)
 229      -
 230  241  enum zio_wait_type {
 231  242          ZIO_WAIT_READY = 0,
 232  243          ZIO_WAIT_DONE,
 233  244          ZIO_WAIT_TYPES
 234  245  };
 235  246  
 236  247  /*
 237  248   * We'll take the unused errnos, 'EBADE' and 'EBADR' (from the Convergent
 238  249   * graveyard) to indicate checksum errors and fragmentation.
 239  250   */
 240  251  #define ECKSUM  EBADE
 241  252  #define EFRAGS  EBADR
 242  253  
 243  254  typedef void zio_done_func_t(zio_t *zio);
 244  255  
 245  256  extern boolean_t zio_dva_throttle_enabled;
 246  257  extern const char *zio_type_name[ZIO_TYPES];
 247  258  
      259 +struct range_tree;
      260 +
 248  261  /*
 249  262   * A bookmark is a four-tuple <objset, object, level, blkid> that uniquely
 250  263   * identifies any block in the pool.  By convention, the meta-objset (MOS)
 251  264   * is objset 0, and the meta-dnode is object 0.  This covers all blocks
 252  265   * except root blocks and ZIL blocks, which are defined as follows:
 253  266   *
 254  267   * Root blocks (objset_phys_t) are object 0, level -1:  <objset, 0, -1, 0>.
 255  268   * ZIL blocks are bookmarked <objset, 0, -2, blkid == ZIL sequence number>.
 256  269   * dmu_sync()ed ZIL data blocks are bookmarked <objset, object, -2, blkid>.
 257  270   * dnode visit bookmarks are <objset, object id of dnode, -3, 0>.
↓ open down ↓ 39 lines elided ↑ open up ↑
 297  310          ((zb)->zb_object == ZB_ROOT_OBJECT &&   \
 298  311          (zb)->zb_level == ZB_ROOT_LEVEL &&      \
 299  312          (zb)->zb_blkid == ZB_ROOT_BLKID)
 300  313  
 301  314  typedef struct zio_prop {
 302  315          enum zio_checksum       zp_checksum;
 303  316          enum zio_compress       zp_compress;
 304  317          dmu_object_type_t       zp_type;
 305  318          uint8_t                 zp_level;
 306  319          uint8_t                 zp_copies;
 307      -        boolean_t               zp_dedup;
 308      -        boolean_t               zp_dedup_verify;
      320 +        uint8_t                 zp_dedup;
      321 +        uint8_t                 zp_dedup_verify;
 309  322          boolean_t               zp_nopwrite;
      323 +        boolean_t               zp_metadata;
      324 +        boolean_t               zp_usesc;
      325 +        boolean_t               zp_usewbc;
      326 +        uint64_t                zp_zpl_meta_to_special;
 310  327  } zio_prop_t;
 311  328  
 312  329  typedef struct zio_cksum_report zio_cksum_report_t;
 313  330  
 314  331  typedef void zio_cksum_finish_f(zio_cksum_report_t *rep,
 315  332      const void *good_data);
 316  333  typedef void zio_cksum_free_f(void *cbdata, size_t size);
 317  334  
 318  335  struct zio_bad_cksum;                           /* defined in zio_checksum.h */
 319  336  struct dnode_phys;
↓ open down ↓ 59 lines elided ↑ open up ↑
 379  396          uint64_t zal_size;
 380  397  } zio_alloc_list_t;
 381  398  
 382  399  typedef struct zio_link {
 383  400          zio_t           *zl_parent;
 384  401          zio_t           *zl_child;
 385  402          list_node_t     zl_parent_node;
 386  403          list_node_t     zl_child_node;
 387  404  } zio_link_t;
 388  405  
      406 +/*
      407 + * When smart compression is enabled, this callback info structure is
      408 + * passed to write zio's to monitor per-object compression performance.
      409 + *
      410 + * When zio_write determines that the `compression' setting for the dataset
      411 + * is not `off', if `sc_ask' is not NULL, it will call the `sc_ask' callback
      412 + * function, asking the upper layers whether it should really try to compress
      413 + * the object in question. If the function returns B_TRUE, compression is
      414 + * attempted. Once compression is done, sc_result is called to inform the
      415 + * upper layers of the compression result. By comparing the zio's io_size to
      416 + * io_orig_size it can monitor compression performance on the particular
      417 + * object in question (if io_size == io_orig_size, then compression failed).
      418 + * It is not legal to pass a NULL sc_ask but non-NULL sc_result to zio_write.
      419 + */
      420 +typedef struct zio_smartcomp_info {
      421 +        boolean_t (*sc_ask)(void *userinfo, const zio_t *);
      422 +        void (*sc_result)(void *userinfo, const zio_t *);
      423 +        void *sc_userinfo;
      424 +} zio_smartcomp_info_t;
      425 +
      426 +#define ZIO_SHOULD_COMPRESS(zio) \
      427 +        ((zio)->io_smartcomp.sc_ask == NULL || \
      428 +        (zio)->io_smartcomp.sc_ask((zio)->io_smartcomp.sc_userinfo, (zio)))
      429 +
 389  430  struct zio {
 390  431          /* Core information about this I/O */
 391  432          zbookmark_phys_t        io_bookmark;
 392  433          zio_prop_t      io_prop;
 393  434          zio_type_t      io_type;
 394  435          enum zio_child  io_child_type;
 395  436          int             io_cmd;
 396  437          zio_priority_t  io_priority;
 397  438          uint8_t         io_reexecute;
 398  439          uint8_t         io_state[ZIO_WAIT_TYPES];
 399  440          uint64_t        io_txg;
 400  441          spa_t           *io_spa;
 401  442          blkptr_t        *io_bp;
 402  443          blkptr_t        *io_bp_override;
 403  444          blkptr_t        io_bp_copy;
 404  445          list_t          io_parent_list;
 405  446          list_t          io_child_list;
 406  447          zio_t           *io_logical;
 407  448          zio_transform_t *io_transform_stack;
      449 +        zio_smartcomp_info_t    io_smartcomp;
 408  450  
 409  451          /* Callback info */
 410  452          zio_done_func_t *io_ready;
 411  453          zio_done_func_t *io_children_ready;
 412  454          zio_done_func_t *io_physdone;
 413  455          zio_done_func_t *io_done;
 414  456          void            *io_private;
 415  457          int64_t         io_prev_space_delta;    /* DMU private */
 416  458          blkptr_t        io_bp_orig;
 417  459  
↓ open down ↓ 40 lines elided ↑ open up ↑
 458  500          void            *io_waiter;
 459  501          kmutex_t        io_lock;
 460  502          kcondvar_t      io_cv;
 461  503  
 462  504          /* FMA state */
 463  505          zio_cksum_report_t *io_cksum_report;
 464  506          uint64_t        io_ena;
 465  507  
 466  508          /* Taskq dispatching state */
 467  509          taskq_ent_t     io_tqent;
      510 +
      511 +        /* Timestamp for tracking vdev I/O latency */
      512 +        hrtime_t io_vd_timestamp;
      513 +
      514 +        /* Checksum acceleration */
      515 +        zio_checksum_state_t    zio_checksum_state;
      516 +        zio_cksum_t             *zio_checksump;
      517 +        void                    *zio_checksum_datap;
      518 +        uint64_t                zio_checksum_data_size;
      519 +        struct zio              *zio_checksum_next;
      520 +        zio_cksum_t             actual_cksum;
      521 +
      522 +        /* Metaslab class that will be used */
      523 +        metaslab_class_t *io_mc;
 468  524  };
 469  525  
 470  526  extern int zio_bookmark_compare(const void *, const void *);
 471  527  
 472  528  extern zio_t *zio_null(zio_t *pio, spa_t *spa, vdev_t *vd,
 473  529      zio_done_func_t *done, void *private, enum zio_flag flags);
 474  530  
 475  531  extern zio_t *zio_root(spa_t *spa,
 476  532      zio_done_func_t *done, void *private, enum zio_flag flags);
 477  533  
 478  534  extern zio_t *zio_read(zio_t *pio, spa_t *spa, const blkptr_t *bp,
 479  535      struct abd *data, uint64_t lsize, zio_done_func_t *done, void *private,
 480  536      zio_priority_t priority, enum zio_flag flags, const zbookmark_phys_t *zb);
 481  537  
 482  538  extern zio_t *zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
 483  539      struct abd *data, uint64_t size, uint64_t psize, const zio_prop_t *zp,
 484  540      zio_done_func_t *ready, zio_done_func_t *children_ready,
 485  541      zio_done_func_t *physdone, zio_done_func_t *done,
 486  542      void *private, zio_priority_t priority, enum zio_flag flags,
 487      -    const zbookmark_phys_t *zb);
      543 +    const zbookmark_phys_t *zb,
      544 +    const zio_smartcomp_info_t *smartcomp);
 488  545  
 489  546  extern zio_t *zio_rewrite(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
 490  547      struct abd *data, uint64_t size, zio_done_func_t *done, void *private,
 491  548      zio_priority_t priority, enum zio_flag flags, zbookmark_phys_t *zb);
 492  549  
 493  550  extern void zio_write_override(zio_t *zio, blkptr_t *bp, int copies,
 494  551      boolean_t nopwrite);
 495  552  
 496  553  extern void zio_free(spa_t *spa, uint64_t txg, const blkptr_t *bp);
 497  554  
 498  555  extern zio_t *zio_claim(zio_t *pio, spa_t *spa, uint64_t txg,
 499  556      const blkptr_t *bp,
 500  557      zio_done_func_t *done, void *private, enum zio_flag flags);
 501  558  
 502  559  extern zio_t *zio_ioctl(zio_t *pio, spa_t *spa, vdev_t *vd, int cmd,
 503  560      zio_done_func_t *done, void *private, enum zio_flag flags);
 504  561  
      562 +extern zio_t *zio_trim(spa_t *spa, vdev_t *vd, struct range_tree *tree,
      563 +    zio_done_func_t *done, void *private, enum zio_flag flags,
      564 +    int dkiocfree_flags, metaslab_t *msp);
      565 +
 505  566  extern zio_t *zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
 506  567      uint64_t size, struct abd *data, int checksum,
 507  568      zio_done_func_t *done, void *private, zio_priority_t priority,
 508  569      enum zio_flag flags, boolean_t labels);
 509  570  
 510  571  extern zio_t *zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
 511  572      uint64_t size, struct abd *data, int checksum,
 512  573      zio_done_func_t *done, void *private, zio_priority_t priority,
 513  574      enum zio_flag flags, boolean_t labels);
 514  575  
      576 +extern zio_t *zio_wbc(zio_type_t type, vdev_t *vd, abd_t *data,
      577 +    uint64_t size, uint64_t offset);
      578 +
 515  579  extern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg,
 516  580      const blkptr_t *bp, enum zio_flag flags);
 517  581  
 518  582  extern int zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp,
 519  583      blkptr_t *old_bp, uint64_t size, boolean_t *slog);
 520  584  extern void zio_free_zil(spa_t *spa, uint64_t txg, blkptr_t *bp);
 521  585  extern void zio_flush(zio_t *zio, vdev_t *vd);
 522  586  extern void zio_shrink(zio_t *zio, uint64_t size);
 523  587  
 524  588  extern int zio_wait(zio_t *zio);
↓ open down ↓ 72 lines elided ↑ open up ↑
 597  661  /*
 598  662   * Checksum ereport functions
 599  663   */
 600  664  extern void zfs_ereport_start_checksum(spa_t *spa, vdev_t *vd, struct zio *zio,
 601  665      uint64_t offset, uint64_t length, void *arg, struct zio_bad_cksum *info);
 602  666  extern void zfs_ereport_finish_checksum(zio_cksum_report_t *report,
 603  667      const void *good_data, const void *bad_data, boolean_t drop_if_identical);
 604  668  
 605  669  extern void zfs_ereport_send_interim_checksum(zio_cksum_report_t *report);
 606  670  extern void zfs_ereport_free_checksum(zio_cksum_report_t *report);
 607      -
 608  671  /* If we have the good data in hand, this function can be used */
 609  672  extern void zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd,
 610  673      struct zio *zio, uint64_t offset, uint64_t length,
 611  674      const void *good_data, const void *bad_data, struct zio_bad_cksum *info);
 612  675  
 613  676  /* Called from spa_sync(), but primarily an injection handler */
 614  677  extern void spa_handle_ignored_writes(spa_t *spa);
 615  678  
 616  679  /* zbookmark_phys functions */
 617  680  boolean_t zbookmark_subtree_completed(const struct dnode_phys *dnp,
 618  681      const zbookmark_phys_t *subtree_root, const zbookmark_phys_t *last_block);
 619  682  int zbookmark_compare(uint16_t dbss1, uint8_t ibs1, uint16_t dbss2,
 620  683      uint8_t ibs2, const zbookmark_phys_t *zb1, const zbookmark_phys_t *zb2);
 621  684  
      685 +/* best effort dedup */
      686 +void zio_best_effort_dedup(zio_t *zio);
      687 +
 622  688  #ifdef  __cplusplus
 623  689  }
 624  690  #endif
 625  691  
 626  692  #endif  /* _ZIO_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX