1168404Spjd/*
2168404Spjd * CDDL HEADER START
3168404Spjd *
4168404Spjd * The contents of this file are subject to the terms of the
5168404Spjd * Common Development and Distribution License (the "License").
6168404Spjd * You may not use this file except in compliance with the License.
7168404Spjd *
8168404Spjd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9168404Spjd * or http://www.opensolaris.org/os/licensing.
10168404Spjd * See the License for the specific language governing permissions
11168404Spjd * and limitations under the License.
12168404Spjd *
13168404Spjd * When distributing Covered Code, include this CDDL HEADER in each
14168404Spjd * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15168404Spjd * If applicable, add the following below this CDDL HEADER, with the
16168404Spjd * fields enclosed by brackets "[]" replaced with your own identifying
17168404Spjd * information: Portions Copyright [yyyy] [name of copyright owner]
18168404Spjd *
19168404Spjd * CDDL HEADER END
20168404Spjd */
21168404Spjd/*
22219089Spjd * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23262160Savg * Copyright (c) 2013 by Delphix. All rights reserved.
24265754Sdelphij * Copyright (c) 2013, Joyent, Inc. All rights reserved.
25252764Sdelphij * Copyright (c) 2013 Steven Hartland. All rights reserved.
26168404Spjd */
27168404Spjd
28168404Spjd#ifndef	_SYS_DSL_DATASET_H
29168404Spjd#define	_SYS_DSL_DATASET_H
30168404Spjd
31168404Spjd#include <sys/dmu.h>
32168404Spjd#include <sys/spa.h>
33168404Spjd#include <sys/txg.h>
34168404Spjd#include <sys/zio.h>
35168404Spjd#include <sys/bplist.h>
36168404Spjd#include <sys/dsl_synctask.h>
37168404Spjd#include <sys/zfs_context.h>
38219089Spjd#include <sys/dsl_deadlist.h>
39249643Smm#include <sys/refcount.h>
40168404Spjd
41168404Spjd#ifdef	__cplusplus
42168404Spjdextern "C" {
43168404Spjd#endif
44168404Spjd
45168404Spjdstruct dsl_dataset;
46168404Spjdstruct dsl_dir;
47168404Spjdstruct dsl_pool;
48168404Spjd
49168404Spjd#define	DS_FLAG_INCONSISTENT	(1ULL<<0)
50185029Spjd#define	DS_IS_INCONSISTENT(ds)	\
51185029Spjd	((ds)->ds_phys->ds_flags & DS_FLAG_INCONSISTENT)
52263391Sdelphij
53168404Spjd/*
54263391Sdelphij * Do not allow this dataset to be promoted.
55168404Spjd */
56168404Spjd#define	DS_FLAG_NOPROMOTE	(1ULL<<1)
57168404Spjd
58185029Spjd/*
59185029Spjd * DS_FLAG_UNIQUE_ACCURATE is set if ds_unique_bytes has been correctly
60185029Spjd * calculated for head datasets (starting with SPA_VERSION_UNIQUE_ACCURATE,
61185029Spjd * refquota/refreservations).
62185029Spjd */
63185029Spjd#define	DS_FLAG_UNIQUE_ACCURATE	(1ULL<<2)
64185029Spjd
65185029Spjd/*
66219089Spjd * DS_FLAG_DEFER_DESTROY is set after 'zfs destroy -d' has been called
67219089Spjd * on a dataset. This allows the dataset to be destroyed using 'zfs release'.
68219089Spjd */
69219089Spjd#define	DS_FLAG_DEFER_DESTROY	(1ULL<<3)
70219089Spjd#define	DS_IS_DEFER_DESTROY(ds)	\
71219089Spjd	((ds)->ds_phys->ds_flags & DS_FLAG_DEFER_DESTROY)
72219089Spjd
73219089Spjd/*
74263391Sdelphij * DS_FIELD_* are strings that are used in the "extensified" dataset zap object.
75263391Sdelphij * They should be of the format <reverse-dns>:<field>.
76263391Sdelphij */
77263391Sdelphij
78263391Sdelphij/*
79263410Sdelphij * This field's value is the object ID of a zap object which contains the
80263410Sdelphij * bookmarks of this dataset.  If it is present, then this dataset is counted
81263410Sdelphij * in the refcount of the SPA_FEATURES_BOOKMARKS feature.
82263410Sdelphij */
83263410Sdelphij#define	DS_FIELD_BOOKMARK_NAMES "com.delphix:bookmarks"
84263410Sdelphij
85263410Sdelphij/*
86185029Spjd * DS_FLAG_CI_DATASET is set if the dataset contains a file system whose
87185029Spjd * name lookups should be performed case-insensitively.
88185029Spjd */
89185029Spjd#define	DS_FLAG_CI_DATASET	(1ULL<<16)
90185029Spjd
91249643Smm#define	DS_CREATE_FLAG_NODIRTY	(1ULL<<24)
92249643Smm
93168404Spjdtypedef struct dsl_dataset_phys {
94185029Spjd	uint64_t ds_dir_obj;		/* DMU_OT_DSL_DIR */
95185029Spjd	uint64_t ds_prev_snap_obj;	/* DMU_OT_DSL_DATASET */
96168404Spjd	uint64_t ds_prev_snap_txg;
97185029Spjd	uint64_t ds_next_snap_obj;	/* DMU_OT_DSL_DATASET */
98185029Spjd	uint64_t ds_snapnames_zapobj;	/* DMU_OT_DSL_DS_SNAP_MAP 0 for snaps */
99168404Spjd	uint64_t ds_num_children;	/* clone/snap children; ==0 for head */
100168404Spjd	uint64_t ds_creation_time;	/* seconds since 1970 */
101168404Spjd	uint64_t ds_creation_txg;
102219089Spjd	uint64_t ds_deadlist_obj;	/* DMU_OT_DEADLIST */
103243674Smm	/*
104243674Smm	 * ds_referenced_bytes, ds_compressed_bytes, and ds_uncompressed_bytes
105243674Smm	 * include all blocks referenced by this dataset, including those
106243674Smm	 * shared with any other datasets.
107243674Smm	 */
108243674Smm	uint64_t ds_referenced_bytes;
109168404Spjd	uint64_t ds_compressed_bytes;
110168404Spjd	uint64_t ds_uncompressed_bytes;
111168404Spjd	uint64_t ds_unique_bytes;	/* only relevant to snapshots */
112168404Spjd	/*
113168404Spjd	 * The ds_fsid_guid is a 56-bit ID that can change to avoid
114168404Spjd	 * collisions.  The ds_guid is a 64-bit ID that will never
115168404Spjd	 * change, so there is a small probability that it will collide.
116168404Spjd	 */
117168404Spjd	uint64_t ds_fsid_guid;
118168404Spjd	uint64_t ds_guid;
119185029Spjd	uint64_t ds_flags;		/* DS_FLAG_* */
120168404Spjd	blkptr_t ds_bp;
121185029Spjd	uint64_t ds_next_clones_obj;	/* DMU_OT_DSL_CLONES */
122185029Spjd	uint64_t ds_props_obj;		/* DMU_OT_DSL_PROPS for snaps */
123219089Spjd	uint64_t ds_userrefs_obj;	/* DMU_OT_USERREFS */
124219089Spjd	uint64_t ds_pad[5]; /* pad out to 320 bytes for good measure */
125168404Spjd} dsl_dataset_phys_t;
126168404Spjd
127168404Spjdtypedef struct dsl_dataset {
128168404Spjd	/* Immutable: */
129168404Spjd	struct dsl_dir *ds_dir;
130168404Spjd	dsl_dataset_phys_t *ds_phys;
131168404Spjd	dmu_buf_t *ds_dbuf;
132168404Spjd	uint64_t ds_object;
133185029Spjd	uint64_t ds_fsid_guid;
134168404Spjd
135185029Spjd	/* only used in syncing context, only valid for non-snapshots: */
136185029Spjd	struct dsl_dataset *ds_prev;
137263410Sdelphij	uint64_t ds_bookmarks;  /* DMU_OTN_ZAP_METADATA */
138168404Spjd
139168404Spjd	/* has internal locking: */
140219089Spjd	dsl_deadlist_t ds_deadlist;
141219089Spjd	bplist_t ds_pending_deadlist;
142168404Spjd
143168404Spjd	/* protected by lock on pool's dp_dirty_datasets list */
144168404Spjd	txg_node_t ds_dirty_link;
145168404Spjd	list_node_t ds_synced_link;
146168404Spjd
147168404Spjd	/*
148168404Spjd	 * ds_phys->ds_<accounting> is also protected by ds_lock.
149168404Spjd	 * Protected by ds_lock:
150168404Spjd	 */
151168404Spjd	kmutex_t ds_lock;
152219089Spjd	objset_t *ds_objset;
153219089Spjd	uint64_t ds_userrefs;
154249643Smm	void *ds_owner;
155168404Spjd
156185029Spjd	/*
157249643Smm	 * Long holds prevent the ds from being destroyed; they allow the
158249643Smm	 * ds to remain held even after dropping the dp_config_rwlock.
159249643Smm	 * Owning counts as a long hold.  See the comments above
160249643Smm	 * dsl_pool_hold() for details.
161185029Spjd	 */
162249643Smm	refcount_t ds_longholds;
163185029Spjd
164168404Spjd	/* no locking; only for making guesses */
165168404Spjd	uint64_t ds_trysnap_txg;
166168404Spjd
167185029Spjd	/* for objset_open() */
168185029Spjd	kmutex_t ds_opening_lock;
169185029Spjd
170185029Spjd	uint64_t ds_reserved;	/* cached refreservation */
171185029Spjd	uint64_t ds_quota;	/* cached refquota */
172185029Spjd
173235951Smm	kmutex_t ds_sendstream_lock;
174235951Smm	list_t ds_sendstreams;
175235951Smm
176168404Spjd	/* Protected by ds_lock; keep at end of struct for better locality */
177168404Spjd	char ds_snapname[MAXNAMELEN];
178168404Spjd} dsl_dataset_t;
179168404Spjd
180219089Spjd/*
181219089Spjd * The max length of a temporary tag prefix is the number of hex digits
182219089Spjd * required to express UINT64_MAX plus one for the hyphen.
183219089Spjd */
184219089Spjd#define	MAX_TAG_PREFIX_LEN	17
185219089Spjd
186219089Spjd#define	dsl_dataset_is_snapshot(ds) \
187168404Spjd	((ds)->ds_phys->ds_num_children != 0)
188168404Spjd
189185029Spjd#define	DS_UNIQUE_IS_ACCURATE(ds)	\
190185029Spjd	(((ds)->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) != 0)
191185029Spjd
192249643Smmint dsl_dataset_hold(struct dsl_pool *dp, const char *name, void *tag,
193249643Smm    dsl_dataset_t **dsp);
194249643Smmint dsl_dataset_hold_obj(struct dsl_pool *dp, uint64_t dsobj, void *tag,
195249643Smm    dsl_dataset_t **);
196249643Smmvoid dsl_dataset_rele(dsl_dataset_t *ds, void *tag);
197249643Smmint dsl_dataset_own(struct dsl_pool *dp, const char *name,
198219089Spjd    void *tag, dsl_dataset_t **dsp);
199185029Spjdint dsl_dataset_own_obj(struct dsl_pool *dp, uint64_t dsobj,
200249643Smm    void *tag, dsl_dataset_t **dsp);
201249643Smmvoid dsl_dataset_disown(dsl_dataset_t *ds, void *tag);
202168404Spjdvoid dsl_dataset_name(dsl_dataset_t *ds, char *name);
203249643Smmboolean_t dsl_dataset_tryown(dsl_dataset_t *ds, void *tag);
204185029Spjduint64_t dsl_dataset_create_sync(dsl_dir_t *pds, const char *lastname,
205185029Spjd    dsl_dataset_t *origin, uint64_t flags, cred_t *, dmu_tx_t *);
206185029Spjduint64_t dsl_dataset_create_sync_dd(dsl_dir_t *dd, dsl_dataset_t *origin,
207185029Spjd    uint64_t flags, dmu_tx_t *tx);
208249643Smmint dsl_dataset_snapshot(nvlist_t *snaps, nvlist_t *props, nvlist_t *errors);
209219089Spjdint dsl_dataset_promote(const char *name, char *conflsnap);
210185029Spjdint dsl_dataset_clone_swap(dsl_dataset_t *clone, dsl_dataset_t *origin_head,
211185029Spjd    boolean_t force);
212249643Smmint dsl_dataset_rename_snapshot(const char *fsname,
213249643Smm    const char *oldsnapname, const char *newsnapname, boolean_t recursive);
214249643Smmint dsl_dataset_snapshot_tmp(const char *fsname, const char *snapname,
215249643Smm    minor_t cleanup_minor, const char *htag);
216168404Spjd
217168404Spjdblkptr_t *dsl_dataset_get_blkptr(dsl_dataset_t *ds);
218168404Spjdvoid dsl_dataset_set_blkptr(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx);
219168404Spjd
220168404Spjdspa_t *dsl_dataset_get_spa(dsl_dataset_t *ds);
221168404Spjd
222262160Savgboolean_t dsl_dataset_modified_since_snap(dsl_dataset_t *ds,
223262160Savg    dsl_dataset_t *snap);
224185029Spjd
225168404Spjdvoid dsl_dataset_sync(dsl_dataset_t *os, zio_t *zio, dmu_tx_t *tx);
226168404Spjd
227219089Spjdvoid dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp,
228168404Spjd    dmu_tx_t *tx);
229219089Spjdint dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp,
230219089Spjd    dmu_tx_t *tx, boolean_t async);
231219089Spjdboolean_t dsl_dataset_block_freeable(dsl_dataset_t *ds, const blkptr_t *bp,
232219089Spjd    uint64_t blk_birth);
233168404Spjduint64_t dsl_dataset_prev_snap_txg(dsl_dataset_t *ds);
234168404Spjd
235168404Spjdvoid dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx);
236168404Spjdvoid dsl_dataset_stats(dsl_dataset_t *os, nvlist_t *nv);
237168404Spjdvoid dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat);
238168404Spjdvoid dsl_dataset_space(dsl_dataset_t *ds,
239168404Spjd    uint64_t *refdbytesp, uint64_t *availbytesp,
240168404Spjd    uint64_t *usedobjsp, uint64_t *availobjsp);
241168404Spjduint64_t dsl_dataset_fsid_guid(dsl_dataset_t *ds);
242229578Smmint dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *new,
243229578Smm    uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
244229578Smmint dsl_dataset_space_wouldfree(dsl_dataset_t *firstsnap, dsl_dataset_t *last,
245229578Smm    uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
246243674Smmboolean_t dsl_dataset_is_dirty(dsl_dataset_t *ds);
247168404Spjd
248185029Spjdint dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf);
249185029Spjd
250185029Spjdint dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota,
251185029Spjd    uint64_t asize, uint64_t inflight, uint64_t *used,
252185029Spjd    uint64_t *ref_rsrv);
253249643Smmint dsl_dataset_set_refquota(const char *dsname, zprop_source_t source,
254219089Spjd    uint64_t quota);
255249643Smmint dsl_dataset_set_refreservation(const char *dsname, zprop_source_t source,
256219089Spjd    uint64_t reservation);
257168404Spjd
258263410Sdelphijboolean_t dsl_dataset_is_before(dsl_dataset_t *later, dsl_dataset_t *earlier,
259263410Sdelphij    uint64_t earlier_txg);
260249643Smmvoid dsl_dataset_long_hold(dsl_dataset_t *ds, void *tag);
261249643Smmvoid dsl_dataset_long_rele(dsl_dataset_t *ds, void *tag);
262249643Smmboolean_t dsl_dataset_long_held(dsl_dataset_t *ds);
263219089Spjd
264249643Smmint dsl_dataset_clone_swap_check_impl(dsl_dataset_t *clone,
265257119Sdelphij    dsl_dataset_t *origin_head, boolean_t force, void *owner, dmu_tx_t *tx);
266249643Smmvoid dsl_dataset_clone_swap_sync_impl(dsl_dataset_t *clone,
267249643Smm    dsl_dataset_t *origin_head, dmu_tx_t *tx);
268249643Smmint dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname,
269265754Sdelphij    dmu_tx_t *tx, boolean_t recv, uint64_t cnt, cred_t *cr);
270249643Smmvoid dsl_dataset_snapshot_sync_impl(dsl_dataset_t *ds, const char *snapname,
271249643Smm    dmu_tx_t *tx);
272249643Smm
273249643Smmvoid dsl_dataset_remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj,
274249643Smm    dmu_tx_t *tx);
275249643Smmvoid dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds);
276249643Smmint dsl_dataset_get_snapname(dsl_dataset_t *ds);
277249643Smmint dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name,
278249643Smm    uint64_t *value);
279265754Sdelphijint dsl_dataset_snap_remove(dsl_dataset_t *ds, const char *name, dmu_tx_t *tx,
280265754Sdelphij    boolean_t adj_cnt);
281249643Smmvoid dsl_dataset_set_refreservation_sync_impl(dsl_dataset_t *ds,
282249643Smm    zprop_source_t source, uint64_t value, dmu_tx_t *tx);
283263410Sdelphijvoid dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx);
284263386Sdelphijint dsl_dataset_rollback(const char *fsname, void *owner, nvlist_t *result);
285249643Smm
286168404Spjd#ifdef ZFS_DEBUG
287168404Spjd#define	dprintf_ds(ds, fmt, ...) do { \
288168404Spjd	if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
289168404Spjd	char *__ds_name = kmem_alloc(MAXNAMELEN, KM_SLEEP); \
290168404Spjd	dsl_dataset_name(ds, __ds_name); \
291168404Spjd	dprintf("ds=%s " fmt, __ds_name, __VA_ARGS__); \
292168404Spjd	kmem_free(__ds_name, MAXNAMELEN); \
293168404Spjd	} \
294168404Spjd_NOTE(CONSTCOND) } while (0)
295168404Spjd#else
296168404Spjd#define	dprintf_ds(dd, fmt, ...)
297168404Spjd#endif
298168404Spjd
299168404Spjd#ifdef	__cplusplus
300168404Spjd}
301168404Spjd#endif
302168404Spjd
303168404Spjd#endif /* _SYS_DSL_DATASET_H */
304