Print this page
NEX-9673 Add capability to replicate cloned datasets relative to origin
Reviewed by: Alex Deiter <alex.deiter@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-6855 System fails to boot up after a large number of datasets created
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Revert "NEX-7251 Resume_token is not cleared right after finishing receive"
This reverts commit 9e97a45e8cf6ca59307a39e2d3c11c6e845e4187.
NEX-7251 Resume_token is not cleared right after finishing receive
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alexey Komarov <alexey.komarov@nexenta.com>
NEX-5272 KRRP: replicate snapshot properties
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Alexey Komarov <alexey.komarov@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
2605 want to resume interrupted zfs send
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Xin Li <delphij@freebsd.org>
Reviewed by: Arne Jansen <sensille@gmx.net>
Approved by: Dan McDonald <danmcd@omniti.com>
6160 /usr/lib/fs/zfs/bootinstall should use bootadm
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Reviewed by: Adam Števko <adam.stevko@gmail.com>
Reviewed by: Josef Sipek <jeffpc@josefsipek.net>
Approved by: Richard Lowe <richlowe@richlowe.net>
4185 add new cryptographic checksums to ZFS: SHA-512, Skein, Edon-R (NULL is not an int)
6171 dsl_prop_unregister() slows down dataset eviction.
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>
6047 SPARC boot should support feature@embedded_data
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Approved by: Dan McDonald <danmcd@omniti.com>
5959 clean up per-dataset feature count code
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Alex Reece <alex@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
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>
5765 add support for estimating send stream size with lzc_send_space when source is a bookmark
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Steven Hartland <killing@multiplay.co.uk>
Reviewed by: Bayard Bell <buffer.g.overflow@gmail.com>
Approved by: Albert Lee <trisk@nexenta.com>
NEX-3558 KRRP Integration
Fixup merge results
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/dsl_dataset.h
          +++ new/usr/src/uts/common/fs/zfs/sys/dsl_dataset.h
↓ open down ↓ 17 lines elided ↑ open up ↑
  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   23   * Copyright (c) 2011, 2017 by Delphix. All rights reserved.
  24   24   * Copyright (c) 2013, Joyent, Inc. All rights reserved.
  25   25   * Copyright (c) 2013 Steven Hartland. All rights reserved.
  26   26   * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
  27   27   * Copyright (c) 2014 Integros [integros.com]
       28 + * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
  28   29   */
  29   30  
  30   31  #ifndef _SYS_DSL_DATASET_H
  31   32  #define _SYS_DSL_DATASET_H
  32   33  
  33   34  #include <sys/dmu.h>
  34   35  #include <sys/spa.h>
  35   36  #include <sys/txg.h>
  36   37  #include <sys/zio.h>
  37   38  #include <sys/bplist.h>
