| 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 |  |