| 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 (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
| 24 | * Copyright (c) 2011 Pawel Jakub Dawidek. All rights reserved. |
| 25 | * Copyright (c) 2011, 2015 by Delphix. All rights reserved. |
| 26 | * Copyright (c) 2012, Joyent, Inc. All rights reserved. |
| 27 | * Copyright (c) 2012 Martin Matuska <mm@FreeBSD.org>. All rights reserved. |
| 28 | * Copyright (c) 2013 Steven Hartland. All rights reserved. |
| 29 | * Copyright (c) 2014 Integros [integros.com] |
| 30 | * Copyright 2016 Nexenta Systems, Inc. |
| 31 | */ |
| 32 | |
| 33 | #ifndef _LIBZFS_H |
| 34 | #define _LIBZFS_H |
| 35 | |
| 36 | #include <assert.h> |
| 37 | #include <libnvpair.h> |
| 38 | #include <sys/mnttab.h> |
| 39 | #include <sys/param.h> |
| 40 | #include <sys/types.h> |
| 41 | #include <sys/varargs.h> |
| 42 | #include <sys/fs/zfs.h> |
| 43 | #include <sys/avl.h> |
| 44 | #include <sys/zfs_ioctl.h> |
| 45 | #include <libzfs_core.h> |
| 46 | |
| 47 | #ifdef __cplusplus |
| 48 | extern "C" { |
| 49 | #endif |
| 50 | |
| 51 | /* |
| 52 | * Miscellaneous ZFS constants |
| 53 | */ |
| 54 | #define ZFS_MAXPROPLEN MAXPATHLEN |
| 55 | #define ZPOOL_MAXPROPLEN MAXPATHLEN |
| 56 | |
| 57 | /* |
| 58 | * libzfs errors |
| 59 | */ |
| 60 | typedef enum zfs_error { |
| 61 | EZFS_SUCCESS = 0, /* no error -- success */ |
| 62 | EZFS_NOMEM = 2000, /* out of memory */ |
| 63 | EZFS_BADPROP, /* invalid property value */ |
| 64 | EZFS_PROPREADONLY, /* cannot set readonly property */ |
| 65 | EZFS_PROPTYPE, /* property does not apply to dataset type */ |
| 66 | EZFS_PROPNONINHERIT, /* property is not inheritable */ |
| 67 | EZFS_PROPSPACE, /* bad quota or reservation */ |
| 68 | EZFS_BADTYPE, /* dataset is not of appropriate type */ |
| 69 | EZFS_BUSY, /* pool or dataset is busy */ |
| 70 | EZFS_EXISTS, /* pool or dataset already exists */ |
| 71 | EZFS_NOENT, /* no such pool or dataset */ |
| 72 | EZFS_BADSTREAM, /* bad backup stream */ |
| 73 | EZFS_DSREADONLY, /* dataset is readonly */ |
| 74 | EZFS_VOLTOOBIG, /* volume is too large for 32-bit system */ |
| 75 | EZFS_INVALIDNAME, /* invalid dataset name */ |
| 76 | EZFS_BADRESTORE, /* unable to restore to destination */ |
| 77 | EZFS_BADBACKUP, /* backup failed */ |
| 78 | EZFS_BADTARGET, /* bad attach/detach/replace target */ |
| 79 | EZFS_NODEVICE, /* no such device in pool */ |
| 80 | EZFS_BADDEV, /* invalid device to add */ |
| 81 | EZFS_NOREPLICAS, /* no valid replicas */ |
| 82 | EZFS_RESILVERING, /* currently resilvering */ |
| 83 | EZFS_BADVERSION, /* unsupported version */ |
| 84 | EZFS_POOLUNAVAIL, /* pool is currently unavailable */ |
| 85 | EZFS_DEVOVERFLOW, /* too many devices in one vdev */ |
| 86 | EZFS_BADPATH, /* must be an absolute path */ |
| 87 | EZFS_CROSSTARGET, /* rename or clone across pool or dataset */ |
| 88 | EZFS_ZONED, /* used improperly in local zone */ |
| 89 | EZFS_MOUNTFAILED, /* failed to mount dataset */ |
| 90 | EZFS_UMOUNTFAILED, /* failed to unmount dataset */ |
| 91 | EZFS_UNSHARENFSFAILED, /* unshare(1M) failed */ |
| 92 | EZFS_SHARENFSFAILED, /* share(1M) failed */ |
| 93 | EZFS_PERM, /* permission denied */ |
| 94 | EZFS_NOSPC, /* out of space */ |
| 95 | EZFS_FAULT, /* bad address */ |
| 96 | EZFS_IO, /* I/O error */ |
| 97 | EZFS_INTR, /* signal received */ |
| 98 | EZFS_ISSPARE, /* device is a hot spare */ |
| 99 | EZFS_INVALCONFIG, /* invalid vdev configuration */ |
| 100 | EZFS_RECURSIVE, /* recursive dependency */ |
| 101 | EZFS_NOHISTORY, /* no history object */ |
| 102 | EZFS_POOLPROPS, /* couldn't retrieve pool props */ |
| 103 | EZFS_POOL_NOTSUP, /* ops not supported for this type of pool */ |
| 104 | EZFS_POOL_INVALARG, /* invalid argument for this pool operation */ |
| 105 | EZFS_NAMETOOLONG, /* dataset name is too long */ |
| 106 | EZFS_OPENFAILED, /* open of device failed */ |
| 107 | EZFS_NOCAP, /* couldn't get capacity */ |
| 108 | EZFS_LABELFAILED, /* write of label failed */ |
| 109 | EZFS_BADWHO, /* invalid permission who */ |
| 110 | EZFS_BADPERM, /* invalid permission */ |
| 111 | EZFS_BADPERMSET, /* invalid permission set name */ |
| 112 | EZFS_NODELEGATION, /* delegated administration is disabled */ |
| 113 | EZFS_UNSHARESMBFAILED, /* failed to unshare over smb */ |
| 114 | EZFS_SHARESMBFAILED, /* failed to share over smb */ |
| 115 | EZFS_BADCACHE, /* bad cache file */ |
| 116 | EZFS_ISL2CACHE, /* device is for the level 2 ARC */ |
| 117 | EZFS_VDEVNOTSUP, /* unsupported vdev type */ |
| 118 | EZFS_NOTSUP, /* ops not supported on this dataset */ |
| 119 | EZFS_ACTIVE_SPARE, /* pool has active shared spare devices */ |
| 120 | EZFS_UNPLAYED_LOGS, /* log device has unplayed logs */ |
| 121 | EZFS_REFTAG_RELE, /* snapshot release: tag not found */ |
| 122 | EZFS_REFTAG_HOLD, /* snapshot hold: tag already exists */ |
| 123 | EZFS_TAGTOOLONG, /* snapshot hold/rele: tag too long */ |
| 124 | EZFS_PIPEFAILED, /* pipe create failed */ |
| 125 | EZFS_THREADCREATEFAILED, /* thread create failed */ |
| 126 | EZFS_POSTSPLIT_ONLINE, /* onlining a disk after splitting it */ |
| 127 | EZFS_SCRUBBING, /* currently scrubbing */ |
| 128 | EZFS_NO_SCRUB, /* no active scrub */ |
| 129 | EZFS_DIFF, /* general failure of zfs diff */ |
| 130 | EZFS_DIFFDATA, /* bad zfs diff data */ |
| 131 | EZFS_POOLREADONLY, /* pool is in read-only mode */ |
| 132 | EZFS_UNKNOWN |
| 133 | } zfs_error_t; |
| 134 | |
| 135 | /* |
| 136 | * The following data structures are all part |
| 137 | * of the zfs_allow_t data structure which is |
| 138 | * used for printing 'allow' permissions. |
| 139 | * It is a linked list of zfs_allow_t's which |
| 140 | * then contain avl tree's for user/group/sets/... |
| 141 | * and each one of the entries in those trees have |
| 142 | * avl tree's for the permissions they belong to and |
| 143 | * whether they are local,descendent or local+descendent |
| 144 | * permissions. The AVL trees are used primarily for |
| 145 | * sorting purposes, but also so that we can quickly find |
| 146 | * a given user and or permission. |
| 147 | */ |
| 148 | typedef struct zfs_perm_node { |
| 149 | avl_node_t z_node; |
| 150 | char z_pname[MAXPATHLEN]; |
| 151 | } zfs_perm_node_t; |
| 152 | |
| 153 | typedef struct zfs_allow_node { |
| 154 | avl_node_t z_node; |
| 155 | char z_key[MAXPATHLEN]; /* name, such as joe */ |
| 156 | avl_tree_t z_localdescend; /* local+descendent perms */ |
| 157 | avl_tree_t z_local; /* local permissions */ |
| 158 | avl_tree_t z_descend; /* descendent permissions */ |
| 159 | } zfs_allow_node_t; |
| 160 | |
| 161 | typedef struct zfs_allow { |
| 162 | struct zfs_allow *z_next; |
| 163 | char z_setpoint[MAXPATHLEN]; |
| 164 | avl_tree_t z_sets; |
| 165 | avl_tree_t z_crperms; |
| 166 | avl_tree_t z_user; |
| 167 | avl_tree_t z_group; |
| 168 | avl_tree_t z_everyone; |
| 169 | } zfs_allow_t; |
| 170 | |
| 171 | /* |
| 172 | * Basic handle types |
| 173 | */ |
| 174 | typedef struct zfs_handle zfs_handle_t; |
| 175 | typedef struct zpool_handle zpool_handle_t; |
| 176 | typedef struct libzfs_handle libzfs_handle_t; |
| 177 | |
| 178 | /* |
| 179 | * Library initialization |
| 180 | */ |
| 181 | extern libzfs_handle_t *libzfs_init(void); |
| 182 | extern void libzfs_fini(libzfs_handle_t *); |
| 183 | |
| 184 | extern libzfs_handle_t *zpool_get_handle(zpool_handle_t *); |
| 185 | extern libzfs_handle_t *zfs_get_handle(zfs_handle_t *); |
| 186 | |
| 187 | extern void libzfs_print_on_error(libzfs_handle_t *, boolean_t); |
| 188 | |
| 189 | extern void zfs_save_arguments(int argc, char **, char *, int); |
| 190 | extern int zpool_log_history(libzfs_handle_t *, const char *); |
| 191 | |
| 192 | extern int libzfs_errno(libzfs_handle_t *); |
| 193 | extern const char *libzfs_error_action(libzfs_handle_t *); |
| 194 | extern const char *libzfs_error_description(libzfs_handle_t *); |
| 195 | extern int zfs_standard_error(libzfs_handle_t *, int, const char *); |
| 196 | extern void libzfs_mnttab_init(libzfs_handle_t *); |
| 197 | extern void libzfs_mnttab_fini(libzfs_handle_t *); |
| 198 | extern void libzfs_mnttab_cache(libzfs_handle_t *, boolean_t); |
| 199 | extern int libzfs_mnttab_find(libzfs_handle_t *, const char *, |
| 200 | struct mnttab *); |
| 201 | extern void libzfs_mnttab_add(libzfs_handle_t *, const char *, |
| 202 | const char *, const char *); |
| 203 | extern void libzfs_mnttab_remove(libzfs_handle_t *, const char *); |
| 204 | |
| 205 | /* |
| 206 | * Basic handle functions |
| 207 | */ |
| 208 | extern zpool_handle_t *zpool_open(libzfs_handle_t *, const char *); |
| 209 | extern zpool_handle_t *zpool_open_canfail(libzfs_handle_t *, const char *); |
| 210 | extern void zpool_close(zpool_handle_t *); |
| 211 | extern const char *zpool_get_name(zpool_handle_t *); |
| 212 | extern int zpool_get_state(zpool_handle_t *); |
| 213 | extern const char *zpool_state_to_name(vdev_state_t, vdev_aux_t); |
| 214 | extern const char *zpool_pool_state_to_name(pool_state_t); |
| 215 | extern void zpool_free_handles(libzfs_handle_t *); |
| 216 | extern int zpool_nextboot(libzfs_handle_t *, uint64_t, uint64_t, const char *); |
| 217 | |
| 218 | /* |
| 219 | * Iterate over all active pools in the system. |
| 220 | */ |
| 221 | typedef int (*zpool_iter_f)(zpool_handle_t *, void *); |
| 222 | extern int zpool_iter(libzfs_handle_t *, zpool_iter_f, void *); |
| 223 | extern boolean_t zpool_skip_pool(const char *); |
| 224 | |
| 225 | /* |
| 226 | * Functions to create and destroy pools |
| 227 | */ |
| 228 | extern int zpool_create(libzfs_handle_t *, const char *, nvlist_t *, |
| 229 | nvlist_t *, nvlist_t *); |
| 230 | extern int zpool_destroy(zpool_handle_t *, const char *); |
| 231 | extern int zpool_add(zpool_handle_t *, nvlist_t *); |
| 232 | |
| 233 | typedef struct splitflags { |
| 234 | /* do not split, but return the config that would be split off */ |
| 235 | int dryrun : 1; |
| 236 | |
| 237 | /* after splitting, import the pool */ |
| 238 | int import : 1; |
| 239 | } splitflags_t; |
| 240 | |
| 241 | /* |
| 242 | * Functions to manipulate pool and vdev state |
| 243 | */ |
| 244 | extern int zpool_scan(zpool_handle_t *, pool_scan_func_t); |
| 245 | extern int zpool_clear(zpool_handle_t *, const char *, nvlist_t *); |
| 246 | extern int zpool_reguid(zpool_handle_t *); |
| 247 | extern int zpool_reopen(zpool_handle_t *); |
| 248 | |
| 249 | extern int zpool_vdev_online(zpool_handle_t *, const char *, int, |
| 250 | vdev_state_t *); |
| 251 | extern int zpool_vdev_offline(zpool_handle_t *, const char *, boolean_t); |
| 252 | extern int zpool_vdev_attach(zpool_handle_t *, const char *, |
| 253 | const char *, nvlist_t *, int); |
| 254 | extern int zpool_vdev_detach(zpool_handle_t *, const char *); |
| 255 | extern int zpool_vdev_remove(zpool_handle_t *, const char *); |
| 256 | extern int zpool_vdev_split(zpool_handle_t *, char *, nvlist_t **, nvlist_t *, |
| 257 | splitflags_t); |
| 258 | |
| 259 | extern int zpool_vdev_fault(zpool_handle_t *, uint64_t, vdev_aux_t); |
| 260 | extern int zpool_vdev_degrade(zpool_handle_t *, uint64_t, vdev_aux_t); |
| 261 | extern int zpool_vdev_clear(zpool_handle_t *, uint64_t); |
| 262 | |
| 263 | extern nvlist_t *zpool_find_vdev(zpool_handle_t *, const char *, boolean_t *, |
| 264 | boolean_t *, boolean_t *); |
| 265 | extern nvlist_t *zpool_find_vdev_by_physpath(zpool_handle_t *, const char *, |
| 266 | boolean_t *, boolean_t *, boolean_t *); |
| 267 | extern int zpool_label_disk(libzfs_handle_t *, zpool_handle_t *, const char *); |
| 268 | |
| 269 | /* |
| 270 | * Functions to manage pool properties |
| 271 | */ |
| 272 | extern int zpool_set_prop(zpool_handle_t *, const char *, const char *); |
| 273 | extern int zpool_get_prop(zpool_handle_t *, zpool_prop_t, char *, |
| 274 | size_t proplen, zprop_source_t *, boolean_t); |
| 275 | extern uint64_t zpool_get_prop_int(zpool_handle_t *, zpool_prop_t, |
| 276 | zprop_source_t *); |
| 277 | |
| 278 | extern const char *zpool_prop_to_name(zpool_prop_t); |
| 279 | extern const char *zpool_prop_values(zpool_prop_t); |
| 280 | |
| 281 | /* |
| 282 | * Pool health statistics. |
| 283 | */ |
| 284 | typedef enum { |
| 285 | /* |
| 286 | * The following correspond to faults as defined in the (fault.fs.zfs.*) |
| 287 | * event namespace. Each is associated with a corresponding message ID. |
| 288 | */ |
| 289 | ZPOOL_STATUS_CORRUPT_CACHE, /* corrupt /kernel/drv/zpool.cache */ |
| 290 | ZPOOL_STATUS_MISSING_DEV_R, /* missing device with replicas */ |
| 291 | ZPOOL_STATUS_MISSING_DEV_NR, /* missing device with no replicas */ |
| 292 | ZPOOL_STATUS_CORRUPT_LABEL_R, /* bad device label with replicas */ |
| 293 | ZPOOL_STATUS_CORRUPT_LABEL_NR, /* bad device label with no replicas */ |
| 294 | ZPOOL_STATUS_BAD_GUID_SUM, /* sum of device guids didn't match */ |
| 295 | ZPOOL_STATUS_CORRUPT_POOL, /* pool metadata is corrupted */ |
| 296 | ZPOOL_STATUS_CORRUPT_DATA, /* data errors in user (meta)data */ |
| 297 | ZPOOL_STATUS_FAILING_DEV, /* device experiencing errors */ |
| 298 | ZPOOL_STATUS_VERSION_NEWER, /* newer on-disk version */ |
| 299 | ZPOOL_STATUS_HOSTID_MISMATCH, /* last accessed by another system */ |
| 300 | ZPOOL_STATUS_IO_FAILURE_WAIT, /* failed I/O, failmode 'wait' */ |
| 301 | ZPOOL_STATUS_IO_FAILURE_CONTINUE, /* failed I/O, failmode 'continue' */ |
| 302 | ZPOOL_STATUS_BAD_LOG, /* cannot read log chain(s) */ |
| 303 | |
| 304 | /* |
| 305 | * If the pool has unsupported features but can still be opened in |
| 306 | * read-only mode, its status is ZPOOL_STATUS_UNSUP_FEAT_WRITE. If the |
| 307 | * pool has unsupported features but cannot be opened at all, its |
| 308 | * status is ZPOOL_STATUS_UNSUP_FEAT_READ. |
| 309 | */ |
| 310 | ZPOOL_STATUS_UNSUP_FEAT_READ, /* unsupported features for read */ |
| 311 | ZPOOL_STATUS_UNSUP_FEAT_WRITE, /* unsupported features for write */ |
| 312 | |
| 313 | /* |
| 314 | * These faults have no corresponding message ID. At the time we are |
| 315 | * checking the status, the original reason for the FMA fault (I/O or |
| 316 | * checksum errors) has been lost. |
| 317 | */ |
| 318 | ZPOOL_STATUS_FAULTED_DEV_R, /* faulted device with replicas */ |
| 319 | ZPOOL_STATUS_FAULTED_DEV_NR, /* faulted device with no replicas */ |
| 320 | |
| 321 | /* |
| 322 | * The following are not faults per se, but still an error possibly |
| 323 | * requiring administrative attention. There is no corresponding |
| 324 | * message ID. |
| 325 | */ |
| 326 | ZPOOL_STATUS_VERSION_OLDER, /* older legacy on-disk version */ |
| 327 | ZPOOL_STATUS_FEAT_DISABLED, /* supported features are disabled */ |
| 328 | ZPOOL_STATUS_RESILVERING, /* device being resilvered */ |
| 329 | ZPOOL_STATUS_OFFLINE_DEV, /* device offline */ |
| 330 | ZPOOL_STATUS_REMOVED_DEV, /* removed device */ |
| 331 | ZPOOL_STATUS_NON_NATIVE_ASHIFT, /* (e.g. 512e dev with ashift of 9) */ |
| 332 | |
| 333 | /* |
| 334 | * Finally, the following indicates a healthy pool. |
| 335 | */ |
| 336 | ZPOOL_STATUS_OK |
| 337 | } zpool_status_t; |
| 338 | |
| 339 | extern zpool_status_t zpool_get_status(zpool_handle_t *, char **); |
| 340 | extern zpool_status_t zpool_import_status(nvlist_t *, char **); |
| 341 | extern void zpool_dump_ddt(const ddt_stat_t *dds, const ddt_histogram_t *ddh); |
| 342 | |
| 343 | /* |
| 344 | * Statistics and configuration functions. |
| 345 | */ |
| 346 | extern nvlist_t *zpool_get_config(zpool_handle_t *, nvlist_t **); |
| 347 | extern nvlist_t *zpool_get_features(zpool_handle_t *); |
| 348 | extern int zpool_refresh_stats(zpool_handle_t *, boolean_t *); |
| 349 | extern int zpool_get_errlog(zpool_handle_t *, nvlist_t **); |
| 350 | |
| 351 | /* |
| 352 | * Import and export functions |
| 353 | */ |
| 354 | extern int zpool_export(zpool_handle_t *, boolean_t, const char *); |
| 355 | extern int zpool_export_force(zpool_handle_t *, const char *); |
| 356 | extern int zpool_import(libzfs_handle_t *, nvlist_t *, const char *, |
| 357 | char *altroot); |
| 358 | extern int zpool_import_props(libzfs_handle_t *, nvlist_t *, const char *, |
| 359 | nvlist_t *, int); |
| 360 | extern void zpool_print_unsup_feat(nvlist_t *config); |
| 361 | |
| 362 | /* |
| 363 | * Search for pools to import |
| 364 | */ |
| 365 | |
| 366 | typedef struct importargs { |
| 367 | char **path; /* a list of paths to search */ |
| 368 | int paths; /* number of paths to search */ |
| 369 | char *poolname; /* name of a pool to find */ |
| 370 | uint64_t guid; /* guid of a pool to find */ |
| 371 | char *cachefile; /* cachefile to use for import */ |
| 372 | int can_be_active : 1; /* can the pool be active? */ |
| 373 | int unique : 1; /* does 'poolname' already exist? */ |
| 374 | int exists : 1; /* set on return if pool already exists */ |
| 375 | } importargs_t; |
| 376 | |
| 377 | extern nvlist_t *zpool_search_import(libzfs_handle_t *, importargs_t *); |
| 378 | |
| 379 | /* legacy pool search routines */ |
| 380 | extern nvlist_t *zpool_find_import(libzfs_handle_t *, int, char **); |
| 381 | extern nvlist_t *zpool_find_import_cached(libzfs_handle_t *, const char *, |
| 382 | char *, uint64_t); |
| 383 | |
| 384 | /* |
| 385 | * Miscellaneous pool functions |
| 386 | */ |
| 387 | struct zfs_cmd; |
| 388 | |
| 389 | extern const char *zfs_history_event_names[]; |
| 390 | |
| 391 | extern char *zpool_vdev_name(libzfs_handle_t *, zpool_handle_t *, nvlist_t *, |
| 392 | boolean_t verbose); |
| 393 | extern int zpool_upgrade(zpool_handle_t *, uint64_t); |
| 394 | extern int zpool_get_history(zpool_handle_t *, nvlist_t **); |
| 395 | extern int zpool_history_unpack(char *, uint64_t, uint64_t *, |
| 396 | nvlist_t ***, uint_t *); |
| 397 | extern void zpool_obj_to_path(zpool_handle_t *, uint64_t, uint64_t, char *, |
| 398 | size_t len); |
| 399 | extern int zfs_ioctl(libzfs_handle_t *, int request, struct zfs_cmd *); |
| 400 | extern int zpool_get_physpath(zpool_handle_t *, char *, size_t); |
| 401 | extern void zpool_explain_recover(libzfs_handle_t *, const char *, int, |
| 402 | nvlist_t *); |
| 403 | |
| 404 | /* |
| 405 | * Basic handle manipulations. These functions do not create or destroy the |
| 406 | * underlying datasets, only the references to them. |
| 407 | */ |
| 408 | extern zfs_handle_t *zfs_open(libzfs_handle_t *, const char *, int); |
| 409 | extern zfs_handle_t *zfs_handle_dup(zfs_handle_t *); |
| 410 | extern void zfs_close(zfs_handle_t *); |
| 411 | extern zfs_type_t zfs_get_type(const zfs_handle_t *); |
| 412 | extern const char *zfs_get_name(const zfs_handle_t *); |
| 413 | extern zpool_handle_t *zfs_get_pool_handle(const zfs_handle_t *); |
| 414 | extern const char *zfs_get_pool_name(const zfs_handle_t *); |
| 415 | |
| 416 | /* |
| 417 | * Property management functions. Some functions are shared with the kernel, |
| 418 | * and are found in sys/fs/zfs.h. |
| 419 | */ |
| 420 | |
| 421 | /* |
| 422 | * zfs dataset property management |
| 423 | */ |
| 424 | extern const char *zfs_prop_default_string(zfs_prop_t); |
| 425 | extern uint64_t zfs_prop_default_numeric(zfs_prop_t); |
| 426 | extern const char *zfs_prop_column_name(zfs_prop_t); |
| 427 | extern boolean_t zfs_prop_align_right(zfs_prop_t); |
| 428 | |
| 429 | extern nvlist_t *zfs_valid_proplist(libzfs_handle_t *, zfs_type_t, |
| 430 | nvlist_t *, uint64_t, zfs_handle_t *, zpool_handle_t *, const char *); |
| 431 | |
| 432 | extern const char *zfs_prop_to_name(zfs_prop_t); |
| 433 | extern int zfs_prop_set(zfs_handle_t *, const char *, const char *); |
| 434 | extern int zfs_prop_set_list(zfs_handle_t *, nvlist_t *); |
| 435 | extern int zfs_prop_get(zfs_handle_t *, zfs_prop_t, char *, size_t, |
| 436 | zprop_source_t *, char *, size_t, boolean_t); |
| 437 | extern int zfs_prop_get_recvd(zfs_handle_t *, const char *, char *, size_t, |
| 438 | boolean_t); |
| 439 | extern int zfs_prop_get_numeric(zfs_handle_t *, zfs_prop_t, uint64_t *, |
| 440 | zprop_source_t *, char *, size_t); |
| 441 | extern int zfs_prop_get_userquota_int(zfs_handle_t *zhp, const char *propname, |
| 442 | uint64_t *propvalue); |
| 443 | extern int zfs_prop_get_userquota(zfs_handle_t *zhp, const char *propname, |
| 444 | char *propbuf, int proplen, boolean_t literal); |
| 445 | extern int zfs_prop_get_written_int(zfs_handle_t *zhp, const char *propname, |
| 446 | uint64_t *propvalue); |
| 447 | extern int zfs_prop_get_written(zfs_handle_t *zhp, const char *propname, |
| 448 | char *propbuf, int proplen, boolean_t literal); |
| 449 | extern int zfs_prop_get_feature(zfs_handle_t *zhp, const char *propname, |
| 450 | char *buf, size_t len); |
| 451 | extern uint64_t zfs_prop_get_int(zfs_handle_t *, zfs_prop_t); |
| 452 | extern int zfs_prop_inherit(zfs_handle_t *, const char *, boolean_t); |
| 453 | extern const char *zfs_prop_values(zfs_prop_t); |
| 454 | extern int zfs_prop_is_string(zfs_prop_t prop); |
| 455 | extern nvlist_t *zfs_get_user_props(zfs_handle_t *); |
| 456 | extern nvlist_t *zfs_get_recvd_props(zfs_handle_t *); |
| 457 | extern nvlist_t *zfs_get_clones_nvl(zfs_handle_t *); |
| 458 | |
| 459 | |
| 460 | typedef struct zprop_list { |
| 461 | int pl_prop; |
| 462 | char *pl_user_prop; |
| 463 | struct zprop_list *pl_next; |
| 464 | boolean_t pl_all; |
| 465 | size_t pl_width; |
| 466 | size_t pl_recvd_width; |
| 467 | boolean_t pl_fixed; |
| 468 | } zprop_list_t; |
| 469 | |
| 470 | extern int zfs_expand_proplist(zfs_handle_t *, zprop_list_t **, boolean_t, |
| 471 | boolean_t); |
| 472 | extern void zfs_prune_proplist(zfs_handle_t *, uint8_t *); |
| 473 | |
| 474 | #define ZFS_MOUNTPOINT_NONE "none" |
| 475 | #define ZFS_MOUNTPOINT_LEGACY "legacy" |
| 476 | |
| 477 | #define ZFS_FEATURE_DISABLED "disabled" |
| 478 | #define ZFS_FEATURE_ENABLED "enabled" |
| 479 | #define ZFS_FEATURE_ACTIVE "active" |
| 480 | |
| 481 | #define ZFS_UNSUPPORTED_INACTIVE "inactive" |
| 482 | #define ZFS_UNSUPPORTED_READONLY "readonly" |
| 483 | |
| 484 | /* |
| 485 | * zpool property management |
| 486 | */ |
| 487 | extern int zpool_expand_proplist(zpool_handle_t *, zprop_list_t **); |
| 488 | extern int zpool_prop_get_feature(zpool_handle_t *, const char *, char *, |
| 489 | size_t); |
| 490 | extern const char *zpool_prop_default_string(zpool_prop_t); |
| 491 | extern uint64_t zpool_prop_default_numeric(zpool_prop_t); |
| 492 | extern const char *zpool_prop_column_name(zpool_prop_t); |
| 493 | extern boolean_t zpool_prop_align_right(zpool_prop_t); |
| 494 | |
| 495 | /* |
| 496 | * Functions shared by zfs and zpool property management. |
| 497 | */ |
| 498 | extern int zprop_iter(zprop_func func, void *cb, boolean_t show_all, |
| 499 | boolean_t ordered, zfs_type_t type); |
| 500 | extern int zprop_get_list(libzfs_handle_t *, char *, zprop_list_t **, |
| 501 | zfs_type_t); |
| 502 | extern void zprop_free_list(zprop_list_t *); |
| 503 | |
| 504 | #define ZFS_GET_NCOLS 5 |
| 505 | |
| 506 | typedef enum { |
| 507 | GET_COL_NONE, |
| 508 | GET_COL_NAME, |
| 509 | GET_COL_PROPERTY, |
| 510 | GET_COL_VALUE, |
| 511 | GET_COL_RECVD, |
| 512 | GET_COL_SOURCE |
| 513 | } zfs_get_column_t; |
| 514 | |
| 515 | /* |
| 516 | * Functions for printing zfs or zpool properties |
| 517 | */ |
| 518 | typedef struct zprop_get_cbdata { |
| 519 | int cb_sources; |
| 520 | zfs_get_column_t cb_columns[ZFS_GET_NCOLS]; |
| 521 | int cb_colwidths[ZFS_GET_NCOLS + 1]; |
| 522 | boolean_t cb_scripted; |
| 523 | boolean_t cb_literal; |
| 524 | boolean_t cb_first; |
| 525 | zprop_list_t *cb_proplist; |
| 526 | zfs_type_t cb_type; |
| 527 | } zprop_get_cbdata_t; |
| 528 | |
| 529 | void zprop_print_one_property(const char *, zprop_get_cbdata_t *, |
| 530 | const char *, const char *, zprop_source_t, const char *, |
| 531 | const char *); |
| 532 | |
| 533 | /* |
| 534 | * Iterator functions. |
| 535 | */ |
| 536 | typedef int (*zfs_iter_f)(zfs_handle_t *, void *); |
| 537 | extern int zfs_iter_root(libzfs_handle_t *, zfs_iter_f, void *); |
| 538 | extern int zfs_iter_children(zfs_handle_t *, zfs_iter_f, void *); |
| 539 | extern int zfs_iter_dependents(zfs_handle_t *, boolean_t, zfs_iter_f, void *); |
| 540 | extern int zfs_iter_filesystems(zfs_handle_t *, zfs_iter_f, void *); |
| 541 | extern int zfs_iter_snapshots(zfs_handle_t *, boolean_t, zfs_iter_f, void *); |
| 542 | extern int zfs_iter_snapshots_sorted(zfs_handle_t *, zfs_iter_f, void *); |
| 543 | extern int zfs_iter_snapspec(zfs_handle_t *, const char *, zfs_iter_f, void *); |
| 544 | extern int zfs_iter_bookmarks(zfs_handle_t *, zfs_iter_f, void *); |
| 545 | |
| 546 | typedef struct get_all_cb { |
| 547 | zfs_handle_t **cb_handles; |
| 548 | size_t cb_alloc; |
| 549 | size_t cb_used; |
| 550 | boolean_t cb_verbose; |
| 551 | int (*cb_getone)(zfs_handle_t *, void *); |
| 552 | } get_all_cb_t; |
| 553 | |
| 554 | void libzfs_add_handle(get_all_cb_t *, zfs_handle_t *); |
| 555 | int libzfs_dataset_cmp(const void *, const void *); |
| 556 | |
| 557 | /* |
| 558 | * Functions to create and destroy datasets. |
| 559 | */ |
| 560 | extern int zfs_create(libzfs_handle_t *, const char *, zfs_type_t, |
| 561 | nvlist_t *); |
| 562 | extern int zfs_create_ancestors(libzfs_handle_t *, const char *); |
| 563 | extern int zfs_destroy(zfs_handle_t *, boolean_t); |
| 564 | extern int zfs_destroy_snaps(zfs_handle_t *, char *, boolean_t); |
| 565 | extern int zfs_destroy_snaps_nvl(libzfs_handle_t *, nvlist_t *, boolean_t); |
| 566 | extern int zfs_clone(zfs_handle_t *, const char *, nvlist_t *); |
| 567 | extern int zfs_snapshot(libzfs_handle_t *, const char *, boolean_t, nvlist_t *); |
| 568 | extern int zfs_snapshot_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, |
| 569 | nvlist_t *props); |
| 570 | extern int zfs_rollback(zfs_handle_t *, zfs_handle_t *, boolean_t); |
| 571 | |
| 572 | typedef struct renameflags { |
| 573 | /* recursive rename */ |
| 574 | int recurse : 1; |
| 575 | |
| 576 | /* don't unmount file systems */ |
| 577 | int nounmount : 1; |
| 578 | |
| 579 | /* force unmount file systems */ |
| 580 | int forceunmount : 1; |
| 581 | } renameflags_t; |
| 582 | |
| 583 | extern int zfs_rename(zfs_handle_t *, const char *, const char *, |
| 584 | renameflags_t flags); |
| 585 | |
| 586 | typedef struct sendflags { |
| 587 | /* print informational messages (ie, -v was specified) */ |
| 588 | boolean_t verbose; |
| 589 | |
| 590 | /* recursive send (ie, -R) */ |
| 591 | boolean_t replicate; |
| 592 | |
| 593 | /* for incrementals, do all intermediate snapshots */ |
| 594 | boolean_t doall; |
| 595 | |
| 596 | /* if dataset is a clone, do incremental from its origin */ |
| 597 | boolean_t fromorigin; |
| 598 | |
| 599 | /* do deduplication */ |
| 600 | boolean_t dedup; |
| 601 | |
| 602 | /* send properties (ie, -p) */ |
| 603 | boolean_t props; |
| 604 | |
| 605 | /* do not send (no-op, ie. -n) */ |
| 606 | boolean_t dryrun; |
| 607 | |
| 608 | /* parsable verbose output (ie. -P) */ |
| 609 | boolean_t parsable; |
| 610 | |
| 611 | /* show progress (ie. -v) */ |
| 612 | boolean_t progress; |
| 613 | |
| 614 | /* large blocks (>128K) are permitted */ |
| 615 | boolean_t largeblock; |
| 616 | |
| 617 | /* WRITE_EMBEDDED records of type DATA are permitted */ |
| 618 | boolean_t embed_data; |
| 619 | } sendflags_t; |
| 620 | |
| 621 | typedef boolean_t (snapfilter_cb_t)(zfs_handle_t *, void *); |
| 622 | |
| 623 | extern int zfs_send(zfs_handle_t *, const char *, const char *, |
| 624 | sendflags_t *, int, snapfilter_cb_t, void *, nvlist_t **); |
| 625 | extern int zfs_send_one(zfs_handle_t *, const char *, int, enum lzc_send_flags); |
| 626 | extern int zfs_send_resume(libzfs_handle_t *, sendflags_t *, int outfd, |
| 627 | const char *); |
| 628 | extern nvlist_t *zfs_send_resume_token_to_nvlist(libzfs_handle_t *hdl, |
| 629 | const char *token); |
| 630 | |
| 631 | extern int zfs_promote(zfs_handle_t *); |
| 632 | extern int zfs_hold(zfs_handle_t *, const char *, const char *, |
| 633 | boolean_t, int); |
| 634 | extern int zfs_hold_nvl(zfs_handle_t *, int, nvlist_t *); |
| 635 | extern int zfs_release(zfs_handle_t *, const char *, const char *, boolean_t); |
| 636 | extern int zfs_get_holds(zfs_handle_t *, nvlist_t **); |
| 637 | extern uint64_t zvol_volsize_to_reservation(uint64_t, nvlist_t *); |
| 638 | |
| 639 | typedef int (*zfs_userspace_cb_t)(void *arg, const char *domain, |
| 640 | uid_t rid, uint64_t space); |
| 641 | |
| 642 | extern int zfs_userspace(zfs_handle_t *, zfs_userquota_prop_t, |
| 643 | zfs_userspace_cb_t, void *); |
| 644 | |
| 645 | extern int zfs_get_fsacl(zfs_handle_t *, nvlist_t **); |
| 646 | extern int zfs_set_fsacl(zfs_handle_t *, boolean_t, nvlist_t *); |
| 647 | |
| 648 | typedef struct recvflags { |
| 649 | /* print informational messages (ie, -v was specified) */ |
| 650 | boolean_t verbose; |
| 651 | |
| 652 | /* the destination is a prefix, not the exact fs (ie, -d) */ |
| 653 | boolean_t isprefix; |
| 654 | |
| 655 | /* |
| 656 | * Only the tail of the sent snapshot path is appended to the |
| 657 | * destination to determine the received snapshot name (ie, -e). |
| 658 | */ |
| 659 | boolean_t istail; |
| 660 | |
| 661 | /* do not actually do the recv, just check if it would work (ie, -n) */ |
| 662 | boolean_t dryrun; |
| 663 | |
| 664 | /* rollback/destroy filesystems as necessary (eg, -F) */ |
| 665 | boolean_t force; |
| 666 | |
| 667 | /* set "canmount=off" on all modified filesystems */ |
| 668 | boolean_t canmountoff; |
| 669 | |
| 670 | /* |
| 671 | * Mark the file systems as "resumable" and do not destroy them if the |
| 672 | * receive is interrupted |
| 673 | */ |
| 674 | boolean_t resumable; |
| 675 | |
| 676 | /* byteswap flag is used internally; callers need not specify */ |
| 677 | boolean_t byteswap; |
| 678 | |
| 679 | /* do not mount file systems as they are extracted (private) */ |
| 680 | boolean_t nomount; |
| 681 | } recvflags_t; |
| 682 | |
| 683 | extern int zfs_receive(libzfs_handle_t *, const char *, nvlist_t *, |
| 684 | recvflags_t *, int, avl_tree_t *); |
| 685 | |
| 686 | typedef enum diff_flags { |
| 687 | ZFS_DIFF_PARSEABLE = 0x1, |
| 688 | ZFS_DIFF_TIMESTAMP = 0x2, |
| 689 | ZFS_DIFF_CLASSIFY = 0x4 |
| 690 | } diff_flags_t; |
| 691 | |
| 692 | extern int zfs_show_diffs(zfs_handle_t *, int, const char *, const char *, |
| 693 | int); |
| 694 | |
| 695 | /* |
| 696 | * Miscellaneous functions. |
| 697 | */ |
| 698 | extern const char *zfs_type_to_name(zfs_type_t); |
| 699 | extern void zfs_refresh_properties(zfs_handle_t *); |
| 700 | extern int zfs_name_valid(const char *, zfs_type_t); |
| 701 | extern zfs_handle_t *zfs_path_to_zhandle(libzfs_handle_t *, char *, zfs_type_t); |
| 702 | extern boolean_t zfs_dataset_exists(libzfs_handle_t *, const char *, |
| 703 | zfs_type_t); |
| 704 | extern int zfs_spa_version(zfs_handle_t *, int *); |
| 705 | extern boolean_t zfs_bookmark_exists(const char *path); |
| 706 | |
| 707 | /* |
| 708 | * Mount support functions. |
| 709 | */ |
| 710 | extern boolean_t is_mounted(libzfs_handle_t *, const char *special, char **); |
| 711 | extern boolean_t zfs_is_mounted(zfs_handle_t *, char **); |
| 712 | extern int zfs_mount(zfs_handle_t *, const char *, int); |
| 713 | extern int zfs_unmount(zfs_handle_t *, const char *, int); |
| 714 | extern int zfs_unmountall(zfs_handle_t *, int); |
| 715 | |
| 716 | /* |
| 717 | * Share support functions. |
| 718 | */ |
| 719 | extern boolean_t zfs_is_shared(zfs_handle_t *); |
| 720 | extern int zfs_share(zfs_handle_t *); |
| 721 | extern int zfs_unshare(zfs_handle_t *); |
| 722 | |
| 723 | /* |
| 724 | * Protocol-specific share support functions. |
| 725 | */ |
| 726 | extern boolean_t zfs_is_shared_nfs(zfs_handle_t *, char **); |
| 727 | extern boolean_t zfs_is_shared_smb(zfs_handle_t *, char **); |
| 728 | extern int zfs_share_nfs(zfs_handle_t *); |
| 729 | extern int zfs_share_smb(zfs_handle_t *); |
| 730 | extern int zfs_shareall(zfs_handle_t *); |
| 731 | extern int zfs_unshare_nfs(zfs_handle_t *, const char *); |
| 732 | extern int zfs_unshare_smb(zfs_handle_t *, const char *); |
| 733 | extern int zfs_unshareall_nfs(zfs_handle_t *); |
| 734 | extern int zfs_unshareall_smb(zfs_handle_t *); |
| 735 | extern int zfs_unshareall_bypath(zfs_handle_t *, const char *); |
| 736 | extern int zfs_unshareall(zfs_handle_t *); |
| 737 | extern int zfs_deleg_share_nfs(libzfs_handle_t *, char *, char *, char *, |
| 738 | void *, void *, int, zfs_share_op_t); |
| 739 | |
| 740 | #ifdef __FreeBSD__ |
| 741 | /* |
| 742 | * FreeBSD-specific jail support function. |
| 743 | */ |
| 744 | extern int zfs_jail(zfs_handle_t *, int, int); |
| 745 | #endif |
| 746 | |
| 747 | /* |
| 748 | * When dealing with nvlists, verify() is extremely useful |
| 749 | */ |
| 750 | #ifndef verify |
| 751 | #ifdef NDEBUG |
| 752 | #define verify(EX) ((void)(EX)) |
| 753 | #else |
| 754 | #define verify(EX) assert(EX) |
| 755 | #endif |
| 756 | #endif |
| 757 | |
| 758 | /* |
| 759 | * Utility function to convert a number to a human-readable form. |
| 760 | */ |
| 761 | extern void zfs_nicenum(uint64_t, char *, size_t); |
| 762 | extern int zfs_nicestrtonum(libzfs_handle_t *, const char *, uint64_t *); |
| 763 | |
| 764 | /* |
| 765 | * Given a device or file, determine if it is part of a pool. |
| 766 | */ |
| 767 | extern int zpool_in_use(libzfs_handle_t *, int, pool_state_t *, char **, |
| 768 | boolean_t *); |
| 769 | |
| 770 | /* |
| 771 | * Label manipulation. |
| 772 | */ |
| 773 | extern int zpool_read_label(int, nvlist_t **); |
| 774 | extern int zpool_clear_label(int); |
| 775 | |
| 776 | /* is this zvol valid for use as a dump device? */ |
| 777 | extern int zvol_check_dump_config(char *); |
| 778 | |
| 779 | /* |
| 780 | * Management interfaces for SMB ACL files |
| 781 | */ |
| 782 | |
| 783 | int zfs_smb_acl_add(libzfs_handle_t *, char *, char *, char *); |
| 784 | int zfs_smb_acl_remove(libzfs_handle_t *, char *, char *, char *); |
| 785 | int zfs_smb_acl_purge(libzfs_handle_t *, char *, char *); |
| 786 | int zfs_smb_acl_rename(libzfs_handle_t *, char *, char *, char *, char *); |
| 787 | |
| 788 | /* |
| 789 | * Enable and disable datasets within a pool by mounting/unmounting and |
| 790 | * sharing/unsharing them. |
| 791 | */ |
| 792 | extern int zpool_enable_datasets(zpool_handle_t *, const char *, int); |
| 793 | extern int zpool_disable_datasets(zpool_handle_t *, boolean_t); |
| 794 | |
| 795 | /* |
| 796 | * Mappings between vdev and FRU. |
| 797 | */ |
| 798 | extern void libzfs_fru_refresh(libzfs_handle_t *); |
| 799 | extern const char *libzfs_fru_lookup(libzfs_handle_t *, const char *); |
| 800 | extern const char *libzfs_fru_devpath(libzfs_handle_t *, const char *); |
| 801 | extern boolean_t libzfs_fru_compare(libzfs_handle_t *, const char *, |
| 802 | const char *); |
| 803 | extern boolean_t libzfs_fru_notself(libzfs_handle_t *, const char *); |
| 804 | extern int zpool_fru_set(zpool_handle_t *, uint64_t, const char *); |
| 805 | |
| 806 | #ifndef illumos |
| 807 | extern int zmount(const char *, const char *, int, char *, char *, int, char *, |
| 808 | int); |
| 809 | #endif |
| 810 | |
| 811 | #ifdef __cplusplus |
| 812 | } |
| 813 | #endif |
| 814 | |
| 815 | #endif /* _LIBZFS_H */ |
| 816 | |