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/sys/dsl_dataset.h
          +++ new/usr/src/uts/common/fs/zfs/sys/dsl_dataset.h
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  
    | 
      ↓ open down ↓ | 
    12 lines elided | 
    
      ↑ open up ↑ | 
  
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  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   * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23      - * Copyright (c) 2011 by Delphix. All rights reserved.
       23 + * Copyright (c) 2012 by Delphix. All rights reserved.
  24   24   * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  25   25   */
  26   26  
  27   27  #ifndef _SYS_DSL_DATASET_H
  28   28  #define _SYS_DSL_DATASET_H
  29   29  
  30   30  #include <sys/dmu.h>
  31   31  #include <sys/spa.h>
  32   32  #include <sys/txg.h>
  33   33  #include <sys/zio.h>
  34   34  #include <sys/bplist.h>
  35   35  #include <sys/dsl_synctask.h>
  36   36  #include <sys/zfs_context.h>
  37   37  #include <sys/dsl_deadlist.h>
  38   38  
  39   39  #ifdef  __cplusplus
  40   40  extern "C" {
  41   41  #endif
  42   42  
  43   43  struct dsl_dataset;
  44   44  struct dsl_dir;
  45   45  struct dsl_pool;
  46   46  
  47   47  #define DS_FLAG_INCONSISTENT    (1ULL<<0)
  48   48  #define DS_IS_INCONSISTENT(ds)  \
  49   49          ((ds)->ds_phys->ds_flags & DS_FLAG_INCONSISTENT)
  50   50  /*
  51   51   * NB: nopromote can not yet be set, but we want support for it in this
  52   52   * on-disk version, so that we don't need to upgrade for it later.  It
  53   53   * will be needed when we implement 'zfs split' (where the split off
  54   54   * clone should not be promoted).
  55   55   */
  56   56  #define DS_FLAG_NOPROMOTE       (1ULL<<1)
  57   57  
  58   58  /*
  59   59   * DS_FLAG_UNIQUE_ACCURATE is set if ds_unique_bytes has been correctly
  60   60   * calculated for head datasets (starting with SPA_VERSION_UNIQUE_ACCURATE,
  61   61   * refquota/refreservations).
  62   62   */
  63   63  #define DS_FLAG_UNIQUE_ACCURATE (1ULL<<2)
  64   64  
  65   65  /*
  66   66   * DS_FLAG_DEFER_DESTROY is set after 'zfs destroy -d' has been called
  67   67   * on a dataset. This allows the dataset to be destroyed using 'zfs release'.
  68   68   */
  69   69  #define DS_FLAG_DEFER_DESTROY   (1ULL<<3)
  70   70  #define DS_IS_DEFER_DESTROY(ds) \
  71   71          ((ds)->ds_phys->ds_flags & DS_FLAG_DEFER_DESTROY)
  72   72  
  73   73  /*
  74   74   * DS_FLAG_CI_DATASET is set if the dataset contains a file system whose
  75   75   * name lookups should be performed case-insensitively.
  76   76   */
  77   77  #define DS_FLAG_CI_DATASET      (1ULL<<16)
  78   78  
  
    | 
      ↓ open down ↓ | 
    45 lines elided | 
    
      ↑ open up ↑ | 
  
  79   79  typedef struct dsl_dataset_phys {
  80   80          uint64_t ds_dir_obj;            /* DMU_OT_DSL_DIR */
  81   81          uint64_t ds_prev_snap_obj;      /* DMU_OT_DSL_DATASET */
  82   82          uint64_t ds_prev_snap_txg;
  83   83          uint64_t ds_next_snap_obj;      /* DMU_OT_DSL_DATASET */
  84   84          uint64_t ds_snapnames_zapobj;   /* DMU_OT_DSL_DS_SNAP_MAP 0 for snaps */
  85   85          uint64_t ds_num_children;       /* clone/snap children; ==0 for head */
  86   86          uint64_t ds_creation_time;      /* seconds since 1970 */
  87   87          uint64_t ds_creation_txg;
  88   88          uint64_t ds_deadlist_obj;       /* DMU_OT_DEADLIST */
  89      -        uint64_t ds_used_bytes;
       89 +        /*
       90 +         * ds_referenced_bytes, ds_compressed_bytes, and ds_uncompressed_bytes
       91 +         * include all blocks referenced by this dataset, including those
       92 +         * shared with any other datasets.
       93 +         */
       94 +        uint64_t ds_referenced_bytes;
  90   95          uint64_t ds_compressed_bytes;
  91   96          uint64_t ds_uncompressed_bytes;
  92   97          uint64_t ds_unique_bytes;       /* only relevant to snapshots */
  93   98          /*
  94   99           * The ds_fsid_guid is a 56-bit ID that can change to avoid
  95  100           * collisions.  The ds_guid is a 64-bit ID that will never
  96  101           * change, so there is a small probability that it will collide.
  97  102           */
  98  103          uint64_t ds_fsid_guid;
  99  104          uint64_t ds_guid;
 100  105          uint64_t ds_flags;              /* DS_FLAG_* */
 101  106          blkptr_t ds_bp;
 102  107          uint64_t ds_next_clones_obj;    /* DMU_OT_DSL_CLONES */
 103  108          uint64_t ds_props_obj;          /* DMU_OT_DSL_PROPS for snaps */
 104  109          uint64_t ds_userrefs_obj;       /* DMU_OT_USERREFS */
 105  110          uint64_t ds_pad[5]; /* pad out to 320 bytes for good measure */
 106  111  } dsl_dataset_phys_t;
 107  112  
 108  113  typedef struct dsl_dataset {
 109  114          /* Immutable: */
 110  115          struct dsl_dir *ds_dir;
 111  116          dsl_dataset_phys_t *ds_phys;
 112  117          dmu_buf_t *ds_dbuf;
 113  118          uint64_t ds_object;
 114  119          uint64_t ds_fsid_guid;
 115  120  
 116  121          /* only used in syncing context, only valid for non-snapshots: */
 117  122          struct dsl_dataset *ds_prev;
 118  123  
 119  124          /* has internal locking: */
 120  125          dsl_deadlist_t ds_deadlist;
 121  126          bplist_t ds_pending_deadlist;
 122  127  
 123  128          /* to protect against multiple concurrent incremental recv */
 124  129          kmutex_t ds_recvlock;
 125  130  
 126  131          /* protected by lock on pool's dp_dirty_datasets list */
 127  132          txg_node_t ds_dirty_link;
 128  133          list_node_t ds_synced_link;
 129  134  
 130  135          /*
 131  136           * ds_phys->ds_<accounting> is also protected by ds_lock.
 132  137           * Protected by ds_lock:
 133  138           */
 134  139          kmutex_t ds_lock;
 135  140          objset_t *ds_objset;
 136  141          uint64_t ds_userrefs;
 137  142  
 138  143          /*
 139  144           * ds_owner is protected by the ds_rwlock and the ds_lock
 140  145           */
 141  146          krwlock_t ds_rwlock;
 142  147          kcondvar_t ds_exclusive_cv;
 143  148          void *ds_owner;
 144  149  
 145  150          /* no locking; only for making guesses */
 146  151          uint64_t ds_trysnap_txg;
 147  152  
 148  153          /* for objset_open() */
 149  154          kmutex_t ds_opening_lock;
 150  155  
 151  156          uint64_t ds_reserved;   /* cached refreservation */
 152  157          uint64_t ds_quota;      /* cached refquota */
 153  158  
 154  159          kmutex_t ds_sendstream_lock;
 155  160          list_t ds_sendstreams;
 156  161  
 157  162          /* Protected by ds_lock; keep at end of struct for better locality */
 158  163          char ds_snapname[MAXNAMELEN];
 159  164  } dsl_dataset_t;
 160  165  
 161  166  struct dsl_ds_destroyarg {
 162  167          dsl_dataset_t *ds;              /* ds to destroy */
 163  168          dsl_dataset_t *rm_origin;       /* also remove our origin? */
 164  169          boolean_t is_origin_rm;         /* set if removing origin snap */
 165  170          boolean_t defer;                /* destroy -d requested? */
 166  171          boolean_t releasing;            /* destroying due to release? */
 167  172          boolean_t need_prep;            /* do we need to retry due to EBUSY? */
 168  173  };
 169  174  
 170  175  /*
 171  176   * The max length of a temporary tag prefix is the number of hex digits
 172  177   * required to express UINT64_MAX plus one for the hyphen.
 173  178   */
 174  179  #define MAX_TAG_PREFIX_LEN      17
 175  180  
 176  181  struct dsl_ds_holdarg {
 177  182          dsl_sync_task_group_t *dstg;
 178  183          char *htag;
 179  184          char *snapname;
 180  185          boolean_t recursive;
 181  186          boolean_t gotone;
 182  187          boolean_t temphold;
 183  188          char failed[MAXPATHLEN];
 184  189  };
 185  190  
 186  191  #define dsl_dataset_is_snapshot(ds) \
 187  192          ((ds)->ds_phys->ds_num_children != 0)
 188  193  
 189  194  #define DS_UNIQUE_IS_ACCURATE(ds)       \
 190  195          (((ds)->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) != 0)
 191  196  
 192  197  int dsl_dataset_hold(const char *name, void *tag, dsl_dataset_t **dsp);
 193  198  int dsl_dataset_hold_obj(struct dsl_pool *dp, uint64_t dsobj,
 194  199      void *tag, dsl_dataset_t **);
 195  200  int dsl_dataset_own(const char *name, boolean_t inconsistentok,
 196  201      void *tag, dsl_dataset_t **dsp);
 197  202  int dsl_dataset_own_obj(struct dsl_pool *dp, uint64_t dsobj,
 198  203      boolean_t inconsistentok, void *tag, dsl_dataset_t **dsp);
 199  204  void dsl_dataset_name(dsl_dataset_t *ds, char *name);
 200  205  void dsl_dataset_rele(dsl_dataset_t *ds, void *tag);
 201  206  void dsl_dataset_disown(dsl_dataset_t *ds, void *tag);
 202  207  void dsl_dataset_drop_ref(dsl_dataset_t *ds, void *tag);
 203  208  boolean_t dsl_dataset_tryown(dsl_dataset_t *ds, boolean_t inconsistentok,
 204  209      void *tag);
 205  210  void dsl_dataset_make_exclusive(dsl_dataset_t *ds, void *tag);
 206  211  void dsl_register_onexit_hold_cleanup(dsl_dataset_t *ds, const char *htag,
 207  212      minor_t minor);
 208  213  uint64_t dsl_dataset_create_sync(dsl_dir_t *pds, const char *lastname,
 209  214      dsl_dataset_t *origin, uint64_t flags, cred_t *, dmu_tx_t *);
 210  215  uint64_t dsl_dataset_create_sync_dd(dsl_dir_t *dd, dsl_dataset_t *origin,
 211  216      uint64_t flags, dmu_tx_t *tx);
 212  217  int dsl_dataset_destroy(dsl_dataset_t *ds, void *tag, boolean_t defer);
 213  218  int dsl_snapshots_destroy(char *fsname, char *snapname, boolean_t defer);
 214  219  dsl_checkfunc_t dsl_dataset_destroy_check;
 215  220  dsl_syncfunc_t dsl_dataset_destroy_sync;
 216  221  dsl_checkfunc_t dsl_dataset_snapshot_check;
 217  222  dsl_syncfunc_t dsl_dataset_snapshot_sync;
 218  223  dsl_syncfunc_t dsl_dataset_user_hold_sync;
 219  224  int dsl_dataset_rename(char *name, const char *newname, boolean_t recursive);
 220  225  int dsl_dataset_promote(const char *name, char *conflsnap);
 221  226  int dsl_dataset_clone_swap(dsl_dataset_t *clone, dsl_dataset_t *origin_head,
 222  227      boolean_t force);
 223  228  int dsl_dataset_user_hold(char *dsname, char *snapname, char *htag,
 224  229      boolean_t recursive, boolean_t temphold, int cleanup_fd);
 225  230  int dsl_dataset_user_hold_for_send(dsl_dataset_t *ds, char *htag,
 226  231      boolean_t temphold);
 227  232  int dsl_dataset_user_release(char *dsname, char *snapname, char *htag,
 228  233      boolean_t recursive);
 229  234  int dsl_dataset_user_release_tmp(struct dsl_pool *dp, uint64_t dsobj,
 230  235      char *htag, boolean_t retry);
 231  236  int dsl_dataset_get_holds(const char *dsname, nvlist_t **nvp);
 232  237  
 233  238  blkptr_t *dsl_dataset_get_blkptr(dsl_dataset_t *ds);
 234  239  void dsl_dataset_set_blkptr(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx);
 235  240  
 236  241  spa_t *dsl_dataset_get_spa(dsl_dataset_t *ds);
 237  242  
 238  243  boolean_t dsl_dataset_modified_since_lastsnap(dsl_dataset_t *ds);
 239  244  
 240  245  void dsl_dataset_sync(dsl_dataset_t *os, zio_t *zio, dmu_tx_t *tx);
 241  246  
 242  247  void dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp,
 243  248      dmu_tx_t *tx);
 244  249  int dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp,
 245  250      dmu_tx_t *tx, boolean_t async);
 246  251  boolean_t dsl_dataset_block_freeable(dsl_dataset_t *ds, const blkptr_t *bp,
 247  252      uint64_t blk_birth);
 248  253  uint64_t dsl_dataset_prev_snap_txg(dsl_dataset_t *ds);
 249  254  
 250  255  void dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx);
 251  256  void dsl_dataset_stats(dsl_dataset_t *os, nvlist_t *nv);
 252  257  void dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat);
 253  258  void dsl_dataset_space(dsl_dataset_t *ds,
 254  259      uint64_t *refdbytesp, uint64_t *availbytesp,
 255  260      uint64_t *usedobjsp, uint64_t *availobjsp);
 256  261  uint64_t dsl_dataset_fsid_guid(dsl_dataset_t *ds);
 257  262  int dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *new,
 258  263      uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
 259  264  int dsl_dataset_space_wouldfree(dsl_dataset_t *firstsnap, dsl_dataset_t *last,
 260  265      uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
 261  266  
 262  267  int dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf);
 263  268  
 264  269  int dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota,
 265  270      uint64_t asize, uint64_t inflight, uint64_t *used,
 266  271      uint64_t *ref_rsrv);
 267  272  int dsl_dataset_set_quota(const char *dsname, zprop_source_t source,
 268  273      uint64_t quota);
 269  274  dsl_syncfunc_t dsl_dataset_set_quota_sync;
 270  275  int dsl_dataset_set_reservation(const char *dsname, zprop_source_t source,
 271  276      uint64_t reservation);
 272  277  
 273  278  int dsl_destroy_inconsistent(const char *dsname, void *arg);
 274  279  
 275  280  #ifdef ZFS_DEBUG
 276  281  #define dprintf_ds(ds, fmt, ...) do { \
 277  282          if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
 278  283          char *__ds_name = kmem_alloc(MAXNAMELEN, KM_SLEEP); \
 279  284          dsl_dataset_name(ds, __ds_name); \
 280  285          dprintf("ds=%s " fmt, __ds_name, __VA_ARGS__); \
 281  286          kmem_free(__ds_name, MAXNAMELEN); \
 282  287          } \
 283  288  _NOTE(CONSTCOND) } while (0)
 284  289  #else
 285  290  #define dprintf_ds(dd, fmt, ...)
 286  291  #endif
 287  292  
 288  293  #ifdef  __cplusplus
 289  294  }
 290  295  #endif
 291  296  
 292  297  #endif /* _SYS_DSL_DATASET_H */
  
    | 
      ↓ open down ↓ | 
    193 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX