Print this page
NEX-5553 ZFS auto-trim, manual-trim and scrub can race and deadlock
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
6414 vdev_config_sync could be simpler
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
5269 zpool import slow
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Approved by: Dan McDonald <danmcd@omniti.com>
NEX-3984 On-demand TRIM
Reviewed by: Alek Pinchuk <alek@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Conflicts:
        usr/src/common/zfs/zpool_prop.c
        usr/src/uts/common/sys/fs/zfs.h
NEX-3558 KRRP Integration
NEX-3165 need some dedup improvements
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
4370 avoid transmitting holes during zfs send
4371 DMU code clean up
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Approved by: Garrett D'Amore <garrett@damore.org>
OS-80 support for vdev and CoS properties for the new I/O scheduler
OS-95 lint warning introduced by OS-61
zfsxx issue #11: support for spare device groups
re #12585 rb4049 ZFS++ work port - refactoring to improve separation of open/closed code, bug fixes, performance improvements - open code
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/vdev.h
          +++ new/usr/src/uts/common/fs/zfs/sys/vdev.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 (c) 2011, 2016 by Delphix. All rights reserved.
       24 + * Copyright (c) 2013 by Delphix. All rights reserved.
       25 + * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
  25   26   */
  26   27  
  27   28  #ifndef _SYS_VDEV_H
  28   29  #define _SYS_VDEV_H
  29   30  
  30   31  #include <sys/spa.h>
  31   32  #include <sys/zio.h>
  32   33  #include <sys/dmu.h>
  33   34  #include <sys/space_map.h>
  34   35  #include <sys/fs/zfs.h>
↓ open down ↓ 3 lines elided ↑ open up ↑
  38   39  #endif
  39   40  
  40   41  typedef enum vdev_dtl_type {
  41   42          DTL_MISSING,    /* 0% replication: no copies of the data */
  42   43          DTL_PARTIAL,    /* less than 100% replication: some copies missing */
  43   44          DTL_SCRUB,      /* unable to fully repair during scrub/resilver */
  44   45          DTL_OUTAGE,     /* temporarily missing (used to attempt detach) */
  45   46          DTL_TYPES
  46   47  } vdev_dtl_type_t;
  47   48  
       49 +typedef struct vdev_trim_info {
       50 +        vdev_t *vti_vdev;
       51 +        uint64_t vti_txg;       /* ignored for manual trim */
       52 +        void (*vti_done_cb)(void *);
       53 +        void *vti_done_arg;
       54 +} vdev_trim_info_t;
       55 +
  48   56  extern boolean_t zfs_nocacheflush;
  49   57  
  50      -extern void vdev_dbgmsg(vdev_t *vd, const char *fmt, ...);
  51      -extern void vdev_dbgmsg_print_tree(vdev_t *, int);
  52   58  extern int vdev_open(vdev_t *);
  53   59  extern void vdev_open_children(vdev_t *);
  54   60  extern boolean_t vdev_uses_zvols(vdev_t *);
  55      -extern int vdev_validate(vdev_t *);
  56      -extern int vdev_copy_path_strict(vdev_t *, vdev_t *);
  57      -extern void vdev_copy_path_relaxed(vdev_t *, vdev_t *);
       61 +extern int vdev_validate(vdev_t *, boolean_t);
  58   62  extern void vdev_close(vdev_t *);
  59   63  extern int vdev_create(vdev_t *, uint64_t txg, boolean_t isreplace);
  60   64  extern void vdev_reopen(vdev_t *);
  61   65  extern int vdev_validate_aux(vdev_t *vd);
  62   66  extern zio_t *vdev_probe(vdev_t *vd, zio_t *pio);
  63      -extern boolean_t vdev_is_concrete(vdev_t *vd);
       67 +
  64   68  extern boolean_t vdev_is_bootable(vdev_t *vd);
  65   69  extern vdev_t *vdev_lookup_top(spa_t *spa, uint64_t vdev);
  66   70  extern vdev_t *vdev_lookup_by_guid(vdev_t *vd, uint64_t guid);
  67   71  extern int vdev_count_leaves(spa_t *spa);
  68   72  extern void vdev_dtl_dirty(vdev_t *vd, vdev_dtl_type_t d,
  69   73      uint64_t txg, uint64_t size);
  70   74  extern boolean_t vdev_dtl_contains(vdev_t *vd, vdev_dtl_type_t d,
  71   75      uint64_t txg, uint64_t size);
  72   76  extern boolean_t vdev_dtl_empty(vdev_t *vd, vdev_dtl_type_t d);
  73   77  extern void vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg,
  74   78      int scrub_done);
  75   79  extern boolean_t vdev_dtl_required(vdev_t *vd);
  76   80  extern boolean_t vdev_resilver_needed(vdev_t *vd,
  77   81      uint64_t *minp, uint64_t *maxp);
  78   82  extern void vdev_destroy_unlink_zap(vdev_t *vd, uint64_t zapobj,
  79   83      dmu_tx_t *tx);
  80   84  extern uint64_t vdev_create_link_zap(vdev_t *vd, dmu_tx_t *tx);
  81   85  extern void vdev_construct_zaps(vdev_t *vd, dmu_tx_t *tx);
  82      -extern void vdev_destroy_spacemaps(vdev_t *vd, dmu_tx_t *tx);
  83      -extern void vdev_indirect_mark_obsolete(vdev_t *vd, uint64_t offset,
  84      -    uint64_t size, uint64_t txg);
  85      -extern void spa_vdev_indirect_mark_obsolete(spa_t *spa, uint64_t vdev,
  86      -    uint64_t offset, uint64_t size, dmu_tx_t *tx);
  87   86  
  88   87  extern void vdev_hold(vdev_t *);
  89   88  extern void vdev_rele(vdev_t *);
  90   89  
  91   90  extern int vdev_metaslab_init(vdev_t *vd, uint64_t txg);
  92   91  extern void vdev_metaslab_fini(vdev_t *vd);
  93   92  extern void vdev_metaslab_set_size(vdev_t *);
  94   93  extern void vdev_expand(vdev_t *vd, uint64_t txg);
  95   94  extern void vdev_split(vdev_t *vd);
  96   95  extern void vdev_deadman(vdev_t *vd);
  97   96  
       97 +
  98   98  extern void vdev_get_stats(vdev_t *vd, vdev_stat_t *vs);
  99   99  extern void vdev_clear_stats(vdev_t *vd);
 100  100  extern void vdev_stat_update(zio_t *zio, uint64_t psize);
 101  101  extern void vdev_scan_stat_init(vdev_t *vd);
 102  102  extern void vdev_propagate_state(vdev_t *vd);
 103  103  extern void vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state,
 104  104      vdev_aux_t aux);
 105      -extern boolean_t vdev_children_are_offline(vdev_t *vd);
 106  105  
 107  106  extern void vdev_space_update(vdev_t *vd,
 108  107      int64_t alloc_delta, int64_t defer_delta, int64_t space_delta);
 109  108  
 110  109  extern uint64_t vdev_psize_to_asize(vdev_t *vd, uint64_t psize);
 111  110  
 112  111  extern int vdev_fault(spa_t *spa, uint64_t guid, vdev_aux_t aux);
 113  112  extern int vdev_degrade(spa_t *spa, uint64_t guid, vdev_aux_t aux);
 114  113  extern int vdev_online(spa_t *spa, uint64_t guid, uint64_t flags,
 115  114      vdev_state_t *);