↓ open down ↓ 56 lines elided ↑ open up ↑
  94   95  #define DS_FIELD_RESUME_TONAME "com.delphix:resume_toname"
  95   96  #define DS_FIELD_RESUME_TOGUID "com.delphix:resume_toguid"
  96   97  #define DS_FIELD_RESUME_OBJECT "com.delphix:resume_object"
  97   98  #define DS_FIELD_RESUME_OFFSET "com.delphix:resume_offset"
  98   99  #define DS_FIELD_RESUME_BYTES "com.delphix:resume_bytes"
  99  100  #define DS_FIELD_RESUME_LARGEBLOCK "com.delphix:resume_largeblockok"
 100  101  #define DS_FIELD_RESUME_EMBEDOK "com.delphix:resume_embedok"
 101  102  #define DS_FIELD_RESUME_COMPRESSOK "com.delphix:resume_compressok"
 102  103  
 103  104  /*
 104      - * This field is set to the object number of the remap deadlist if one exists.
 105      - */
 106      -#define DS_FIELD_REMAP_DEADLIST "com.delphix:remap_deadlist"
 107      -
 108      -/*
 109  105   * DS_FLAG_CI_DATASET is set if the dataset contains a file system whose
 110  106   * name lookups should be performed case-insensitively.
 111  107   */
 112  108  #define DS_FLAG_CI_DATASET      (1ULL<<16)
 113  109  
 114  110  #define DS_CREATE_FLAG_NODIRTY  (1ULL<<24)
 115  111  
      112 +typedef struct dsl_dataset_snapshot_arg {
      113 +        nvlist_t *ddsa_snaps;
      114 +        nvlist_t *ddsa_props;
      115 +        nvlist_t *ddsa_errors;
      116 +        cred_t *ddsa_cr;
      117 +        boolean_t ddsa_autosnap;
      118 +} dsl_dataset_snapshot_arg_t;
      119 +
 116  120  typedef struct dsl_dataset_phys {
 117  121          uint64_t ds_dir_obj;            /* DMU_OT_DSL_DIR */
 118  122          uint64_t ds_prev_snap_obj;      /* DMU_OT_DSL_DATASET */
 119  123          uint64_t ds_prev_snap_txg;
 120  124          uint64_t ds_next_snap_obj;      /* DMU_OT_DSL_DATASET */
 121  125          uint64_t ds_snapnames_zapobj;   /* DMU_OT_DSL_DS_SNAP_MAP 0 for snaps */
 122  126          uint64_t ds_num_children;       /* clone/snap children; ==0 for head */
 123  127          uint64_t ds_creation_time;      /* seconds since 1970 */
 124  128          uint64_t ds_creation_txg;
 125  129          uint64_t ds_deadlist_obj;       /* DMU_OT_DEADLIST */
↓ open down ↓ 33 lines elided ↑ open up ↑
 159  163          boolean_t ds_is_snapshot;
 160  164  
 161  165          /* only used in syncing context, only valid for non-snapshots: */
 162  166          struct dsl_dataset *ds_prev;
 163  167          uint64_t ds_bookmarks;  /* DMU_OTN_ZAP_METADATA */
 164  168  
 165  169          /* has internal locking: */
 166  170          dsl_deadlist_t ds_deadlist;
 167  171          bplist_t ds_pending_deadlist;
 168  172  
 169      -        /*
 170      -         * The remap deadlist contains blocks (DVA's, really) that are
 171      -         * referenced by the previous snapshot and point to indirect vdevs,
 172      -         * but in this dataset they have been remapped to point to concrete
 173      -         * (or at least, less-indirect) vdevs.  In other words, the
 174      -         * physical DVA is referenced by the previous snapshot but not by
 175      -         * this dataset.  Logically, the DVA continues to be referenced,
 176      -         * but we are using a different (less indirect) physical DVA.
 177      -         * This deadlist is used to determine when physical DVAs that
 178      -         * point to indirect vdevs are no longer referenced anywhere,
 179      -         * and thus should be marked obsolete.
 180      -         *
 181      -         * This is only used if SPA_FEATURE_OBSOLETE_COUNTS is enabled.
 182      -         */
 183      -        dsl_deadlist_t ds_remap_deadlist;
 184      -        /* protects creation of the ds_remap_deadlist */
 185      -        kmutex_t ds_remap_deadlist_lock;
 186      -
 187  173          /* protected by lock on pool's dp_dirty_datasets list */
 188  174          txg_node_t ds_dirty_link;
 189  175          list_node_t ds_synced_link;
 190  176  
 191  177          /*
 192  178           * ds_phys->ds_<accounting> is also protected by ds_lock.
 193  179           * Protected by ds_lock:
 194  180           */
 195  181          kmutex_t ds_lock;
 196  182          objset_t *ds_objset;
 197  183          uint64_t ds_userrefs;
 198  184          void *ds_owner;
 199  185  
 200  186          /*
      187 +         * NOTE: for pool with special device only
      188 +         * Last transaction data was moved from special devices
      189 +         * to other (regular) devices in a pool.
      190 +         */
      191 +        uint64_t ds_lstxg;
      192 +
      193 +        /*
      194 +         * NOTE: for pool with special device only
      195 +         * Level 0 bookmark we remembered when we were interrupted
      196 +         * during traversal process. Used to resume traversal
      197 +         * later.
      198 +         */
      199 +        zbookmark_phys_t ds_lszb;
      200 +
      201 +        /*
 201  202           * Long holds prevent the ds from being destroyed; they allow the
 202  203           * ds to remain held even after dropping the dp_config_rwlock.
 203  204           * Owning counts as a long hold.  See the comments above
 204  205           * dsl_pool_hold() for details.
 205  206           */
      207 +
 206  208          refcount_t ds_longholds;
 207  209  
 208  210          /* no locking; only for making guesses */
 209  211          uint64_t ds_trysnap_txg;
 210  212  
 211  213          /* for objset_open() */
 212  214          kmutex_t ds_opening_lock;
 213  215  
 214  216          uint64_t ds_reserved;   /* cached refreservation */
 215  217          uint64_t ds_quota;      /* cached refquota */
↓ open down ↓ 44 lines elided ↑ open up ↑
 260  262          cred_t *cr;
 261  263  } dsl_dataset_promote_arg_t;
 262  264  
 263  265  typedef struct dsl_dataset_rollback_arg {
 264  266          const char *ddra_fsname;
 265  267          const char *ddra_tosnap;
 266  268          void *ddra_owner;
 267  269          nvlist_t *ddra_result;
 268  270  } dsl_dataset_rollback_arg_t;
 269  271  
 270      -typedef struct dsl_dataset_snapshot_arg {
 271      -        nvlist_t *ddsa_snaps;
 272      -        nvlist_t *ddsa_props;
 273      -        nvlist_t *ddsa_errors;
 274      -        cred_t *ddsa_cr;
 275      -} dsl_dataset_snapshot_arg_t;
 276      -
 277  272  /*
 278  273   * The max length of a temporary tag prefix is the number of hex digits
 279  274   * required to express UINT64_MAX plus one for the hyphen.
 280  275   */
 281  276  #define MAX_TAG_PREFIX_LEN      17
 282  277  
 283  278  #define dsl_dataset_is_snapshot(ds) \
 284  279          (dsl_dataset_phys(ds)->ds_num_children != 0)
 285  280  
 286  281  #define DS_UNIQUE_IS_ACCURATE(ds)       \
↓ open down ↓ 39 lines elided ↑ open up ↑
 326  321  boolean_t dsl_dataset_modified_since_snap(dsl_dataset_t *ds,
 327  322      dsl_dataset_t *snap);
 328  323  
 329  324  void dsl_dataset_sync(dsl_dataset_t *os, zio_t *zio, dmu_tx_t *tx);
 330  325  void dsl_dataset_sync_done(dsl_dataset_t *os, dmu_tx_t *tx);
 331  326  
 332  327  void dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp,
 333  328      dmu_tx_t *tx);
 334  329  int dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp,
 335  330      dmu_tx_t *tx, boolean_t async);
 336      -void dsl_dataset_block_remapped(dsl_dataset_t *ds, uint64_t vdev,
 337      -    uint64_t offset, uint64_t size, uint64_t birth, dmu_tx_t *tx);
 338  331  
 339  332  void dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx);
 340  333  
 341  334  int get_clones_stat_impl(dsl_dataset_t *ds, nvlist_t *val);
 342  335  char *get_receive_resume_stats_impl(dsl_dataset_t *ds);
 343  336  char *get_child_receive_stats(dsl_dataset_t *ds);
 344  337  uint64_t dsl_get_refratio(dsl_dataset_t *ds);
 345  338  uint64_t dsl_get_logicalreferenced(dsl_dataset_t *ds);
 346  339  uint64_t dsl_get_compressratio(dsl_dataset_t *ds);
 347  340  uint64_t dsl_get_used(dsl_dataset_t *ds);
↓ open down ↓ 67 lines elided ↑ open up ↑
 415  408      zprop_source_t source, uint64_t value, dmu_tx_t *tx);
 416  409  void dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx);
 417  410  boolean_t dsl_dataset_is_zapified(dsl_dataset_t *ds);
 418  411  boolean_t dsl_dataset_has_resume_receive_state(dsl_dataset_t *ds);
 419  412  
 420  413  int dsl_dataset_rollback_check(void *arg, dmu_tx_t *tx);
 421  414  void dsl_dataset_rollback_sync(void *arg, dmu_tx_t *tx);
 422  415  int dsl_dataset_rollback(const char *fsname, const char *tosnap, void *owner,
 423  416      nvlist_t *result);
 424  417  
 425      -uint64_t dsl_dataset_get_remap_deadlist_object(dsl_dataset_t *ds);
 426      -void dsl_dataset_create_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx);
 427      -boolean_t dsl_dataset_remap_deadlist_exists(dsl_dataset_t *ds);
 428      -void dsl_dataset_destroy_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx);
      418 +int dsl_dataset_snapshot_check(void *arg, dmu_tx_t *tx);
      419 +void dsl_dataset_snapshot_sync(void *arg, dmu_tx_t *tx);
 429  420  
      421 +typedef struct {
      422 +        char name[ZFS_MAX_DATASET_NAME_LEN];
      423 +        char origin_name[ZFS_MAX_DATASET_NAME_LEN];
      424 +        uint64_t origin_guid;
      425 +        uint64_t cookie;
      426 +        boolean_t cookie_is_snap;
      427 +        boolean_t top_level_ds;
      428 +        dsl_dataset_t *ds;
      429 +        list_node_t node;
      430 +        avl_tree_t snapshots;
      431 +} zfs_ds_collector_entry_t;
      432 +
      433 +uint64_t dsl_dataset_creation_txg(const char *name);
      434 +
      435 +boolean_t dataset_name_hidden(const char *name);
      436 +
      437 +zfs_ds_collector_entry_t *dsl_dataset_collector_cache_alloc();
      438 +void dsl_dataset_collector_cache_free(zfs_ds_collector_entry_t *entry);
      439 +
 430  440  void dsl_dataset_deactivate_feature(uint64_t dsobj,
 431  441      spa_feature_t f, dmu_tx_t *tx);
 432  442  
 433  443  #ifdef ZFS_DEBUG
 434  444  #define dprintf_ds(ds, fmt, ...) do { \
 435  445          if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
 436  446          char *__ds_name = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); \
 437  447          dsl_dataset_name(ds, __ds_name); \
 438  448          dprintf("ds=%s " fmt, __ds_name, __VA_ARGS__); \
 439  449          kmem_free(__ds_name, ZFS_MAX_DATASET_NAME_LEN); \
↓ open down ↓ 11 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX