]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / cddl / contrib / opensolaris / lib / libzfs / common / libzfs.h
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 http://www.opensolaris.org/os/licensing.
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 /*
23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26
27 #ifndef _LIBZFS_H
28 #define _LIBZFS_H
29
30 #pragma ident   "%Z%%M% %I%     %E% SMI"
31
32 #include <assert.h>
33 #include <libnvpair.h>
34 #include <sys/param.h>
35 #include <sys/types.h>
36 #include <sys/varargs.h>
37 #include <sys/fs/zfs.h>
38 #include <sys/zfs_ioctl.h>
39
40 #ifdef  __cplusplus
41 extern "C" {
42 #endif
43
44 /*
45  * Miscellaneous ZFS constants
46  */
47 #define ZFS_MAXNAMELEN          MAXNAMELEN
48 #define ZPOOL_MAXNAMELEN        MAXNAMELEN
49 #define ZFS_MAXPROPLEN          MAXPATHLEN
50
51 /*
52  * libzfs errors
53  */
54 enum {
55         EZFS_NOMEM = 2000,      /* out of memory */
56         EZFS_BADPROP,           /* invalid property value */
57         EZFS_PROPREADONLY,      /* cannot set readonly property */
58         EZFS_PROPTYPE,          /* property does not apply to dataset type */
59         EZFS_PROPNONINHERIT,    /* property is not inheritable */
60         EZFS_PROPSPACE,         /* bad quota or reservation */
61         EZFS_BADTYPE,           /* dataset is not of appropriate type */
62         EZFS_BUSY,              /* pool or dataset is busy */
63         EZFS_EXISTS,            /* pool or dataset already exists */
64         EZFS_NOENT,             /* no such pool or dataset */
65         EZFS_BADSTREAM,         /* bad backup stream */
66         EZFS_DSREADONLY,        /* dataset is readonly */
67         EZFS_VOLTOOBIG,         /* volume is too large for 32-bit system */
68         EZFS_VOLHASDATA,        /* volume already contains data */
69         EZFS_INVALIDNAME,       /* invalid dataset name */
70         EZFS_BADRESTORE,        /* unable to restore to destination */
71         EZFS_BADBACKUP,         /* backup failed */
72         EZFS_BADTARGET,         /* bad attach/detach/replace target */
73         EZFS_NODEVICE,          /* no such device in pool */
74         EZFS_BADDEV,            /* invalid device to add */
75         EZFS_NOREPLICAS,        /* no valid replicas */
76         EZFS_RESILVERING,       /* currently resilvering */
77         EZFS_BADVERSION,        /* unsupported version */
78         EZFS_POOLUNAVAIL,       /* pool is currently unavailable */
79         EZFS_DEVOVERFLOW,       /* too many devices in one vdev */
80         EZFS_BADPATH,           /* must be an absolute path */
81         EZFS_CROSSTARGET,       /* rename or clone across pool or dataset */
82         EZFS_ZONED,             /* used improperly in local zone */
83         EZFS_MOUNTFAILED,       /* failed to mount dataset */
84         EZFS_UMOUNTFAILED,      /* failed to unmount dataset */
85         EZFS_UNSHARENFSFAILED,  /* unshare(1M) failed */
86         EZFS_SHARENFSFAILED,    /* share(1M) failed */
87         EZFS_DEVLINKS,          /* failed to create zvol links */
88         EZFS_PERM,              /* permission denied */
89         EZFS_NOSPC,             /* out of space */
90         EZFS_IO,                /* I/O error */
91         EZFS_INTR,              /* signal received */
92         EZFS_ISSPARE,           /* device is a hot spare */
93         EZFS_INVALCONFIG,       /* invalid vdev configuration */
94         EZFS_RECURSIVE,         /* recursive dependency */
95         EZFS_NOHISTORY,         /* no history object */
96         EZFS_UNSHAREISCSIFAILED, /* iscsitgtd failed request to unshare */
97         EZFS_SHAREISCSIFAILED,  /* iscsitgtd failed request to share */
98         EZFS_POOLPROPS,         /* couldn't retrieve pool props */
99         EZFS_POOL_NOTSUP,       /* ops not supported for this type of pool */
100         EZFS_POOL_INVALARG,     /* invalid argument for this pool operation */
101         EZFS_NAMETOOLONG,       /* dataset name is too long */
102         EZFS_UNKNOWN
103 };
104
105 /*
106  * Basic handle types
107  */
108 typedef struct zfs_handle zfs_handle_t;
109 typedef struct zpool_handle zpool_handle_t;
110 typedef struct libzfs_handle libzfs_handle_t;
111
112 /*
113  * Library initialization
114  */
115 extern libzfs_handle_t *libzfs_init(void);
116 extern void libzfs_fini(libzfs_handle_t *);
117
118 extern libzfs_handle_t *zpool_get_handle(zpool_handle_t *);
119 extern libzfs_handle_t *zfs_get_handle(zfs_handle_t *);
120
121 extern void libzfs_print_on_error(libzfs_handle_t *, boolean_t);
122
123 extern int libzfs_errno(libzfs_handle_t *);
124 extern const char *libzfs_error_action(libzfs_handle_t *);
125 extern const char *libzfs_error_description(libzfs_handle_t *);
126
127 /*
128  * Basic handle functions
129  */
130 extern zpool_handle_t *zpool_open(libzfs_handle_t *, const char *);
131 extern zpool_handle_t *zpool_open_canfail(libzfs_handle_t *, const char *);
132 extern void zpool_close(zpool_handle_t *);
133 extern const char *zpool_get_name(zpool_handle_t *);
134 extern uint64_t zpool_get_guid(zpool_handle_t *);
135 extern uint64_t zpool_get_space_used(zpool_handle_t *);
136 extern uint64_t zpool_get_space_total(zpool_handle_t *);
137 extern int zpool_get_root(zpool_handle_t *, char *, size_t);
138 extern int zpool_get_state(zpool_handle_t *);
139 extern uint64_t zpool_get_version(zpool_handle_t *);
140
141 /*
142  * Iterate over all active pools in the system.
143  */
144 typedef int (*zpool_iter_f)(zpool_handle_t *, void *);
145 extern int zpool_iter(libzfs_handle_t *, zpool_iter_f, void *);
146
147 /*
148  * Functions to create and destroy pools
149  */
150 extern int zpool_create(libzfs_handle_t *, const char *, nvlist_t *,
151     const char *);
152 extern int zpool_destroy(zpool_handle_t *);
153 extern int zpool_add(zpool_handle_t *, nvlist_t *);
154
155 /*
156  * Functions to manipulate pool and vdev state
157  */
158 extern int zpool_scrub(zpool_handle_t *, pool_scrub_type_t);
159
160 extern int zpool_vdev_online(zpool_handle_t *, const char *);
161 extern int zpool_vdev_offline(zpool_handle_t *, const char *, int);
162 extern int zpool_vdev_attach(zpool_handle_t *, const char *, const char *,
163     nvlist_t *, int);
164 extern int zpool_vdev_detach(zpool_handle_t *, const char *);
165 extern int zpool_vdev_remove(zpool_handle_t *, const char *);
166 extern int zpool_clear(zpool_handle_t *, const char *);
167 extern nvlist_t *zpool_find_vdev(zpool_handle_t *, const char *, boolean_t *);
168
169 /*
170  * Functions to manage pool properties
171  */
172 extern int zpool_set_prop(zpool_handle_t *, const char *, const char *);
173 extern int zpool_get_prop(zpool_handle_t *, zfs_prop_t, char *,
174         size_t proplen, zfs_source_t *);
175 extern const char *zpool_prop_to_name(zpool_prop_t);
176 extern const char *zpool_prop_values(zpool_prop_t);
177
178 /*
179  * Pool health statistics.
180  */
181 typedef enum {
182         /*
183          * The following correspond to faults as defined in the (fault.fs.zfs.*)
184          * event namespace.  Each is associated with a corresponding message ID.
185          */
186         ZPOOL_STATUS_CORRUPT_CACHE,     /* corrupt /kernel/drv/zpool.cache */
187         ZPOOL_STATUS_MISSING_DEV_R,     /* missing device with replicas */
188         ZPOOL_STATUS_MISSING_DEV_NR,    /* missing device with no replicas */
189         ZPOOL_STATUS_CORRUPT_LABEL_R,   /* bad device label with replicas */
190         ZPOOL_STATUS_CORRUPT_LABEL_NR,  /* bad device label with no replicas */
191         ZPOOL_STATUS_BAD_GUID_SUM,      /* sum of device guids didn't match */
192         ZPOOL_STATUS_CORRUPT_POOL,      /* pool metadata is corrupted */
193         ZPOOL_STATUS_CORRUPT_DATA,      /* data errors in user (meta)data */
194         ZPOOL_STATUS_FAILING_DEV,       /* device experiencing errors */
195         ZPOOL_STATUS_VERSION_NEWER,     /* newer on-disk version */
196         ZPOOL_STATUS_HOSTID_MISMATCH,   /* last accessed by another system */
197
198         /*
199          * The following are not faults per se, but still an error possibly
200          * requiring administrative attention.  There is no corresponding
201          * message ID.
202          */
203         ZPOOL_STATUS_VERSION_OLDER,     /* older on-disk version */
204         ZPOOL_STATUS_RESILVERING,       /* device being resilvered */
205         ZPOOL_STATUS_OFFLINE_DEV,       /* device online */
206
207         /*
208          * Finally, the following indicates a healthy pool.
209          */
210         ZPOOL_STATUS_OK
211 } zpool_status_t;
212
213 extern zpool_status_t zpool_get_status(zpool_handle_t *, char **);
214 extern zpool_status_t zpool_import_status(nvlist_t *, char **);
215
216 /*
217  * Statistics and configuration functions.
218  */
219 extern nvlist_t *zpool_get_config(zpool_handle_t *, nvlist_t **);
220 extern int zpool_refresh_stats(zpool_handle_t *, boolean_t *);
221 extern int zpool_get_errlog(zpool_handle_t *, nvlist_t **);
222
223 /*
224  * Import and export functions
225  */
226 extern int zpool_export(zpool_handle_t *);
227 extern int zpool_import(libzfs_handle_t *, nvlist_t *, const char *,
228     const char *);
229
230 /*
231  * Search for pools to import
232  */
233 extern nvlist_t *zpool_find_import(libzfs_handle_t *, int, char **);
234
235 /*
236  * Miscellaneous pool functions
237  */
238 extern char *zpool_vdev_name(libzfs_handle_t *, zpool_handle_t *, nvlist_t *);
239 extern int zpool_upgrade(zpool_handle_t *);
240 extern int zpool_get_history(zpool_handle_t *, nvlist_t **);
241 extern void zpool_log_history(libzfs_handle_t *, int, char **, const char *,
242     boolean_t, boolean_t);
243 extern void zpool_obj_to_path(zpool_handle_t *, uint64_t, uint64_t, char *,
244     size_t len);
245
246 /*
247  * Basic handle manipulations.  These functions do not create or destroy the
248  * underlying datasets, only the references to them.
249  */
250 extern zfs_handle_t *zfs_open(libzfs_handle_t *, const char *, int);
251 extern void zfs_close(zfs_handle_t *);
252 extern zfs_type_t zfs_get_type(const zfs_handle_t *);
253 extern const char *zfs_get_name(const zfs_handle_t *);
254
255 /*
256  * Property management functions.  Some functions are shared with the kernel,
257  * and are found in sys/fs/zfs.h.
258  */
259 extern const char *zfs_prop_to_name(zfs_prop_t);
260 extern int zfs_prop_set(zfs_handle_t *, const char *, const char *);
261 extern int zfs_prop_get(zfs_handle_t *, zfs_prop_t, char *, size_t,
262     zfs_source_t *, char *, size_t, boolean_t);
263 extern int zfs_prop_get_numeric(zfs_handle_t *, zfs_prop_t, uint64_t *,
264     zfs_source_t *, char *, size_t);
265 extern uint64_t zfs_prop_get_int(zfs_handle_t *, zfs_prop_t);
266 extern const char *zfs_prop_get_string(zfs_handle_t *, zfs_prop_t);
267 extern int zfs_prop_inherit(zfs_handle_t *, const char *);
268 extern const char *zfs_prop_values(zfs_prop_t);
269 extern int zfs_prop_valid_for_type(zfs_prop_t, int);
270 extern const char *zfs_prop_default_string(zfs_prop_t prop);
271 extern uint64_t zfs_prop_default_numeric(zfs_prop_t);
272 extern int zfs_prop_is_string(zfs_prop_t prop);
273 extern const char *zfs_prop_column_name(zfs_prop_t);
274 extern boolean_t zfs_prop_align_right(zfs_prop_t);
275 extern void nicebool(int value, char *buf, size_t buflen);
276
277 typedef struct zfs_proplist {
278         zfs_prop_t      pl_prop;
279         char            *pl_user_prop;
280         struct zfs_proplist *pl_next;
281         boolean_t       pl_all;
282         size_t          pl_width;
283         boolean_t       pl_fixed;
284 } zfs_proplist_t;
285
286 typedef zfs_proplist_t zpool_proplist_t;
287
288 extern int zfs_get_proplist(libzfs_handle_t *, char *, zfs_proplist_t **);
289 extern int zpool_get_proplist(libzfs_handle_t *, char *, zpool_proplist_t **);
290 extern int zfs_expand_proplist(zfs_handle_t *, zfs_proplist_t **);
291 extern int zpool_expand_proplist(zpool_handle_t *, zpool_proplist_t **);
292 extern void zfs_free_proplist(zfs_proplist_t *);
293 extern nvlist_t *zfs_get_user_props(zfs_handle_t *);
294
295 #define ZFS_MOUNTPOINT_NONE     "none"
296 #define ZFS_MOUNTPOINT_LEGACY   "legacy"
297
298 /*
299  * Functions for printing properties from zfs/zpool
300  */
301 typedef struct libzfs_get_cbdata {
302         int cb_sources;
303         int cb_columns[4];
304         int cb_colwidths[5];
305         boolean_t cb_scripted;
306         boolean_t cb_literal;
307         boolean_t cb_first;
308         zfs_proplist_t *cb_proplist;
309 } libzfs_get_cbdata_t;
310
311 void libzfs_print_one_property(const char *, libzfs_get_cbdata_t *,
312     const char *, const char *, zfs_source_t, const char *);
313
314 #define GET_COL_NAME            1
315 #define GET_COL_PROPERTY        2
316 #define GET_COL_VALUE           3
317 #define GET_COL_SOURCE          4
318
319 /*
320  * Iterator functions.
321  */
322 typedef int (*zfs_iter_f)(zfs_handle_t *, void *);
323 extern int zfs_iter_root(libzfs_handle_t *, zfs_iter_f, void *);
324 extern int zfs_iter_children(zfs_handle_t *, zfs_iter_f, void *);
325 extern int zfs_iter_dependents(zfs_handle_t *, boolean_t, zfs_iter_f, void *);
326 extern int zfs_iter_filesystems(zfs_handle_t *, zfs_iter_f, void *);
327 extern int zfs_iter_snapshots(zfs_handle_t *, zfs_iter_f, void *);
328
329 /*
330  * Functions to create and destroy datasets.
331  */
332 extern int zfs_create(libzfs_handle_t *, const char *, zfs_type_t,
333     nvlist_t *);
334 extern int zfs_destroy(zfs_handle_t *);
335 extern int zfs_destroy_snaps(zfs_handle_t *, char *);
336 extern int zfs_clone(zfs_handle_t *, const char *, nvlist_t *);
337 extern int zfs_snapshot(libzfs_handle_t *, const char *, boolean_t);
338 extern int zfs_rollback(zfs_handle_t *, zfs_handle_t *, int);
339 extern int zfs_rename(zfs_handle_t *, const char *, int);
340 extern int zfs_send(zfs_handle_t *, const char *, int);
341 extern int zfs_receive(libzfs_handle_t *, const char *, int, int, int,
342     boolean_t, int);
343 extern int zfs_promote(zfs_handle_t *);
344
345 /*
346  * Miscellaneous functions.
347  */
348 extern const char *zfs_type_to_name(zfs_type_t);
349 extern void zfs_refresh_properties(zfs_handle_t *);
350 extern int zfs_name_valid(const char *, zfs_type_t);
351 extern int zfs_disable(zfs_handle_t *);
352 extern int zfs_enable(zfs_handle_t *);
353 extern zfs_handle_t *zfs_path_to_zhandle(libzfs_handle_t *, char *, zfs_type_t);
354
355 /*
356  * Mount support functions.
357  */
358 extern boolean_t is_mounted(libzfs_handle_t *, const char *special, char **);
359 extern boolean_t zfs_is_mounted(zfs_handle_t *, char **);
360 extern int zfs_mount(zfs_handle_t *, const char *, int);
361 extern int zfs_unmount(zfs_handle_t *, const char *, int);
362 extern int zfs_unmountall(zfs_handle_t *, int);
363
364 /*
365  * Share support functions.
366  */
367 extern boolean_t zfs_is_shared(zfs_handle_t *);
368 extern int zfs_share(zfs_handle_t *);
369 extern int zfs_unshare(zfs_handle_t *);
370
371 /*
372  * Protocol-specifc share support functions.
373  */
374 extern boolean_t zfs_is_shared_nfs(zfs_handle_t *, char **);
375 extern int zfs_share_nfs(zfs_handle_t *);
376 extern int zfs_unshare_nfs(zfs_handle_t *, const char *);
377 extern int zfs_unshareall_nfs(zfs_handle_t *);
378 extern boolean_t zfs_is_shared_iscsi(zfs_handle_t *);
379 extern int zfs_share_iscsi(zfs_handle_t *);
380 extern int zfs_unshare_iscsi(zfs_handle_t *);
381
382 /*
383  * FreeBSD-specific jail support function.
384  */
385 extern int zfs_jail(zfs_handle_t *, int, int);
386
387 /*
388  * When dealing with nvlists, verify() is extremely useful
389  */
390 #ifndef verify
391 #ifdef NDEBUG
392 #define verify(EX)      ((void)(EX))
393 #else
394 #define verify(EX)      assert(EX)
395 #endif
396 #endif
397
398 /*
399  * Utility function to convert a number to a human-readable form.
400  */
401 extern void zfs_nicenum(uint64_t, char *, size_t);
402 extern int zfs_nicestrtonum(libzfs_handle_t *, const char *, uint64_t *);
403
404 /*
405  * Pool destroy special.  Remove the device information without destroying
406  * the underlying dataset.
407  */
408 extern int zfs_remove_link(zfs_handle_t *);
409
410 /*
411  * Given a device or file, determine if it is part of a pool.
412  */
413 extern int zpool_in_use(libzfs_handle_t *, int, pool_state_t *, char **,
414     boolean_t *);
415
416 /*
417  * ftyp special.  Read the label from a given device.
418  */
419 extern int zpool_read_label(int, nvlist_t **);
420
421 /*
422  * Create and remove zvol /dev links.
423  */
424 extern int zpool_create_zvol_links(zpool_handle_t *);
425 extern int zpool_remove_zvol_links(zpool_handle_t *);
426
427 /*
428  * Enable and disable datasets within a pool by mounting/unmounting and
429  * sharing/unsharing them.
430  */
431 extern int zpool_enable_datasets(zpool_handle_t *, const char *, int);
432 extern int zpool_disable_datasets(zpool_handle_t *, boolean_t);
433
434 #ifdef  __FreeBSD__
435 extern int zmount(const char *, const char *, int, char *, char *, int, char *,
436     int);
437 #endif
438
439 #ifdef  __cplusplus
440 }
441 #endif
442
443 #endif  /* _LIBZFS_H */