↓ open down ↓ 21 lines elided ↑ open up ↑
 137  136  extern void vdev_config_clean(vdev_t *vd);
 138  137  extern int vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg);
 139  138  
 140  139  extern void vdev_state_dirty(vdev_t *vd);
 141  140  extern void vdev_state_clean(vdev_t *vd);
 142  141  
 143  142  typedef enum vdev_config_flag {
 144  143          VDEV_CONFIG_SPARE = 1 << 0,
 145  144          VDEV_CONFIG_L2CACHE = 1 << 1,
 146  145          VDEV_CONFIG_REMOVING = 1 << 2,
 147      -        VDEV_CONFIG_MOS = 1 << 3,
 148      -        VDEV_CONFIG_MISSING = 1 << 4
      146 +        VDEV_CONFIG_MOS = 1 << 3
 149  147  } vdev_config_flag_t;
 150  148  
 151  149  extern void vdev_top_config_generate(spa_t *spa, nvlist_t *config);
 152  150  extern nvlist_t *vdev_config_generate(spa_t *spa, vdev_t *vd,
 153  151      boolean_t getstats, vdev_config_flag_t flags);
 154  152  
      153 +extern boolean_t vdev_type_is_ddt(vdev_t *vd);
      154 +
      155 +extern void vdev_man_trim(vdev_trim_info_t *vti);
      156 +extern void vdev_auto_trim(vdev_trim_info_t *vti);
      157 +
 155  158  /*
 156  159   * Label routines
 157  160   */
 158  161  struct uberblock;
 159  162  extern uint64_t vdev_label_offset(uint64_t psize, int l, uint64_t offset);
 160  163  extern int vdev_label_number(uint64_t psise, uint64_t offset);
 161  164  extern nvlist_t *vdev_label_read_config(vdev_t *vd, uint64_t txg);
 162  165  extern void vdev_uberblock_load(vdev_t *, struct uberblock *, nvlist_t **);
 163  166  
 164  167  typedef enum {
 165  168          VDEV_LABEL_CREATE,      /* create/add a new device */
 166  169          VDEV_LABEL_REPLACE,     /* replace an existing device */
 167  170          VDEV_LABEL_SPARE,       /* add a new hot spare */
 168  171          VDEV_LABEL_REMOVE,      /* remove an existing device */
 169  172          VDEV_LABEL_L2CACHE,     /* add an L2ARC cache device */
 170  173          VDEV_LABEL_SPLIT        /* generating new label for split-off dev */
 171  174  } vdev_labeltype_t;
 172  175  
 173  176  extern int vdev_label_init(vdev_t *vd, uint64_t txg, vdev_labeltype_t reason);
 174  177  
      178 +extern boolean_t vdev_is_special(vdev_t *vd);
      179 +
 175  180  #ifdef  __cplusplus
 176  181  }
 177  182  #endif
 178  183  
 179  184  #endif  /* _SYS_VDEV_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX