The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/include/sys/dsl_dataset.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * The contents of this file are subject to the terms of the
    5  * Common Development and Distribution License (the "License").
    6  * You may not use this file except in compliance with the License.
    7  *
    8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
    9  * or https://opensource.org/licenses/CDDL-1.0.
   10  * See the License for the specific language governing permissions
   11  * and limitations under the License.
   12  *
   13  * When distributing Covered Code, include this CDDL HEADER in each
   14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   15  * If applicable, add the following below this CDDL HEADER, with the
   16  * fields enclosed by brackets "[]" replaced with your own identifying
   17  * information: Portions Copyright [yyyy] [name of copyright owner]
   18  *
   19  * CDDL HEADER END
   20  */
   21 /*
   22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
   23  * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
   24  * Copyright (c) 2013 Steven Hartland. All rights reserved.
   25  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
   26  */
   27 
   28 #ifndef _SYS_DSL_DATASET_H
   29 #define _SYS_DSL_DATASET_H
   30 
   31 #include <sys/dmu.h>
   32 #include <sys/spa.h>
   33 #include <sys/txg.h>
   34 #include <sys/zio.h>
   35 #include <sys/bplist.h>
   36 #include <sys/dsl_synctask.h>
   37 #include <sys/zfs_context.h>
   38 #include <sys/dsl_deadlist.h>
   39 #include <sys/zfs_refcount.h>
   40 #include <sys/rrwlock.h>
   41 #include <sys/dsl_crypt.h>
   42 #include <zfeature_common.h>
   43 
   44 #ifdef  __cplusplus
   45 extern "C" {
   46 #endif
   47 
   48 struct dsl_dataset;
   49 struct dsl_dir;
   50 struct dsl_pool;
   51 struct dsl_crypto_params;
   52 struct dsl_key_mapping;
   53 struct zfs_bookmark_phys;
   54 
   55 #define DS_FLAG_INCONSISTENT    (1ULL<<0)
   56 #define DS_IS_INCONSISTENT(ds)  \
   57         (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_INCONSISTENT)
   58 
   59 /*
   60  * Do not allow this dataset to be promoted.
   61  */
   62 #define DS_FLAG_NOPROMOTE       (1ULL<<1)
   63 
   64 /*
   65  * DS_FLAG_UNIQUE_ACCURATE is set if ds_unique_bytes has been correctly
   66  * calculated for head datasets (starting with SPA_VERSION_UNIQUE_ACCURATE,
   67  * refquota/refreservations).
   68  */
   69 #define DS_FLAG_UNIQUE_ACCURATE (1ULL<<2)
   70 
   71 /*
   72  * DS_FLAG_DEFER_DESTROY is set after 'zfs destroy -d' has been called
   73  * on a dataset. This allows the dataset to be destroyed using 'zfs release'.
   74  */
   75 #define DS_FLAG_DEFER_DESTROY   (1ULL<<3)
   76 #define DS_IS_DEFER_DESTROY(ds) \
   77         (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_DEFER_DESTROY)
   78 
   79 /*
   80  * DS_FIELD_* are strings that are used in the "extensified" dataset zap object.
   81  * They should be of the format <reverse-dns>:<field>.
   82  */
   83 
   84 /*
   85  * This field's value is the object ID of a zap object which contains the
   86  * bookmarks of this dataset.  If it is present, then this dataset is counted
   87  * in the refcount of the SPA_FEATURES_BOOKMARKS feature.
   88  */
   89 #define DS_FIELD_BOOKMARK_NAMES "com.delphix:bookmarks"
   90 
   91 /*
   92  * This field is present (with value=0) if this dataset may contain large
   93  * dnodes (>512B).  If it is present, then this dataset is counted in the
   94  * refcount of the SPA_FEATURE_LARGE_DNODE feature.
   95  */
   96 #define DS_FIELD_LARGE_DNODE "org.zfsonlinux:large_dnode"
   97 
   98 /*
   99  * These fields are set on datasets that are in the middle of a resumable
  100  * receive, and allow the sender to resume the send if it is interrupted.
  101  */
  102 #define DS_FIELD_RESUME_FROMGUID "com.delphix:resume_fromguid"
  103 #define DS_FIELD_RESUME_TONAME "com.delphix:resume_toname"
  104 #define DS_FIELD_RESUME_TOGUID "com.delphix:resume_toguid"
  105 #define DS_FIELD_RESUME_OBJECT "com.delphix:resume_object"
  106 #define DS_FIELD_RESUME_OFFSET "com.delphix:resume_offset"
  107 #define DS_FIELD_RESUME_BYTES "com.delphix:resume_bytes"
  108 #define DS_FIELD_RESUME_LARGEBLOCK "com.delphix:resume_largeblockok"
  109 #define DS_FIELD_RESUME_EMBEDOK "com.delphix:resume_embedok"
  110 #define DS_FIELD_RESUME_COMPRESSOK "com.delphix:resume_compressok"
  111 #define DS_FIELD_RESUME_RAWOK "com.datto:resume_rawok"
  112 
  113 /*
  114  * This field is set to the object number of the remap deadlist if one exists.
  115  */
  116 #define DS_FIELD_REMAP_DEADLIST "com.delphix:remap_deadlist"
  117 
  118 /*
  119  * We were receiving an incremental from a redaction bookmark, and these are the
  120  * guids of its snapshots.
  121  */
  122 #define DS_FIELD_RESUME_REDACT_BOOKMARK_SNAPS \
  123         "com.delphix:resume_redact_book_snaps"
  124 
  125 /*
  126  * This field is set to the ivset guid for encrypted snapshots. This is used
  127  * for validating raw receives.
  128  */
  129 #define DS_FIELD_IVSET_GUID     "com.datto:ivset_guid"
  130 
  131 /*
  132  * DS_FLAG_CI_DATASET is set if the dataset contains a file system whose
  133  * name lookups should be performed case-insensitively.
  134  */
  135 #define DS_FLAG_CI_DATASET      (1ULL<<16)
  136 
  137 #define DS_CREATE_FLAG_NODIRTY  (1ULL<<24)
  138 
  139 typedef struct dsl_dataset_phys {
  140         uint64_t ds_dir_obj;            /* DMU_OT_DSL_DIR */
  141         uint64_t ds_prev_snap_obj;      /* DMU_OT_DSL_DATASET */
  142         uint64_t ds_prev_snap_txg;
  143         uint64_t ds_next_snap_obj;      /* DMU_OT_DSL_DATASET */
  144         uint64_t ds_snapnames_zapobj;   /* DMU_OT_DSL_DS_SNAP_MAP 0 for snaps */
  145         uint64_t ds_num_children;       /* clone/snap children; ==0 for head */
  146         uint64_t ds_creation_time;      /* seconds since 1970 */
  147         uint64_t ds_creation_txg;
  148         uint64_t ds_deadlist_obj;       /* DMU_OT_DEADLIST */
  149         /*
  150          * ds_referenced_bytes, ds_compressed_bytes, and ds_uncompressed_bytes
  151          * include all blocks referenced by this dataset, including those
  152          * shared with any other datasets.
  153          */
  154         uint64_t ds_referenced_bytes;
  155         uint64_t ds_compressed_bytes;
  156         uint64_t ds_uncompressed_bytes;
  157         uint64_t ds_unique_bytes;       /* only relevant to snapshots */
  158         /*
  159          * The ds_fsid_guid is a 56-bit ID that can change to avoid
  160          * collisions.  The ds_guid is a 64-bit ID that will never
  161          * change, so there is a small probability that it will collide.
  162          */
  163         uint64_t ds_fsid_guid;
  164         uint64_t ds_guid;
  165         uint64_t ds_flags;              /* DS_FLAG_* */
  166         blkptr_t ds_bp;
  167         uint64_t ds_next_clones_obj;    /* DMU_OT_DSL_CLONES */
  168         uint64_t ds_props_obj;          /* DMU_OT_DSL_PROPS for snaps */
  169         uint64_t ds_userrefs_obj;       /* DMU_OT_USERREFS */
  170         uint64_t ds_pad[5]; /* pad out to 320 bytes for good measure */
  171 } dsl_dataset_phys_t;
  172 
  173 typedef struct dsl_dataset {
  174         dmu_buf_user_t ds_dbu;
  175         rrwlock_t ds_bp_rwlock; /* Protects ds_phys->ds_bp */
  176 
  177         /* Immutable: */
  178         struct dsl_dir *ds_dir;
  179         dmu_buf_t *ds_dbuf;
  180         uint64_t ds_object;
  181         uint64_t ds_fsid_guid;
  182         boolean_t ds_is_snapshot;
  183         struct dsl_key_mapping *ds_key_mapping;
  184 
  185         /* only used in syncing context, only valid for non-snapshots: */
  186         struct dsl_dataset *ds_prev;
  187         uint64_t ds_bookmarks_obj;  /* DMU_OTN_ZAP_METADATA */
  188         avl_tree_t ds_bookmarks; /* dsl_bookmark_node_t */
  189 
  190         /* has internal locking: */
  191         dsl_deadlist_t ds_deadlist;
  192         bplist_t ds_pending_deadlist;
  193 
  194         /*
  195          * The remap deadlist contains blocks (DVA's, really) that are
  196          * referenced by the previous snapshot and point to indirect vdevs,
  197          * but in this dataset they have been remapped to point to concrete
  198          * (or at least, less-indirect) vdevs.  In other words, the
  199          * physical DVA is referenced by the previous snapshot but not by
  200          * this dataset.  Logically, the DVA continues to be referenced,
  201          * but we are using a different (less indirect) physical DVA.
  202          * This deadlist is used to determine when physical DVAs that
  203          * point to indirect vdevs are no longer referenced anywhere,
  204          * and thus should be marked obsolete.
  205          *
  206          * This is only used if SPA_FEATURE_OBSOLETE_COUNTS is enabled.
  207          */
  208         dsl_deadlist_t ds_remap_deadlist;
  209         /* protects creation of the ds_remap_deadlist */
  210         kmutex_t ds_remap_deadlist_lock;
  211 
  212         /* protected by lock on pool's dp_dirty_datasets list */
  213         txg_node_t ds_dirty_link;
  214         list_node_t ds_synced_link;
  215 
  216         /*
  217          * ds_phys->ds_<accounting> is also protected by ds_lock.
  218          * Protected by ds_lock:
  219          */
  220         kmutex_t ds_lock;
  221         objset_t *ds_objset;
  222         uint64_t ds_userrefs;
  223         const void *ds_owner;
  224 
  225         /*
  226          * Long holds prevent the ds from being destroyed; they allow the
  227          * ds to remain held even after dropping the dp_config_rwlock.
  228          * Owning counts as a long hold.  See the comments above
  229          * dsl_pool_hold() for details.
  230          */
  231         zfs_refcount_t ds_longholds;
  232 
  233         /* no locking; only for making guesses */
  234         uint64_t ds_trysnap_txg;
  235 
  236         /* for objset_open() */
  237         kmutex_t ds_opening_lock;
  238 
  239         uint64_t ds_reserved;   /* cached refreservation */
  240         uint64_t ds_quota;      /* cached refquota */
  241 
  242         kmutex_t ds_sendstream_lock;
  243         list_t ds_sendstreams;
  244 
  245         /*
  246          * When in the middle of a resumable receive, tracks how much
  247          * progress we have made.
  248          */
  249         uint64_t ds_resume_object[TXG_SIZE];
  250         uint64_t ds_resume_offset[TXG_SIZE];
  251         uint64_t ds_resume_bytes[TXG_SIZE];
  252 
  253         /* Protected by our dsl_dir's dd_lock */
  254         list_t ds_prop_cbs;
  255 
  256         /*
  257          * For ZFEATURE_FLAG_PER_DATASET features, set if this dataset
  258          * uses this feature.
  259          */
  260         void *ds_feature[SPA_FEATURES];
  261 
  262         /*
  263          * Set if we need to activate the feature on this dataset this txg
  264          * (used only in syncing context).
  265          */
  266         void *ds_feature_activation[SPA_FEATURES];
  267 
  268         /* Protected by ds_lock; keep at end of struct for better locality */
  269         char ds_snapname[ZFS_MAX_DATASET_NAME_LEN];
  270 } dsl_dataset_t;
  271 
  272 static inline dsl_dataset_phys_t *
  273 dsl_dataset_phys(dsl_dataset_t *ds)
  274 {
  275         return ((dsl_dataset_phys_t *)ds->ds_dbuf->db_data);
  276 }
  277 
  278 typedef struct dsl_dataset_promote_arg {
  279         const char *ddpa_clonename;
  280         dsl_dataset_t *ddpa_clone;
  281         list_t shared_snaps, origin_snaps, clone_snaps;
  282         dsl_dataset_t *origin_origin; /* origin of the origin */
  283         uint64_t used, comp, uncomp, unique, cloneusedsnap, originusedsnap;
  284         nvlist_t *err_ds;
  285         cred_t *cr;
  286         proc_t *proc;
  287 } dsl_dataset_promote_arg_t;
  288 
  289 typedef struct dsl_dataset_rollback_arg {
  290         const char *ddra_fsname;
  291         const char *ddra_tosnap;
  292         void *ddra_owner;
  293         nvlist_t *ddra_result;
  294 } dsl_dataset_rollback_arg_t;
  295 
  296 typedef struct dsl_dataset_snapshot_arg {
  297         nvlist_t *ddsa_snaps;
  298         nvlist_t *ddsa_props;
  299         nvlist_t *ddsa_errors;
  300         cred_t *ddsa_cr;
  301         proc_t *ddsa_proc;
  302 } dsl_dataset_snapshot_arg_t;
  303 
  304 typedef struct dsl_dataset_rename_snapshot_arg {
  305         const char *ddrsa_fsname;
  306         const char *ddrsa_oldsnapname;
  307         const char *ddrsa_newsnapname;
  308         boolean_t ddrsa_recursive;
  309         dmu_tx_t *ddrsa_tx;
  310 } dsl_dataset_rename_snapshot_arg_t;
  311 
  312 /*
  313  * The max length of a temporary tag prefix is the number of hex digits
  314  * required to express UINT64_MAX plus one for the hyphen.
  315  */
  316 #define MAX_TAG_PREFIX_LEN      17
  317 
  318 #define dsl_dataset_is_snapshot(ds) \
  319         (dsl_dataset_phys(ds)->ds_num_children != 0)
  320 
  321 #define DS_UNIQUE_IS_ACCURATE(ds)       \
  322         ((dsl_dataset_phys(ds)->ds_flags & DS_FLAG_UNIQUE_ACCURATE) != 0)
  323 
  324 /* flags for holding the dataset */
  325 typedef enum ds_hold_flags {
  326         DS_HOLD_FLAG_NONE       = 0 << 0,
  327         DS_HOLD_FLAG_DECRYPT    = 1 << 0 /* needs access to encrypted data */
  328 } ds_hold_flags_t;
  329 
  330 int dsl_dataset_hold(struct dsl_pool *dp, const char *name, const void *tag,
  331     dsl_dataset_t **dsp);
  332 int dsl_dataset_hold_flags(struct dsl_pool *dp, const char *name,
  333     ds_hold_flags_t flags, const void *tag, dsl_dataset_t **dsp);
  334 boolean_t dsl_dataset_try_add_ref(struct dsl_pool *dp, dsl_dataset_t *ds,
  335     const void *tag);
  336 int dsl_dataset_create_key_mapping(dsl_dataset_t *ds);
  337 int dsl_dataset_hold_obj_flags(struct dsl_pool *dp, uint64_t dsobj,
  338     ds_hold_flags_t flags, const void *tag, dsl_dataset_t **);
  339 void dsl_dataset_remove_key_mapping(dsl_dataset_t *ds);
  340 int dsl_dataset_hold_obj(struct dsl_pool *dp, uint64_t dsobj,
  341     const void *tag, dsl_dataset_t **);
  342 void dsl_dataset_rele_flags(dsl_dataset_t *ds, ds_hold_flags_t flags,
  343     const void *tag);
  344 void dsl_dataset_rele(dsl_dataset_t *ds, const void *tag);
  345 int dsl_dataset_own(struct dsl_pool *dp, const char *name,
  346     ds_hold_flags_t flags, const void *tag, dsl_dataset_t **dsp);
  347 int dsl_dataset_own_force(struct dsl_pool *dp, const char *name,
  348     ds_hold_flags_t flags, const void *tag, dsl_dataset_t **dsp);
  349 int dsl_dataset_own_obj(struct dsl_pool *dp, uint64_t dsobj,
  350     ds_hold_flags_t flags, const void *tag, dsl_dataset_t **dsp);
  351 int dsl_dataset_own_obj_force(struct dsl_pool *dp, uint64_t dsobj,
  352     ds_hold_flags_t flags, const void *tag, dsl_dataset_t **dsp);
  353 void dsl_dataset_disown(dsl_dataset_t *ds, ds_hold_flags_t flags,
  354     const void *tag);
  355 void dsl_dataset_name(dsl_dataset_t *ds, char *name);
  356 boolean_t dsl_dataset_tryown(dsl_dataset_t *ds, const void *tag,
  357     boolean_t override);
  358 int dsl_dataset_namelen(dsl_dataset_t *ds);
  359 boolean_t dsl_dataset_has_owner(dsl_dataset_t *ds);
  360 uint64_t dsl_dataset_create_sync(dsl_dir_t *pds, const char *lastname,
  361     dsl_dataset_t *origin, uint64_t flags, cred_t *,
  362     struct dsl_crypto_params *, dmu_tx_t *);
  363 uint64_t dsl_dataset_create_sync_dd(dsl_dir_t *dd, dsl_dataset_t *origin,
  364     struct dsl_crypto_params *dcp, uint64_t flags, dmu_tx_t *tx);
  365 void dsl_dataset_snapshot_sync(void *arg, dmu_tx_t *tx);
  366 int dsl_dataset_snapshot_check(void *arg, dmu_tx_t *tx);
  367 int dsl_dataset_snapshot(nvlist_t *snaps, nvlist_t *props, nvlist_t *errors);
  368 void dsl_dataset_promote_sync(void *arg, dmu_tx_t *tx);
  369 int dsl_dataset_promote_check(void *arg, dmu_tx_t *tx);
  370 int dsl_dataset_promote(const char *name, char *conflsnap);
  371 int dsl_dataset_rename_snapshot(const char *fsname,
  372     const char *oldsnapname, const char *newsnapname, boolean_t recursive);
  373 int dsl_dataset_snapshot_tmp(const char *fsname, const char *snapname,
  374     minor_t cleanup_minor, const char *htag);
  375 
  376 blkptr_t *dsl_dataset_get_blkptr(dsl_dataset_t *ds);
  377 
  378 spa_t *dsl_dataset_get_spa(dsl_dataset_t *ds);
  379 
  380 boolean_t dsl_dataset_modified_since_snap(dsl_dataset_t *ds,
  381     dsl_dataset_t *snap);
  382 
  383 void dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx);
  384 void dsl_dataset_sync_done(dsl_dataset_t *ds, dmu_tx_t *tx);
  385 
  386 void dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp,
  387     dmu_tx_t *tx);
  388 int dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp,
  389     dmu_tx_t *tx, boolean_t async);
  390 void dsl_dataset_block_remapped(dsl_dataset_t *ds, uint64_t vdev,
  391     uint64_t offset, uint64_t size, uint64_t birth, dmu_tx_t *tx);
  392 int dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name,
  393     uint64_t *value);
  394 
  395 void dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx);
  396 
  397 int get_clones_stat_impl(dsl_dataset_t *ds, nvlist_t *val);
  398 char *get_receive_resume_token(dsl_dataset_t *ds);
  399 uint64_t dsl_get_refratio(dsl_dataset_t *ds);
  400 uint64_t dsl_get_logicalreferenced(dsl_dataset_t *ds);
  401 uint64_t dsl_get_compressratio(dsl_dataset_t *ds);
  402 uint64_t dsl_get_used(dsl_dataset_t *ds);
  403 uint64_t dsl_get_creation(dsl_dataset_t *ds);
  404 uint64_t dsl_get_creationtxg(dsl_dataset_t *ds);
  405 uint64_t dsl_get_refquota(dsl_dataset_t *ds);
  406 uint64_t dsl_get_refreservation(dsl_dataset_t *ds);
  407 uint64_t dsl_get_guid(dsl_dataset_t *ds);
  408 uint64_t dsl_get_unique(dsl_dataset_t *ds);
  409 uint64_t dsl_get_objsetid(dsl_dataset_t *ds);
  410 uint64_t dsl_get_userrefs(dsl_dataset_t *ds);
  411 uint64_t dsl_get_defer_destroy(dsl_dataset_t *ds);
  412 uint64_t dsl_get_referenced(dsl_dataset_t *ds);
  413 uint64_t dsl_get_numclones(dsl_dataset_t *ds);
  414 uint64_t dsl_get_inconsistent(dsl_dataset_t *ds);
  415 uint64_t dsl_get_redacted(dsl_dataset_t *ds);
  416 uint64_t dsl_get_available(dsl_dataset_t *ds);
  417 int dsl_get_written(dsl_dataset_t *ds, uint64_t *written);
  418 int dsl_get_prev_snap(dsl_dataset_t *ds, char *snap);
  419 void dsl_get_redact_snaps(dsl_dataset_t *ds, nvlist_t *propval);
  420 int dsl_get_mountpoint(dsl_dataset_t *ds, const char *dsname, char *value,
  421     char *source);
  422 
  423 void get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv);
  424 void dsl_dataset_stats(dsl_dataset_t *os, nvlist_t *nv);
  425 
  426 void dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat);
  427 void dsl_dataset_space(dsl_dataset_t *ds,
  428     uint64_t *refdbytesp, uint64_t *availbytesp,
  429     uint64_t *usedobjsp, uint64_t *availobjsp);
  430 uint64_t dsl_dataset_fsid_guid(dsl_dataset_t *ds);
  431 int dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *newds,
  432     uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
  433 int dsl_dataset_space_written_bookmark(struct zfs_bookmark_phys *bmp,
  434     dsl_dataset_t *newds, uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
  435 int dsl_dataset_space_wouldfree(dsl_dataset_t *firstsnap, dsl_dataset_t *last,
  436     uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
  437 
  438 int dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf);
  439 
  440 int dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota,
  441     uint64_t asize, uint64_t inflight, uint64_t *used,
  442     uint64_t *ref_rsrv);
  443 int dsl_dataset_set_refquota(const char *dsname, zprop_source_t source,
  444     uint64_t quota);
  445 int dsl_dataset_set_refreservation(const char *dsname, zprop_source_t source,
  446     uint64_t reservation);
  447 int dsl_dataset_set_compression(const char *dsname, zprop_source_t source,
  448     uint64_t compression);
  449 
  450 boolean_t dsl_dataset_is_before(dsl_dataset_t *later, dsl_dataset_t *earlier,
  451     uint64_t earlier_txg);
  452 void dsl_dataset_long_hold(dsl_dataset_t *ds, const void *tag);
  453 void dsl_dataset_long_rele(dsl_dataset_t *ds, const void *tag);
  454 boolean_t dsl_dataset_long_held(dsl_dataset_t *ds);
  455 
  456 int dsl_dataset_clone_swap_check_impl(dsl_dataset_t *clone,
  457     dsl_dataset_t *origin_head, boolean_t force, void *owner, dmu_tx_t *tx);
  458 void dsl_dataset_clone_swap_sync_impl(dsl_dataset_t *clone,
  459     dsl_dataset_t *origin_head, dmu_tx_t *tx);
  460 int dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname,
  461     dmu_tx_t *tx, boolean_t recv, uint64_t cnt, cred_t *cr, proc_t *proc);
  462 void dsl_dataset_snapshot_sync_impl(dsl_dataset_t *ds, const char *snapname,
  463     dmu_tx_t *tx);
  464 
  465 void dsl_dataset_remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj,
  466     dmu_tx_t *tx);
  467 void dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds);
  468 int dsl_dataset_get_snapname(dsl_dataset_t *ds);
  469 int dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name,
  470     uint64_t *value);
  471 int dsl_dataset_snap_remove(dsl_dataset_t *ds, const char *name, dmu_tx_t *tx,
  472     boolean_t adj_cnt);
  473 void dsl_dataset_set_refreservation_sync_impl(dsl_dataset_t *ds,
  474     zprop_source_t source, uint64_t value, dmu_tx_t *tx);
  475 void dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx);
  476 boolean_t dsl_dataset_is_zapified(dsl_dataset_t *ds);
  477 boolean_t dsl_dataset_has_resume_receive_state(dsl_dataset_t *ds);
  478 
  479 int dsl_dataset_rollback_check(void *arg, dmu_tx_t *tx);
  480 void dsl_dataset_rollback_sync(void *arg, dmu_tx_t *tx);
  481 int dsl_dataset_rollback(const char *fsname, const char *tosnap, void *owner,
  482     nvlist_t *result);
  483 
  484 int dsl_dataset_rename_snapshot_check(void *arg, dmu_tx_t *tx);
  485 void dsl_dataset_rename_snapshot_sync(void *arg, dmu_tx_t *tx);
  486 
  487 uint64_t dsl_dataset_get_remap_deadlist_object(dsl_dataset_t *ds);
  488 void dsl_dataset_create_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx);
  489 boolean_t dsl_dataset_remap_deadlist_exists(dsl_dataset_t *ds);
  490 void dsl_dataset_destroy_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx);
  491 
  492 void dsl_dataset_activate_feature(uint64_t dsobj, spa_feature_t f, void *arg,
  493     dmu_tx_t *tx);
  494 void dsl_dataset_deactivate_feature(dsl_dataset_t *ds, spa_feature_t f,
  495     dmu_tx_t *tx);
  496 boolean_t dsl_dataset_feature_is_active(dsl_dataset_t *ds, spa_feature_t f);
  497 boolean_t dsl_dataset_get_uint64_array_feature(dsl_dataset_t *ds,
  498     spa_feature_t f, uint64_t *outlength, uint64_t **outp);
  499 
  500 void dsl_dataset_activate_redaction(dsl_dataset_t *ds, uint64_t *redact_snaps,
  501     uint64_t num_redact_snaps, dmu_tx_t *tx);
  502 
  503 int dsl_dataset_oldest_snapshot(spa_t *spa, uint64_t head_ds, uint64_t min_txg,
  504     uint64_t *oldest_dsobj);
  505 
  506 #ifdef ZFS_DEBUG
  507 #define dprintf_ds(ds, fmt, ...) do { \
  508         if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
  509         char *__ds_name = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); \
  510         dsl_dataset_name(ds, __ds_name); \
  511         dprintf("ds=%s " fmt, __ds_name, __VA_ARGS__); \
  512         kmem_free(__ds_name, ZFS_MAX_DATASET_NAME_LEN); \
  513         } \
  514 } while (0)
  515 #else
  516 #define dprintf_ds(dd, fmt, ...)
  517 #endif
  518 
  519 #ifdef  __cplusplus
  520 }
  521 #endif
  522 
  523 #endif /* _SYS_DSL_DATASET_H */

Cache object: c0b4914d6cad7adc56a0b7d5a6b15bf3


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.