1*eda14cbcSMatt Macy /* 2*eda14cbcSMatt Macy * CDDL HEADER START 3*eda14cbcSMatt Macy * 4*eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5*eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6*eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7*eda14cbcSMatt Macy * 8*eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*eda14cbcSMatt Macy * or http://www.opensolaris.org/os/licensing. 10*eda14cbcSMatt Macy * See the License for the specific language governing permissions 11*eda14cbcSMatt Macy * and limitations under the License. 12*eda14cbcSMatt Macy * 13*eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14*eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16*eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17*eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18*eda14cbcSMatt Macy * 19*eda14cbcSMatt Macy * CDDL HEADER END 20*eda14cbcSMatt Macy */ 21*eda14cbcSMatt Macy 22*eda14cbcSMatt Macy /* 23*eda14cbcSMatt Macy * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 24*eda14cbcSMatt Macy * Copyright (c) 2011, 2020 by Delphix. All rights reserved. 25*eda14cbcSMatt Macy * Copyright Joyent, Inc. 26*eda14cbcSMatt Macy * Copyright (c) 2013 Steven Hartland. All rights reserved. 27*eda14cbcSMatt Macy * Copyright (c) 2016, Intel Corporation. 28*eda14cbcSMatt Macy * Copyright 2016 Nexenta Systems, Inc. 29*eda14cbcSMatt Macy * Copyright (c) 2017 Open-E, Inc. All Rights Reserved. 30*eda14cbcSMatt Macy * Copyright (c) 2019 Datto Inc. 31*eda14cbcSMatt Macy */ 32*eda14cbcSMatt Macy 33*eda14cbcSMatt Macy #ifndef _LIBZFS_H 34*eda14cbcSMatt Macy #define _LIBZFS_H 35*eda14cbcSMatt Macy 36*eda14cbcSMatt Macy #include <assert.h> 37*eda14cbcSMatt Macy #include <libnvpair.h> 38*eda14cbcSMatt Macy #include <sys/mnttab.h> 39*eda14cbcSMatt Macy #include <sys/param.h> 40*eda14cbcSMatt Macy #include <sys/types.h> 41*eda14cbcSMatt Macy #include <sys/varargs.h> 42*eda14cbcSMatt Macy #include <sys/fs/zfs.h> 43*eda14cbcSMatt Macy #include <sys/avl.h> 44*eda14cbcSMatt Macy #include <ucred.h> 45*eda14cbcSMatt Macy #include <libzfs_core.h> 46*eda14cbcSMatt Macy 47*eda14cbcSMatt Macy #ifdef __cplusplus 48*eda14cbcSMatt Macy extern "C" { 49*eda14cbcSMatt Macy #endif 50*eda14cbcSMatt Macy 51*eda14cbcSMatt Macy /* 52*eda14cbcSMatt Macy * Miscellaneous ZFS constants 53*eda14cbcSMatt Macy */ 54*eda14cbcSMatt Macy #define ZFS_MAXPROPLEN MAXPATHLEN 55*eda14cbcSMatt Macy #define ZPOOL_MAXPROPLEN MAXPATHLEN 56*eda14cbcSMatt Macy 57*eda14cbcSMatt Macy /* 58*eda14cbcSMatt Macy * libzfs errors 59*eda14cbcSMatt Macy */ 60*eda14cbcSMatt Macy typedef enum zfs_error { 61*eda14cbcSMatt Macy EZFS_SUCCESS = 0, /* no error -- success */ 62*eda14cbcSMatt Macy EZFS_NOMEM = 2000, /* out of memory */ 63*eda14cbcSMatt Macy EZFS_BADPROP, /* invalid property value */ 64*eda14cbcSMatt Macy EZFS_PROPREADONLY, /* cannot set readonly property */ 65*eda14cbcSMatt Macy EZFS_PROPTYPE, /* property does not apply to dataset type */ 66*eda14cbcSMatt Macy EZFS_PROPNONINHERIT, /* property is not inheritable */ 67*eda14cbcSMatt Macy EZFS_PROPSPACE, /* bad quota or reservation */ 68*eda14cbcSMatt Macy EZFS_BADTYPE, /* dataset is not of appropriate type */ 69*eda14cbcSMatt Macy EZFS_BUSY, /* pool or dataset is busy */ 70*eda14cbcSMatt Macy EZFS_EXISTS, /* pool or dataset already exists */ 71*eda14cbcSMatt Macy EZFS_NOENT, /* no such pool or dataset */ 72*eda14cbcSMatt Macy EZFS_BADSTREAM, /* bad backup stream */ 73*eda14cbcSMatt Macy EZFS_DSREADONLY, /* dataset is readonly */ 74*eda14cbcSMatt Macy EZFS_VOLTOOBIG, /* volume is too large for 32-bit system */ 75*eda14cbcSMatt Macy EZFS_INVALIDNAME, /* invalid dataset name */ 76*eda14cbcSMatt Macy EZFS_BADRESTORE, /* unable to restore to destination */ 77*eda14cbcSMatt Macy EZFS_BADBACKUP, /* backup failed */ 78*eda14cbcSMatt Macy EZFS_BADTARGET, /* bad attach/detach/replace target */ 79*eda14cbcSMatt Macy EZFS_NODEVICE, /* no such device in pool */ 80*eda14cbcSMatt Macy EZFS_BADDEV, /* invalid device to add */ 81*eda14cbcSMatt Macy EZFS_NOREPLICAS, /* no valid replicas */ 82*eda14cbcSMatt Macy EZFS_RESILVERING, /* resilvering (healing reconstruction) */ 83*eda14cbcSMatt Macy EZFS_BADVERSION, /* unsupported version */ 84*eda14cbcSMatt Macy EZFS_POOLUNAVAIL, /* pool is currently unavailable */ 85*eda14cbcSMatt Macy EZFS_DEVOVERFLOW, /* too many devices in one vdev */ 86*eda14cbcSMatt Macy EZFS_BADPATH, /* must be an absolute path */ 87*eda14cbcSMatt Macy EZFS_CROSSTARGET, /* rename or clone across pool or dataset */ 88*eda14cbcSMatt Macy EZFS_ZONED, /* used improperly in local zone */ 89*eda14cbcSMatt Macy EZFS_MOUNTFAILED, /* failed to mount dataset */ 90*eda14cbcSMatt Macy EZFS_UMOUNTFAILED, /* failed to unmount dataset */ 91*eda14cbcSMatt Macy EZFS_UNSHARENFSFAILED, /* unshare(1M) failed */ 92*eda14cbcSMatt Macy EZFS_SHARENFSFAILED, /* share(1M) failed */ 93*eda14cbcSMatt Macy EZFS_PERM, /* permission denied */ 94*eda14cbcSMatt Macy EZFS_NOSPC, /* out of space */ 95*eda14cbcSMatt Macy EZFS_FAULT, /* bad address */ 96*eda14cbcSMatt Macy EZFS_IO, /* I/O error */ 97*eda14cbcSMatt Macy EZFS_INTR, /* signal received */ 98*eda14cbcSMatt Macy EZFS_ISSPARE, /* device is a hot spare */ 99*eda14cbcSMatt Macy EZFS_INVALCONFIG, /* invalid vdev configuration */ 100*eda14cbcSMatt Macy EZFS_RECURSIVE, /* recursive dependency */ 101*eda14cbcSMatt Macy EZFS_NOHISTORY, /* no history object */ 102*eda14cbcSMatt Macy EZFS_POOLPROPS, /* couldn't retrieve pool props */ 103*eda14cbcSMatt Macy EZFS_POOL_NOTSUP, /* ops not supported for this type of pool */ 104*eda14cbcSMatt Macy EZFS_POOL_INVALARG, /* invalid argument for this pool operation */ 105*eda14cbcSMatt Macy EZFS_NAMETOOLONG, /* dataset name is too long */ 106*eda14cbcSMatt Macy EZFS_OPENFAILED, /* open of device failed */ 107*eda14cbcSMatt Macy EZFS_NOCAP, /* couldn't get capacity */ 108*eda14cbcSMatt Macy EZFS_LABELFAILED, /* write of label failed */ 109*eda14cbcSMatt Macy EZFS_BADWHO, /* invalid permission who */ 110*eda14cbcSMatt Macy EZFS_BADPERM, /* invalid permission */ 111*eda14cbcSMatt Macy EZFS_BADPERMSET, /* invalid permission set name */ 112*eda14cbcSMatt Macy EZFS_NODELEGATION, /* delegated administration is disabled */ 113*eda14cbcSMatt Macy EZFS_UNSHARESMBFAILED, /* failed to unshare over smb */ 114*eda14cbcSMatt Macy EZFS_SHARESMBFAILED, /* failed to share over smb */ 115*eda14cbcSMatt Macy EZFS_BADCACHE, /* bad cache file */ 116*eda14cbcSMatt Macy EZFS_ISL2CACHE, /* device is for the level 2 ARC */ 117*eda14cbcSMatt Macy EZFS_VDEVNOTSUP, /* unsupported vdev type */ 118*eda14cbcSMatt Macy EZFS_NOTSUP, /* ops not supported on this dataset */ 119*eda14cbcSMatt Macy EZFS_ACTIVE_SPARE, /* pool has active shared spare devices */ 120*eda14cbcSMatt Macy EZFS_UNPLAYED_LOGS, /* log device has unplayed logs */ 121*eda14cbcSMatt Macy EZFS_REFTAG_RELE, /* snapshot release: tag not found */ 122*eda14cbcSMatt Macy EZFS_REFTAG_HOLD, /* snapshot hold: tag already exists */ 123*eda14cbcSMatt Macy EZFS_TAGTOOLONG, /* snapshot hold/rele: tag too long */ 124*eda14cbcSMatt Macy EZFS_PIPEFAILED, /* pipe create failed */ 125*eda14cbcSMatt Macy EZFS_THREADCREATEFAILED, /* thread create failed */ 126*eda14cbcSMatt Macy EZFS_POSTSPLIT_ONLINE, /* onlining a disk after splitting it */ 127*eda14cbcSMatt Macy EZFS_SCRUBBING, /* currently scrubbing */ 128*eda14cbcSMatt Macy EZFS_NO_SCRUB, /* no active scrub */ 129*eda14cbcSMatt Macy EZFS_DIFF, /* general failure of zfs diff */ 130*eda14cbcSMatt Macy EZFS_DIFFDATA, /* bad zfs diff data */ 131*eda14cbcSMatt Macy EZFS_POOLREADONLY, /* pool is in read-only mode */ 132*eda14cbcSMatt Macy EZFS_SCRUB_PAUSED, /* scrub currently paused */ 133*eda14cbcSMatt Macy EZFS_ACTIVE_POOL, /* pool is imported on a different system */ 134*eda14cbcSMatt Macy EZFS_CRYPTOFAILED, /* failed to setup encryption */ 135*eda14cbcSMatt Macy EZFS_NO_PENDING, /* cannot cancel, no operation is pending */ 136*eda14cbcSMatt Macy EZFS_CHECKPOINT_EXISTS, /* checkpoint exists */ 137*eda14cbcSMatt Macy EZFS_DISCARDING_CHECKPOINT, /* currently discarding a checkpoint */ 138*eda14cbcSMatt Macy EZFS_NO_CHECKPOINT, /* pool has no checkpoint */ 139*eda14cbcSMatt Macy EZFS_DEVRM_IN_PROGRESS, /* a device is currently being removed */ 140*eda14cbcSMatt Macy EZFS_VDEV_TOO_BIG, /* a device is too big to be used */ 141*eda14cbcSMatt Macy EZFS_IOC_NOTSUPPORTED, /* operation not supported by zfs module */ 142*eda14cbcSMatt Macy EZFS_TOOMANY, /* argument list too long */ 143*eda14cbcSMatt Macy EZFS_INITIALIZING, /* currently initializing */ 144*eda14cbcSMatt Macy EZFS_NO_INITIALIZE, /* no active initialize */ 145*eda14cbcSMatt Macy EZFS_WRONG_PARENT, /* invalid parent dataset (e.g ZVOL) */ 146*eda14cbcSMatt Macy EZFS_TRIMMING, /* currently trimming */ 147*eda14cbcSMatt Macy EZFS_NO_TRIM, /* no active trim */ 148*eda14cbcSMatt Macy EZFS_TRIM_NOTSUP, /* device does not support trim */ 149*eda14cbcSMatt Macy EZFS_NO_RESILVER_DEFER, /* pool doesn't support resilver_defer */ 150*eda14cbcSMatt Macy EZFS_EXPORT_IN_PROGRESS, /* currently exporting the pool */ 151*eda14cbcSMatt Macy EZFS_REBUILDING, /* resilvering (sequential reconstrution) */ 152*eda14cbcSMatt Macy EZFS_UNKNOWN 153*eda14cbcSMatt Macy } zfs_error_t; 154*eda14cbcSMatt Macy 155*eda14cbcSMatt Macy /* 156*eda14cbcSMatt Macy * The following data structures are all part 157*eda14cbcSMatt Macy * of the zfs_allow_t data structure which is 158*eda14cbcSMatt Macy * used for printing 'allow' permissions. 159*eda14cbcSMatt Macy * It is a linked list of zfs_allow_t's which 160*eda14cbcSMatt Macy * then contain avl tree's for user/group/sets/... 161*eda14cbcSMatt Macy * and each one of the entries in those trees have 162*eda14cbcSMatt Macy * avl tree's for the permissions they belong to and 163*eda14cbcSMatt Macy * whether they are local,descendent or local+descendent 164*eda14cbcSMatt Macy * permissions. The AVL trees are used primarily for 165*eda14cbcSMatt Macy * sorting purposes, but also so that we can quickly find 166*eda14cbcSMatt Macy * a given user and or permission. 167*eda14cbcSMatt Macy */ 168*eda14cbcSMatt Macy typedef struct zfs_perm_node { 169*eda14cbcSMatt Macy avl_node_t z_node; 170*eda14cbcSMatt Macy char z_pname[MAXPATHLEN]; 171*eda14cbcSMatt Macy } zfs_perm_node_t; 172*eda14cbcSMatt Macy 173*eda14cbcSMatt Macy typedef struct zfs_allow_node { 174*eda14cbcSMatt Macy avl_node_t z_node; 175*eda14cbcSMatt Macy char z_key[MAXPATHLEN]; /* name, such as joe */ 176*eda14cbcSMatt Macy avl_tree_t z_localdescend; /* local+descendent perms */ 177*eda14cbcSMatt Macy avl_tree_t z_local; /* local permissions */ 178*eda14cbcSMatt Macy avl_tree_t z_descend; /* descendent permissions */ 179*eda14cbcSMatt Macy } zfs_allow_node_t; 180*eda14cbcSMatt Macy 181*eda14cbcSMatt Macy typedef struct zfs_allow { 182*eda14cbcSMatt Macy struct zfs_allow *z_next; 183*eda14cbcSMatt Macy char z_setpoint[MAXPATHLEN]; 184*eda14cbcSMatt Macy avl_tree_t z_sets; 185*eda14cbcSMatt Macy avl_tree_t z_crperms; 186*eda14cbcSMatt Macy avl_tree_t z_user; 187*eda14cbcSMatt Macy avl_tree_t z_group; 188*eda14cbcSMatt Macy avl_tree_t z_everyone; 189*eda14cbcSMatt Macy } zfs_allow_t; 190*eda14cbcSMatt Macy 191*eda14cbcSMatt Macy /* 192*eda14cbcSMatt Macy * Basic handle types 193*eda14cbcSMatt Macy */ 194*eda14cbcSMatt Macy typedef struct zfs_handle zfs_handle_t; 195*eda14cbcSMatt Macy typedef struct zpool_handle zpool_handle_t; 196*eda14cbcSMatt Macy typedef struct libzfs_handle libzfs_handle_t; 197*eda14cbcSMatt Macy 198*eda14cbcSMatt Macy extern int zpool_wait(zpool_handle_t *, zpool_wait_activity_t); 199*eda14cbcSMatt Macy extern int zpool_wait_status(zpool_handle_t *, zpool_wait_activity_t, 200*eda14cbcSMatt Macy boolean_t *, boolean_t *); 201*eda14cbcSMatt Macy 202*eda14cbcSMatt Macy /* 203*eda14cbcSMatt Macy * Library initialization 204*eda14cbcSMatt Macy */ 205*eda14cbcSMatt Macy extern libzfs_handle_t *libzfs_init(void); 206*eda14cbcSMatt Macy extern void libzfs_fini(libzfs_handle_t *); 207*eda14cbcSMatt Macy 208*eda14cbcSMatt Macy extern libzfs_handle_t *zpool_get_handle(zpool_handle_t *); 209*eda14cbcSMatt Macy extern libzfs_handle_t *zfs_get_handle(zfs_handle_t *); 210*eda14cbcSMatt Macy 211*eda14cbcSMatt Macy extern void libzfs_print_on_error(libzfs_handle_t *, boolean_t); 212*eda14cbcSMatt Macy 213*eda14cbcSMatt Macy extern void zfs_save_arguments(int argc, char **, char *, int); 214*eda14cbcSMatt Macy extern int zpool_log_history(libzfs_handle_t *, const char *); 215*eda14cbcSMatt Macy 216*eda14cbcSMatt Macy extern int libzfs_errno(libzfs_handle_t *); 217*eda14cbcSMatt Macy extern const char *libzfs_error_init(int); 218*eda14cbcSMatt Macy extern const char *libzfs_error_action(libzfs_handle_t *); 219*eda14cbcSMatt Macy extern const char *libzfs_error_description(libzfs_handle_t *); 220*eda14cbcSMatt Macy extern int zfs_standard_error(libzfs_handle_t *, int, const char *); 221*eda14cbcSMatt Macy extern void libzfs_mnttab_init(libzfs_handle_t *); 222*eda14cbcSMatt Macy extern void libzfs_mnttab_fini(libzfs_handle_t *); 223*eda14cbcSMatt Macy extern void libzfs_mnttab_cache(libzfs_handle_t *, boolean_t); 224*eda14cbcSMatt Macy extern int libzfs_mnttab_find(libzfs_handle_t *, const char *, 225*eda14cbcSMatt Macy struct mnttab *); 226*eda14cbcSMatt Macy extern void libzfs_mnttab_add(libzfs_handle_t *, const char *, 227*eda14cbcSMatt Macy const char *, const char *); 228*eda14cbcSMatt Macy extern void libzfs_mnttab_remove(libzfs_handle_t *, const char *); 229*eda14cbcSMatt Macy 230*eda14cbcSMatt Macy /* 231*eda14cbcSMatt Macy * Basic handle functions 232*eda14cbcSMatt Macy */ 233*eda14cbcSMatt Macy extern zpool_handle_t *zpool_open(libzfs_handle_t *, const char *); 234*eda14cbcSMatt Macy extern zpool_handle_t *zpool_open_canfail(libzfs_handle_t *, const char *); 235*eda14cbcSMatt Macy extern void zpool_close(zpool_handle_t *); 236*eda14cbcSMatt Macy extern const char *zpool_get_name(zpool_handle_t *); 237*eda14cbcSMatt Macy extern int zpool_get_state(zpool_handle_t *); 238*eda14cbcSMatt Macy extern const char *zpool_state_to_name(vdev_state_t, vdev_aux_t); 239*eda14cbcSMatt Macy extern const char *zpool_pool_state_to_name(pool_state_t); 240*eda14cbcSMatt Macy extern void zpool_free_handles(libzfs_handle_t *); 241*eda14cbcSMatt Macy 242*eda14cbcSMatt Macy /* 243*eda14cbcSMatt Macy * Iterate over all active pools in the system. 244*eda14cbcSMatt Macy */ 245*eda14cbcSMatt Macy typedef int (*zpool_iter_f)(zpool_handle_t *, void *); 246*eda14cbcSMatt Macy extern int zpool_iter(libzfs_handle_t *, zpool_iter_f, void *); 247*eda14cbcSMatt Macy extern boolean_t zpool_skip_pool(const char *); 248*eda14cbcSMatt Macy 249*eda14cbcSMatt Macy /* 250*eda14cbcSMatt Macy * Functions to create and destroy pools 251*eda14cbcSMatt Macy */ 252*eda14cbcSMatt Macy extern int zpool_create(libzfs_handle_t *, const char *, nvlist_t *, 253*eda14cbcSMatt Macy nvlist_t *, nvlist_t *); 254*eda14cbcSMatt Macy extern int zpool_destroy(zpool_handle_t *, const char *); 255*eda14cbcSMatt Macy extern int zpool_add(zpool_handle_t *, nvlist_t *); 256*eda14cbcSMatt Macy 257*eda14cbcSMatt Macy typedef struct splitflags { 258*eda14cbcSMatt Macy /* do not split, but return the config that would be split off */ 259*eda14cbcSMatt Macy int dryrun : 1; 260*eda14cbcSMatt Macy 261*eda14cbcSMatt Macy /* after splitting, import the pool */ 262*eda14cbcSMatt Macy int import : 1; 263*eda14cbcSMatt Macy int name_flags; 264*eda14cbcSMatt Macy } splitflags_t; 265*eda14cbcSMatt Macy 266*eda14cbcSMatt Macy typedef struct trimflags { 267*eda14cbcSMatt Macy /* requested vdevs are for the entire pool */ 268*eda14cbcSMatt Macy boolean_t fullpool; 269*eda14cbcSMatt Macy 270*eda14cbcSMatt Macy /* request a secure trim, requires support from device */ 271*eda14cbcSMatt Macy boolean_t secure; 272*eda14cbcSMatt Macy 273*eda14cbcSMatt Macy /* after starting trim, block until trim completes */ 274*eda14cbcSMatt Macy boolean_t wait; 275*eda14cbcSMatt Macy 276*eda14cbcSMatt Macy /* trim at the requested rate in bytes/second */ 277*eda14cbcSMatt Macy uint64_t rate; 278*eda14cbcSMatt Macy } trimflags_t; 279*eda14cbcSMatt Macy 280*eda14cbcSMatt Macy /* 281*eda14cbcSMatt Macy * Functions to manipulate pool and vdev state 282*eda14cbcSMatt Macy */ 283*eda14cbcSMatt Macy extern int zpool_scan(zpool_handle_t *, pool_scan_func_t, pool_scrub_cmd_t); 284*eda14cbcSMatt Macy extern int zpool_initialize(zpool_handle_t *, pool_initialize_func_t, 285*eda14cbcSMatt Macy nvlist_t *); 286*eda14cbcSMatt Macy extern int zpool_initialize_wait(zpool_handle_t *, pool_initialize_func_t, 287*eda14cbcSMatt Macy nvlist_t *); 288*eda14cbcSMatt Macy extern int zpool_trim(zpool_handle_t *, pool_trim_func_t, nvlist_t *, 289*eda14cbcSMatt Macy trimflags_t *); 290*eda14cbcSMatt Macy 291*eda14cbcSMatt Macy extern int zpool_clear(zpool_handle_t *, const char *, nvlist_t *); 292*eda14cbcSMatt Macy extern int zpool_reguid(zpool_handle_t *); 293*eda14cbcSMatt Macy extern int zpool_reopen_one(zpool_handle_t *, void *); 294*eda14cbcSMatt Macy 295*eda14cbcSMatt Macy extern int zpool_sync_one(zpool_handle_t *, void *); 296*eda14cbcSMatt Macy 297*eda14cbcSMatt Macy extern int zpool_vdev_online(zpool_handle_t *, const char *, int, 298*eda14cbcSMatt Macy vdev_state_t *); 299*eda14cbcSMatt Macy extern int zpool_vdev_offline(zpool_handle_t *, const char *, boolean_t); 300*eda14cbcSMatt Macy extern int zpool_vdev_attach(zpool_handle_t *, const char *, 301*eda14cbcSMatt Macy const char *, nvlist_t *, int, boolean_t); 302*eda14cbcSMatt Macy extern int zpool_vdev_detach(zpool_handle_t *, const char *); 303*eda14cbcSMatt Macy extern int zpool_vdev_remove(zpool_handle_t *, const char *); 304*eda14cbcSMatt Macy extern int zpool_vdev_remove_cancel(zpool_handle_t *); 305*eda14cbcSMatt Macy extern int zpool_vdev_indirect_size(zpool_handle_t *, const char *, uint64_t *); 306*eda14cbcSMatt Macy extern int zpool_vdev_split(zpool_handle_t *, char *, nvlist_t **, nvlist_t *, 307*eda14cbcSMatt Macy splitflags_t); 308*eda14cbcSMatt Macy 309*eda14cbcSMatt Macy extern int zpool_vdev_fault(zpool_handle_t *, uint64_t, vdev_aux_t); 310*eda14cbcSMatt Macy extern int zpool_vdev_degrade(zpool_handle_t *, uint64_t, vdev_aux_t); 311*eda14cbcSMatt Macy extern int zpool_vdev_clear(zpool_handle_t *, uint64_t); 312*eda14cbcSMatt Macy 313*eda14cbcSMatt Macy extern nvlist_t *zpool_find_vdev(zpool_handle_t *, const char *, boolean_t *, 314*eda14cbcSMatt Macy boolean_t *, boolean_t *); 315*eda14cbcSMatt Macy extern nvlist_t *zpool_find_vdev_by_physpath(zpool_handle_t *, const char *, 316*eda14cbcSMatt Macy boolean_t *, boolean_t *, boolean_t *); 317*eda14cbcSMatt Macy extern int zpool_label_disk(libzfs_handle_t *, zpool_handle_t *, const char *); 318*eda14cbcSMatt Macy extern uint64_t zpool_vdev_path_to_guid(zpool_handle_t *zhp, const char *path); 319*eda14cbcSMatt Macy 320*eda14cbcSMatt Macy const char *zpool_get_state_str(zpool_handle_t *); 321*eda14cbcSMatt Macy 322*eda14cbcSMatt Macy /* 323*eda14cbcSMatt Macy * Functions to manage pool properties 324*eda14cbcSMatt Macy */ 325*eda14cbcSMatt Macy extern int zpool_set_prop(zpool_handle_t *, const char *, const char *); 326*eda14cbcSMatt Macy extern int zpool_get_prop(zpool_handle_t *, zpool_prop_t, char *, 327*eda14cbcSMatt Macy size_t proplen, zprop_source_t *, boolean_t literal); 328*eda14cbcSMatt Macy extern uint64_t zpool_get_prop_int(zpool_handle_t *, zpool_prop_t, 329*eda14cbcSMatt Macy zprop_source_t *); 330*eda14cbcSMatt Macy extern int zpool_props_refresh(zpool_handle_t *); 331*eda14cbcSMatt Macy 332*eda14cbcSMatt Macy extern const char *zpool_prop_to_name(zpool_prop_t); 333*eda14cbcSMatt Macy extern const char *zpool_prop_values(zpool_prop_t); 334*eda14cbcSMatt Macy 335*eda14cbcSMatt Macy /* 336*eda14cbcSMatt Macy * Pool health statistics. 337*eda14cbcSMatt Macy */ 338*eda14cbcSMatt Macy typedef enum { 339*eda14cbcSMatt Macy /* 340*eda14cbcSMatt Macy * The following correspond to faults as defined in the (fault.fs.zfs.*) 341*eda14cbcSMatt Macy * event namespace. Each is associated with a corresponding message ID. 342*eda14cbcSMatt Macy * This must be kept in sync with the zfs_msgid_table in 343*eda14cbcSMatt Macy * lib/libzfs/libzfs_status.c. 344*eda14cbcSMatt Macy */ 345*eda14cbcSMatt Macy ZPOOL_STATUS_CORRUPT_CACHE, /* corrupt /kernel/drv/zpool.cache */ 346*eda14cbcSMatt Macy ZPOOL_STATUS_MISSING_DEV_R, /* missing device with replicas */ 347*eda14cbcSMatt Macy ZPOOL_STATUS_MISSING_DEV_NR, /* missing device with no replicas */ 348*eda14cbcSMatt Macy ZPOOL_STATUS_CORRUPT_LABEL_R, /* bad device label with replicas */ 349*eda14cbcSMatt Macy ZPOOL_STATUS_CORRUPT_LABEL_NR, /* bad device label with no replicas */ 350*eda14cbcSMatt Macy ZPOOL_STATUS_BAD_GUID_SUM, /* sum of device guids didn't match */ 351*eda14cbcSMatt Macy ZPOOL_STATUS_CORRUPT_POOL, /* pool metadata is corrupted */ 352*eda14cbcSMatt Macy ZPOOL_STATUS_CORRUPT_DATA, /* data errors in user (meta)data */ 353*eda14cbcSMatt Macy ZPOOL_STATUS_FAILING_DEV, /* device experiencing errors */ 354*eda14cbcSMatt Macy ZPOOL_STATUS_VERSION_NEWER, /* newer on-disk version */ 355*eda14cbcSMatt Macy ZPOOL_STATUS_HOSTID_MISMATCH, /* last accessed by another system */ 356*eda14cbcSMatt Macy ZPOOL_STATUS_HOSTID_ACTIVE, /* currently active on another system */ 357*eda14cbcSMatt Macy ZPOOL_STATUS_HOSTID_REQUIRED, /* multihost=on and hostid=0 */ 358*eda14cbcSMatt Macy ZPOOL_STATUS_IO_FAILURE_WAIT, /* failed I/O, failmode 'wait' */ 359*eda14cbcSMatt Macy ZPOOL_STATUS_IO_FAILURE_CONTINUE, /* failed I/O, failmode 'continue' */ 360*eda14cbcSMatt Macy ZPOOL_STATUS_IO_FAILURE_MMP, /* failed MMP, failmode not 'panic' */ 361*eda14cbcSMatt Macy ZPOOL_STATUS_BAD_LOG, /* cannot read log chain(s) */ 362*eda14cbcSMatt Macy ZPOOL_STATUS_ERRATA, /* informational errata available */ 363*eda14cbcSMatt Macy 364*eda14cbcSMatt Macy /* 365*eda14cbcSMatt Macy * If the pool has unsupported features but can still be opened in 366*eda14cbcSMatt Macy * read-only mode, its status is ZPOOL_STATUS_UNSUP_FEAT_WRITE. If the 367*eda14cbcSMatt Macy * pool has unsupported features but cannot be opened at all, its 368*eda14cbcSMatt Macy * status is ZPOOL_STATUS_UNSUP_FEAT_READ. 369*eda14cbcSMatt Macy */ 370*eda14cbcSMatt Macy ZPOOL_STATUS_UNSUP_FEAT_READ, /* unsupported features for read */ 371*eda14cbcSMatt Macy ZPOOL_STATUS_UNSUP_FEAT_WRITE, /* unsupported features for write */ 372*eda14cbcSMatt Macy 373*eda14cbcSMatt Macy /* 374*eda14cbcSMatt Macy * These faults have no corresponding message ID. At the time we are 375*eda14cbcSMatt Macy * checking the status, the original reason for the FMA fault (I/O or 376*eda14cbcSMatt Macy * checksum errors) has been lost. 377*eda14cbcSMatt Macy */ 378*eda14cbcSMatt Macy ZPOOL_STATUS_FAULTED_DEV_R, /* faulted device with replicas */ 379*eda14cbcSMatt Macy ZPOOL_STATUS_FAULTED_DEV_NR, /* faulted device with no replicas */ 380*eda14cbcSMatt Macy 381*eda14cbcSMatt Macy /* 382*eda14cbcSMatt Macy * The following are not faults per se, but still an error possibly 383*eda14cbcSMatt Macy * requiring administrative attention. There is no corresponding 384*eda14cbcSMatt Macy * message ID. 385*eda14cbcSMatt Macy */ 386*eda14cbcSMatt Macy ZPOOL_STATUS_VERSION_OLDER, /* older legacy on-disk version */ 387*eda14cbcSMatt Macy ZPOOL_STATUS_FEAT_DISABLED, /* supported features are disabled */ 388*eda14cbcSMatt Macy ZPOOL_STATUS_RESILVERING, /* device being resilvered */ 389*eda14cbcSMatt Macy ZPOOL_STATUS_OFFLINE_DEV, /* device offline */ 390*eda14cbcSMatt Macy ZPOOL_STATUS_REMOVED_DEV, /* removed device */ 391*eda14cbcSMatt Macy ZPOOL_STATUS_REBUILDING, /* device being rebuilt */ 392*eda14cbcSMatt Macy ZPOOL_STATUS_REBUILD_SCRUB, /* recommend scrubbing the pool */ 393*eda14cbcSMatt Macy ZPOOL_STATUS_NON_NATIVE_ASHIFT, /* (e.g. 512e dev with ashift of 9) */ 394*eda14cbcSMatt Macy 395*eda14cbcSMatt Macy /* 396*eda14cbcSMatt Macy * Finally, the following indicates a healthy pool. 397*eda14cbcSMatt Macy */ 398*eda14cbcSMatt Macy ZPOOL_STATUS_OK 399*eda14cbcSMatt Macy } zpool_status_t; 400*eda14cbcSMatt Macy 401*eda14cbcSMatt Macy extern zpool_status_t zpool_get_status(zpool_handle_t *, char **, 402*eda14cbcSMatt Macy zpool_errata_t *); 403*eda14cbcSMatt Macy extern zpool_status_t zpool_import_status(nvlist_t *, char **, 404*eda14cbcSMatt Macy zpool_errata_t *); 405*eda14cbcSMatt Macy 406*eda14cbcSMatt Macy /* 407*eda14cbcSMatt Macy * Statistics and configuration functions. 408*eda14cbcSMatt Macy */ 409*eda14cbcSMatt Macy extern nvlist_t *zpool_get_config(zpool_handle_t *, nvlist_t **); 410*eda14cbcSMatt Macy extern nvlist_t *zpool_get_features(zpool_handle_t *); 411*eda14cbcSMatt Macy extern int zpool_refresh_stats(zpool_handle_t *, boolean_t *); 412*eda14cbcSMatt Macy extern int zpool_get_errlog(zpool_handle_t *, nvlist_t **); 413*eda14cbcSMatt Macy 414*eda14cbcSMatt Macy /* 415*eda14cbcSMatt Macy * Import and export functions 416*eda14cbcSMatt Macy */ 417*eda14cbcSMatt Macy extern int zpool_export(zpool_handle_t *, boolean_t, const char *); 418*eda14cbcSMatt Macy extern int zpool_export_force(zpool_handle_t *, const char *); 419*eda14cbcSMatt Macy extern int zpool_import(libzfs_handle_t *, nvlist_t *, const char *, 420*eda14cbcSMatt Macy char *altroot); 421*eda14cbcSMatt Macy extern int zpool_import_props(libzfs_handle_t *, nvlist_t *, const char *, 422*eda14cbcSMatt Macy nvlist_t *, int); 423*eda14cbcSMatt Macy extern void zpool_print_unsup_feat(nvlist_t *config); 424*eda14cbcSMatt Macy 425*eda14cbcSMatt Macy /* 426*eda14cbcSMatt Macy * Miscellaneous pool functions 427*eda14cbcSMatt Macy */ 428*eda14cbcSMatt Macy struct zfs_cmd; 429*eda14cbcSMatt Macy 430*eda14cbcSMatt Macy extern const char *zfs_history_event_names[]; 431*eda14cbcSMatt Macy 432*eda14cbcSMatt Macy typedef enum { 433*eda14cbcSMatt Macy VDEV_NAME_PATH = 1 << 0, 434*eda14cbcSMatt Macy VDEV_NAME_GUID = 1 << 1, 435*eda14cbcSMatt Macy VDEV_NAME_FOLLOW_LINKS = 1 << 2, 436*eda14cbcSMatt Macy VDEV_NAME_TYPE_ID = 1 << 3, 437*eda14cbcSMatt Macy } vdev_name_t; 438*eda14cbcSMatt Macy 439*eda14cbcSMatt Macy extern char *zpool_vdev_name(libzfs_handle_t *, zpool_handle_t *, nvlist_t *, 440*eda14cbcSMatt Macy int name_flags); 441*eda14cbcSMatt Macy extern int zpool_upgrade(zpool_handle_t *, uint64_t); 442*eda14cbcSMatt Macy extern int zpool_get_history(zpool_handle_t *, nvlist_t **, uint64_t *, 443*eda14cbcSMatt Macy boolean_t *); 444*eda14cbcSMatt Macy extern int zpool_events_next(libzfs_handle_t *, nvlist_t **, int *, unsigned, 445*eda14cbcSMatt Macy int); 446*eda14cbcSMatt Macy extern int zpool_events_clear(libzfs_handle_t *, int *); 447*eda14cbcSMatt Macy extern int zpool_events_seek(libzfs_handle_t *, uint64_t, int); 448*eda14cbcSMatt Macy extern void zpool_obj_to_path_ds(zpool_handle_t *, uint64_t, uint64_t, char *, 449*eda14cbcSMatt Macy size_t); 450*eda14cbcSMatt Macy extern void zpool_obj_to_path(zpool_handle_t *, uint64_t, uint64_t, char *, 451*eda14cbcSMatt Macy size_t); 452*eda14cbcSMatt Macy extern int zfs_ioctl(libzfs_handle_t *, int, struct zfs_cmd *); 453*eda14cbcSMatt Macy extern int zpool_get_physpath(zpool_handle_t *, char *, size_t); 454*eda14cbcSMatt Macy extern void zpool_explain_recover(libzfs_handle_t *, const char *, int, 455*eda14cbcSMatt Macy nvlist_t *); 456*eda14cbcSMatt Macy extern int zpool_checkpoint(zpool_handle_t *); 457*eda14cbcSMatt Macy extern int zpool_discard_checkpoint(zpool_handle_t *); 458*eda14cbcSMatt Macy 459*eda14cbcSMatt Macy /* 460*eda14cbcSMatt Macy * Basic handle manipulations. These functions do not create or destroy the 461*eda14cbcSMatt Macy * underlying datasets, only the references to them. 462*eda14cbcSMatt Macy */ 463*eda14cbcSMatt Macy extern zfs_handle_t *zfs_open(libzfs_handle_t *, const char *, int); 464*eda14cbcSMatt Macy extern zfs_handle_t *zfs_handle_dup(zfs_handle_t *); 465*eda14cbcSMatt Macy extern void zfs_close(zfs_handle_t *); 466*eda14cbcSMatt Macy extern zfs_type_t zfs_get_type(const zfs_handle_t *); 467*eda14cbcSMatt Macy extern const char *zfs_get_name(const zfs_handle_t *); 468*eda14cbcSMatt Macy extern zpool_handle_t *zfs_get_pool_handle(const zfs_handle_t *); 469*eda14cbcSMatt Macy extern const char *zfs_get_pool_name(const zfs_handle_t *); 470*eda14cbcSMatt Macy 471*eda14cbcSMatt Macy /* 472*eda14cbcSMatt Macy * Property management functions. Some functions are shared with the kernel, 473*eda14cbcSMatt Macy * and are found in sys/fs/zfs.h. 474*eda14cbcSMatt Macy */ 475*eda14cbcSMatt Macy 476*eda14cbcSMatt Macy /* 477*eda14cbcSMatt Macy * zfs dataset property management 478*eda14cbcSMatt Macy */ 479*eda14cbcSMatt Macy extern const char *zfs_prop_default_string(zfs_prop_t); 480*eda14cbcSMatt Macy extern uint64_t zfs_prop_default_numeric(zfs_prop_t); 481*eda14cbcSMatt Macy extern const char *zfs_prop_column_name(zfs_prop_t); 482*eda14cbcSMatt Macy extern boolean_t zfs_prop_align_right(zfs_prop_t); 483*eda14cbcSMatt Macy 484*eda14cbcSMatt Macy extern nvlist_t *zfs_valid_proplist(libzfs_handle_t *, zfs_type_t, nvlist_t *, 485*eda14cbcSMatt Macy uint64_t, zfs_handle_t *, zpool_handle_t *, boolean_t, const char *); 486*eda14cbcSMatt Macy 487*eda14cbcSMatt Macy extern const char *zfs_prop_to_name(zfs_prop_t); 488*eda14cbcSMatt Macy extern int zfs_prop_set(zfs_handle_t *, const char *, const char *); 489*eda14cbcSMatt Macy extern int zfs_prop_set_list(zfs_handle_t *, nvlist_t *); 490*eda14cbcSMatt Macy extern int zfs_prop_get(zfs_handle_t *, zfs_prop_t, char *, size_t, 491*eda14cbcSMatt Macy zprop_source_t *, char *, size_t, boolean_t); 492*eda14cbcSMatt Macy extern int zfs_prop_get_recvd(zfs_handle_t *, const char *, char *, size_t, 493*eda14cbcSMatt Macy boolean_t); 494*eda14cbcSMatt Macy extern int zfs_prop_get_numeric(zfs_handle_t *, zfs_prop_t, uint64_t *, 495*eda14cbcSMatt Macy zprop_source_t *, char *, size_t); 496*eda14cbcSMatt Macy extern int zfs_prop_get_userquota_int(zfs_handle_t *zhp, const char *propname, 497*eda14cbcSMatt Macy uint64_t *propvalue); 498*eda14cbcSMatt Macy extern int zfs_prop_get_userquota(zfs_handle_t *zhp, const char *propname, 499*eda14cbcSMatt Macy char *propbuf, int proplen, boolean_t literal); 500*eda14cbcSMatt Macy extern int zfs_prop_get_written_int(zfs_handle_t *zhp, const char *propname, 501*eda14cbcSMatt Macy uint64_t *propvalue); 502*eda14cbcSMatt Macy extern int zfs_prop_get_written(zfs_handle_t *zhp, const char *propname, 503*eda14cbcSMatt Macy char *propbuf, int proplen, boolean_t literal); 504*eda14cbcSMatt Macy extern int zfs_prop_get_feature(zfs_handle_t *zhp, const char *propname, 505*eda14cbcSMatt Macy char *buf, size_t len); 506*eda14cbcSMatt Macy extern uint64_t getprop_uint64(zfs_handle_t *, zfs_prop_t, char **); 507*eda14cbcSMatt Macy extern uint64_t zfs_prop_get_int(zfs_handle_t *, zfs_prop_t); 508*eda14cbcSMatt Macy extern int zfs_prop_inherit(zfs_handle_t *, const char *, boolean_t); 509*eda14cbcSMatt Macy extern const char *zfs_prop_values(zfs_prop_t); 510*eda14cbcSMatt Macy extern int zfs_prop_is_string(zfs_prop_t prop); 511*eda14cbcSMatt Macy extern nvlist_t *zfs_get_all_props(zfs_handle_t *); 512*eda14cbcSMatt Macy extern nvlist_t *zfs_get_user_props(zfs_handle_t *); 513*eda14cbcSMatt Macy extern nvlist_t *zfs_get_recvd_props(zfs_handle_t *); 514*eda14cbcSMatt Macy extern nvlist_t *zfs_get_clones_nvl(zfs_handle_t *); 515*eda14cbcSMatt Macy 516*eda14cbcSMatt Macy extern int zfs_wait_status(zfs_handle_t *, zfs_wait_activity_t, 517*eda14cbcSMatt Macy boolean_t *, boolean_t *); 518*eda14cbcSMatt Macy 519*eda14cbcSMatt Macy /* 520*eda14cbcSMatt Macy * zfs encryption management 521*eda14cbcSMatt Macy */ 522*eda14cbcSMatt Macy extern int zfs_crypto_get_encryption_root(zfs_handle_t *, boolean_t *, char *); 523*eda14cbcSMatt Macy extern int zfs_crypto_create(libzfs_handle_t *, char *, nvlist_t *, nvlist_t *, 524*eda14cbcSMatt Macy boolean_t stdin_available, uint8_t **, uint_t *); 525*eda14cbcSMatt Macy extern int zfs_crypto_clone_check(libzfs_handle_t *, zfs_handle_t *, char *, 526*eda14cbcSMatt Macy nvlist_t *); 527*eda14cbcSMatt Macy extern int zfs_crypto_attempt_load_keys(libzfs_handle_t *, char *); 528*eda14cbcSMatt Macy extern int zfs_crypto_load_key(zfs_handle_t *, boolean_t, char *); 529*eda14cbcSMatt Macy extern int zfs_crypto_unload_key(zfs_handle_t *); 530*eda14cbcSMatt Macy extern int zfs_crypto_rewrap(zfs_handle_t *, nvlist_t *, boolean_t); 531*eda14cbcSMatt Macy 532*eda14cbcSMatt Macy typedef struct zprop_list { 533*eda14cbcSMatt Macy int pl_prop; 534*eda14cbcSMatt Macy char *pl_user_prop; 535*eda14cbcSMatt Macy struct zprop_list *pl_next; 536*eda14cbcSMatt Macy boolean_t pl_all; 537*eda14cbcSMatt Macy size_t pl_width; 538*eda14cbcSMatt Macy size_t pl_recvd_width; 539*eda14cbcSMatt Macy boolean_t pl_fixed; 540*eda14cbcSMatt Macy } zprop_list_t; 541*eda14cbcSMatt Macy 542*eda14cbcSMatt Macy extern int zfs_expand_proplist(zfs_handle_t *, zprop_list_t **, boolean_t, 543*eda14cbcSMatt Macy boolean_t); 544*eda14cbcSMatt Macy extern void zfs_prune_proplist(zfs_handle_t *, uint8_t *); 545*eda14cbcSMatt Macy 546*eda14cbcSMatt Macy #define ZFS_MOUNTPOINT_NONE "none" 547*eda14cbcSMatt Macy #define ZFS_MOUNTPOINT_LEGACY "legacy" 548*eda14cbcSMatt Macy 549*eda14cbcSMatt Macy #define ZFS_FEATURE_DISABLED "disabled" 550*eda14cbcSMatt Macy #define ZFS_FEATURE_ENABLED "enabled" 551*eda14cbcSMatt Macy #define ZFS_FEATURE_ACTIVE "active" 552*eda14cbcSMatt Macy 553*eda14cbcSMatt Macy #define ZFS_UNSUPPORTED_INACTIVE "inactive" 554*eda14cbcSMatt Macy #define ZFS_UNSUPPORTED_READONLY "readonly" 555*eda14cbcSMatt Macy 556*eda14cbcSMatt Macy /* 557*eda14cbcSMatt Macy * zpool property management 558*eda14cbcSMatt Macy */ 559*eda14cbcSMatt Macy extern int zpool_expand_proplist(zpool_handle_t *, zprop_list_t **); 560*eda14cbcSMatt Macy extern int zpool_prop_get_feature(zpool_handle_t *, const char *, char *, 561*eda14cbcSMatt Macy size_t); 562*eda14cbcSMatt Macy extern const char *zpool_prop_default_string(zpool_prop_t); 563*eda14cbcSMatt Macy extern uint64_t zpool_prop_default_numeric(zpool_prop_t); 564*eda14cbcSMatt Macy extern const char *zpool_prop_column_name(zpool_prop_t); 565*eda14cbcSMatt Macy extern boolean_t zpool_prop_align_right(zpool_prop_t); 566*eda14cbcSMatt Macy 567*eda14cbcSMatt Macy /* 568*eda14cbcSMatt Macy * Functions shared by zfs and zpool property management. 569*eda14cbcSMatt Macy */ 570*eda14cbcSMatt Macy extern int zprop_iter(zprop_func func, void *cb, boolean_t show_all, 571*eda14cbcSMatt Macy boolean_t ordered, zfs_type_t type); 572*eda14cbcSMatt Macy extern int zprop_get_list(libzfs_handle_t *, char *, zprop_list_t **, 573*eda14cbcSMatt Macy zfs_type_t); 574*eda14cbcSMatt Macy extern void zprop_free_list(zprop_list_t *); 575*eda14cbcSMatt Macy 576*eda14cbcSMatt Macy #define ZFS_GET_NCOLS 5 577*eda14cbcSMatt Macy 578*eda14cbcSMatt Macy typedef enum { 579*eda14cbcSMatt Macy GET_COL_NONE, 580*eda14cbcSMatt Macy GET_COL_NAME, 581*eda14cbcSMatt Macy GET_COL_PROPERTY, 582*eda14cbcSMatt Macy GET_COL_VALUE, 583*eda14cbcSMatt Macy GET_COL_RECVD, 584*eda14cbcSMatt Macy GET_COL_SOURCE 585*eda14cbcSMatt Macy } zfs_get_column_t; 586*eda14cbcSMatt Macy 587*eda14cbcSMatt Macy /* 588*eda14cbcSMatt Macy * Functions for printing zfs or zpool properties 589*eda14cbcSMatt Macy */ 590*eda14cbcSMatt Macy typedef struct zprop_get_cbdata { 591*eda14cbcSMatt Macy int cb_sources; 592*eda14cbcSMatt Macy zfs_get_column_t cb_columns[ZFS_GET_NCOLS]; 593*eda14cbcSMatt Macy int cb_colwidths[ZFS_GET_NCOLS + 1]; 594*eda14cbcSMatt Macy boolean_t cb_scripted; 595*eda14cbcSMatt Macy boolean_t cb_literal; 596*eda14cbcSMatt Macy boolean_t cb_first; 597*eda14cbcSMatt Macy zprop_list_t *cb_proplist; 598*eda14cbcSMatt Macy zfs_type_t cb_type; 599*eda14cbcSMatt Macy } zprop_get_cbdata_t; 600*eda14cbcSMatt Macy 601*eda14cbcSMatt Macy void zprop_print_one_property(const char *, zprop_get_cbdata_t *, 602*eda14cbcSMatt Macy const char *, const char *, zprop_source_t, const char *, 603*eda14cbcSMatt Macy const char *); 604*eda14cbcSMatt Macy 605*eda14cbcSMatt Macy /* 606*eda14cbcSMatt Macy * Iterator functions. 607*eda14cbcSMatt Macy */ 608*eda14cbcSMatt Macy typedef int (*zfs_iter_f)(zfs_handle_t *, void *); 609*eda14cbcSMatt Macy extern int zfs_iter_root(libzfs_handle_t *, zfs_iter_f, void *); 610*eda14cbcSMatt Macy extern int zfs_iter_children(zfs_handle_t *, zfs_iter_f, void *); 611*eda14cbcSMatt Macy extern int zfs_iter_dependents(zfs_handle_t *, boolean_t, zfs_iter_f, void *); 612*eda14cbcSMatt Macy extern int zfs_iter_filesystems(zfs_handle_t *, zfs_iter_f, void *); 613*eda14cbcSMatt Macy extern int zfs_iter_snapshots(zfs_handle_t *, boolean_t, zfs_iter_f, void *, 614*eda14cbcSMatt Macy uint64_t, uint64_t); 615*eda14cbcSMatt Macy extern int zfs_iter_snapshots_sorted(zfs_handle_t *, zfs_iter_f, void *, 616*eda14cbcSMatt Macy uint64_t, uint64_t); 617*eda14cbcSMatt Macy extern int zfs_iter_snapspec(zfs_handle_t *, const char *, zfs_iter_f, void *); 618*eda14cbcSMatt Macy extern int zfs_iter_bookmarks(zfs_handle_t *, zfs_iter_f, void *); 619*eda14cbcSMatt Macy extern int zfs_iter_mounted(zfs_handle_t *, zfs_iter_f, void *); 620*eda14cbcSMatt Macy 621*eda14cbcSMatt Macy typedef struct get_all_cb { 622*eda14cbcSMatt Macy zfs_handle_t **cb_handles; 623*eda14cbcSMatt Macy size_t cb_alloc; 624*eda14cbcSMatt Macy size_t cb_used; 625*eda14cbcSMatt Macy } get_all_cb_t; 626*eda14cbcSMatt Macy 627*eda14cbcSMatt Macy void zfs_foreach_mountpoint(libzfs_handle_t *, zfs_handle_t **, size_t, 628*eda14cbcSMatt Macy zfs_iter_f, void *, boolean_t); 629*eda14cbcSMatt Macy void libzfs_add_handle(get_all_cb_t *, zfs_handle_t *); 630*eda14cbcSMatt Macy 631*eda14cbcSMatt Macy /* 632*eda14cbcSMatt Macy * Functions to create and destroy datasets. 633*eda14cbcSMatt Macy */ 634*eda14cbcSMatt Macy extern int zfs_create(libzfs_handle_t *, const char *, zfs_type_t, 635*eda14cbcSMatt Macy nvlist_t *); 636*eda14cbcSMatt Macy extern int zfs_create_ancestors(libzfs_handle_t *, const char *); 637*eda14cbcSMatt Macy extern int zfs_destroy(zfs_handle_t *, boolean_t); 638*eda14cbcSMatt Macy extern int zfs_destroy_snaps(zfs_handle_t *, char *, boolean_t); 639*eda14cbcSMatt Macy extern int zfs_destroy_snaps_nvl(libzfs_handle_t *, nvlist_t *, boolean_t); 640*eda14cbcSMatt Macy extern int zfs_clone(zfs_handle_t *, const char *, nvlist_t *); 641*eda14cbcSMatt Macy extern int zfs_snapshot(libzfs_handle_t *, const char *, boolean_t, nvlist_t *); 642*eda14cbcSMatt Macy extern int zfs_snapshot_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, 643*eda14cbcSMatt Macy nvlist_t *props); 644*eda14cbcSMatt Macy extern int zfs_rollback(zfs_handle_t *, zfs_handle_t *, boolean_t); 645*eda14cbcSMatt Macy extern int zfs_rename(zfs_handle_t *, const char *, boolean_t, boolean_t); 646*eda14cbcSMatt Macy 647*eda14cbcSMatt Macy typedef struct sendflags { 648*eda14cbcSMatt Macy /* Amount of extra information to print. */ 649*eda14cbcSMatt Macy int verbosity; 650*eda14cbcSMatt Macy 651*eda14cbcSMatt Macy /* recursive send (ie, -R) */ 652*eda14cbcSMatt Macy boolean_t replicate; 653*eda14cbcSMatt Macy 654*eda14cbcSMatt Macy /* for incrementals, do all intermediate snapshots */ 655*eda14cbcSMatt Macy boolean_t doall; 656*eda14cbcSMatt Macy 657*eda14cbcSMatt Macy /* if dataset is a clone, do incremental from its origin */ 658*eda14cbcSMatt Macy boolean_t fromorigin; 659*eda14cbcSMatt Macy 660*eda14cbcSMatt Macy /* field no longer used, maintained for backwards compatibility */ 661*eda14cbcSMatt Macy boolean_t pad; 662*eda14cbcSMatt Macy 663*eda14cbcSMatt Macy /* send properties (ie, -p) */ 664*eda14cbcSMatt Macy boolean_t props; 665*eda14cbcSMatt Macy 666*eda14cbcSMatt Macy /* do not send (no-op, ie. -n) */ 667*eda14cbcSMatt Macy boolean_t dryrun; 668*eda14cbcSMatt Macy 669*eda14cbcSMatt Macy /* parsable verbose output (ie. -P) */ 670*eda14cbcSMatt Macy boolean_t parsable; 671*eda14cbcSMatt Macy 672*eda14cbcSMatt Macy /* show progress (ie. -v) */ 673*eda14cbcSMatt Macy boolean_t progress; 674*eda14cbcSMatt Macy 675*eda14cbcSMatt Macy /* large blocks (>128K) are permitted */ 676*eda14cbcSMatt Macy boolean_t largeblock; 677*eda14cbcSMatt Macy 678*eda14cbcSMatt Macy /* WRITE_EMBEDDED records of type DATA are permitted */ 679*eda14cbcSMatt Macy boolean_t embed_data; 680*eda14cbcSMatt Macy 681*eda14cbcSMatt Macy /* compressed WRITE records are permitted */ 682*eda14cbcSMatt Macy boolean_t compress; 683*eda14cbcSMatt Macy 684*eda14cbcSMatt Macy /* raw encrypted records are permitted */ 685*eda14cbcSMatt Macy boolean_t raw; 686*eda14cbcSMatt Macy 687*eda14cbcSMatt Macy /* only send received properties (ie. -b) */ 688*eda14cbcSMatt Macy boolean_t backup; 689*eda14cbcSMatt Macy 690*eda14cbcSMatt Macy /* include snapshot holds in send stream */ 691*eda14cbcSMatt Macy boolean_t holds; 692*eda14cbcSMatt Macy 693*eda14cbcSMatt Macy /* stream represents a partially received dataset */ 694*eda14cbcSMatt Macy boolean_t saved; 695*eda14cbcSMatt Macy } sendflags_t; 696*eda14cbcSMatt Macy 697*eda14cbcSMatt Macy typedef boolean_t (snapfilter_cb_t)(zfs_handle_t *, void *); 698*eda14cbcSMatt Macy 699*eda14cbcSMatt Macy extern int zfs_send(zfs_handle_t *, const char *, const char *, 700*eda14cbcSMatt Macy sendflags_t *, int, snapfilter_cb_t, void *, nvlist_t **); 701*eda14cbcSMatt Macy extern int zfs_send_one(zfs_handle_t *, const char *, int, sendflags_t *, 702*eda14cbcSMatt Macy const char *); 703*eda14cbcSMatt Macy extern int zfs_send_progress(zfs_handle_t *, int, uint64_t *, uint64_t *); 704*eda14cbcSMatt Macy extern int zfs_send_resume(libzfs_handle_t *, sendflags_t *, int outfd, 705*eda14cbcSMatt Macy const char *); 706*eda14cbcSMatt Macy extern int zfs_send_saved(zfs_handle_t *, sendflags_t *, int, const char *); 707*eda14cbcSMatt Macy extern nvlist_t *zfs_send_resume_token_to_nvlist(libzfs_handle_t *hdl, 708*eda14cbcSMatt Macy const char *token); 709*eda14cbcSMatt Macy 710*eda14cbcSMatt Macy extern int zfs_promote(zfs_handle_t *); 711*eda14cbcSMatt Macy extern int zfs_hold(zfs_handle_t *, const char *, const char *, 712*eda14cbcSMatt Macy boolean_t, int); 713*eda14cbcSMatt Macy extern int zfs_hold_nvl(zfs_handle_t *, int, nvlist_t *); 714*eda14cbcSMatt Macy extern int zfs_release(zfs_handle_t *, const char *, const char *, boolean_t); 715*eda14cbcSMatt Macy extern int zfs_get_holds(zfs_handle_t *, nvlist_t **); 716*eda14cbcSMatt Macy extern uint64_t zvol_volsize_to_reservation(zpool_handle_t *, uint64_t, 717*eda14cbcSMatt Macy nvlist_t *); 718*eda14cbcSMatt Macy 719*eda14cbcSMatt Macy typedef int (*zfs_userspace_cb_t)(void *arg, const char *domain, 720*eda14cbcSMatt Macy uid_t rid, uint64_t space); 721*eda14cbcSMatt Macy 722*eda14cbcSMatt Macy extern int zfs_userspace(zfs_handle_t *, zfs_userquota_prop_t, 723*eda14cbcSMatt Macy zfs_userspace_cb_t, void *); 724*eda14cbcSMatt Macy 725*eda14cbcSMatt Macy extern int zfs_get_fsacl(zfs_handle_t *, nvlist_t **); 726*eda14cbcSMatt Macy extern int zfs_set_fsacl(zfs_handle_t *, boolean_t, nvlist_t *); 727*eda14cbcSMatt Macy 728*eda14cbcSMatt Macy typedef struct recvflags { 729*eda14cbcSMatt Macy /* print informational messages (ie, -v was specified) */ 730*eda14cbcSMatt Macy boolean_t verbose; 731*eda14cbcSMatt Macy 732*eda14cbcSMatt Macy /* the destination is a prefix, not the exact fs (ie, -d) */ 733*eda14cbcSMatt Macy boolean_t isprefix; 734*eda14cbcSMatt Macy 735*eda14cbcSMatt Macy /* 736*eda14cbcSMatt Macy * Only the tail of the sent snapshot path is appended to the 737*eda14cbcSMatt Macy * destination to determine the received snapshot name (ie, -e). 738*eda14cbcSMatt Macy */ 739*eda14cbcSMatt Macy boolean_t istail; 740*eda14cbcSMatt Macy 741*eda14cbcSMatt Macy /* do not actually do the recv, just check if it would work (ie, -n) */ 742*eda14cbcSMatt Macy boolean_t dryrun; 743*eda14cbcSMatt Macy 744*eda14cbcSMatt Macy /* rollback/destroy filesystems as necessary (eg, -F) */ 745*eda14cbcSMatt Macy boolean_t force; 746*eda14cbcSMatt Macy 747*eda14cbcSMatt Macy /* set "canmount=off" on all modified filesystems */ 748*eda14cbcSMatt Macy boolean_t canmountoff; 749*eda14cbcSMatt Macy 750*eda14cbcSMatt Macy /* 751*eda14cbcSMatt Macy * Mark the file systems as "resumable" and do not destroy them if the 752*eda14cbcSMatt Macy * receive is interrupted 753*eda14cbcSMatt Macy */ 754*eda14cbcSMatt Macy boolean_t resumable; 755*eda14cbcSMatt Macy 756*eda14cbcSMatt Macy /* byteswap flag is used internally; callers need not specify */ 757*eda14cbcSMatt Macy boolean_t byteswap; 758*eda14cbcSMatt Macy 759*eda14cbcSMatt Macy /* do not mount file systems as they are extracted (private) */ 760*eda14cbcSMatt Macy boolean_t nomount; 761*eda14cbcSMatt Macy 762*eda14cbcSMatt Macy /* Was holds flag set in the compound header? */ 763*eda14cbcSMatt Macy boolean_t holds; 764*eda14cbcSMatt Macy 765*eda14cbcSMatt Macy /* skip receive of snapshot holds */ 766*eda14cbcSMatt Macy boolean_t skipholds; 767*eda14cbcSMatt Macy 768*eda14cbcSMatt Macy /* mount the filesystem unless nomount is specified */ 769*eda14cbcSMatt Macy boolean_t domount; 770*eda14cbcSMatt Macy 771*eda14cbcSMatt Macy /* force unmount while recv snapshot (private) */ 772*eda14cbcSMatt Macy boolean_t forceunmount; 773*eda14cbcSMatt Macy } recvflags_t; 774*eda14cbcSMatt Macy 775*eda14cbcSMatt Macy extern int zfs_receive(libzfs_handle_t *, const char *, nvlist_t *, 776*eda14cbcSMatt Macy recvflags_t *, int, avl_tree_t *); 777*eda14cbcSMatt Macy 778*eda14cbcSMatt Macy typedef enum diff_flags { 779*eda14cbcSMatt Macy ZFS_DIFF_PARSEABLE = 0x1, 780*eda14cbcSMatt Macy ZFS_DIFF_TIMESTAMP = 0x2, 781*eda14cbcSMatt Macy ZFS_DIFF_CLASSIFY = 0x4 782*eda14cbcSMatt Macy } diff_flags_t; 783*eda14cbcSMatt Macy 784*eda14cbcSMatt Macy extern int zfs_show_diffs(zfs_handle_t *, int, const char *, const char *, 785*eda14cbcSMatt Macy int); 786*eda14cbcSMatt Macy 787*eda14cbcSMatt Macy /* 788*eda14cbcSMatt Macy * Miscellaneous functions. 789*eda14cbcSMatt Macy */ 790*eda14cbcSMatt Macy extern const char *zfs_type_to_name(zfs_type_t); 791*eda14cbcSMatt Macy extern void zfs_refresh_properties(zfs_handle_t *); 792*eda14cbcSMatt Macy extern int zfs_name_valid(const char *, zfs_type_t); 793*eda14cbcSMatt Macy extern zfs_handle_t *zfs_path_to_zhandle(libzfs_handle_t *, const char *, 794*eda14cbcSMatt Macy zfs_type_t); 795*eda14cbcSMatt Macy extern int zfs_parent_name(zfs_handle_t *, char *, size_t); 796*eda14cbcSMatt Macy extern boolean_t zfs_dataset_exists(libzfs_handle_t *, const char *, 797*eda14cbcSMatt Macy zfs_type_t); 798*eda14cbcSMatt Macy extern int zfs_spa_version(zfs_handle_t *, int *); 799*eda14cbcSMatt Macy extern boolean_t zfs_bookmark_exists(const char *path); 800*eda14cbcSMatt Macy 801*eda14cbcSMatt Macy /* 802*eda14cbcSMatt Macy * Mount support functions. 803*eda14cbcSMatt Macy */ 804*eda14cbcSMatt Macy extern boolean_t is_mounted(libzfs_handle_t *, const char *special, char **); 805*eda14cbcSMatt Macy extern boolean_t zfs_is_mounted(zfs_handle_t *, char **); 806*eda14cbcSMatt Macy extern int zfs_mount(zfs_handle_t *, const char *, int); 807*eda14cbcSMatt Macy extern int zfs_mount_at(zfs_handle_t *, const char *, int, const char *); 808*eda14cbcSMatt Macy extern int zfs_unmount(zfs_handle_t *, const char *, int); 809*eda14cbcSMatt Macy extern int zfs_unmountall(zfs_handle_t *, int); 810*eda14cbcSMatt Macy 811*eda14cbcSMatt Macy #if defined(__linux__) 812*eda14cbcSMatt Macy extern int zfs_parse_mount_options(char *mntopts, unsigned long *mntflags, 813*eda14cbcSMatt Macy unsigned long *zfsflags, int sloppy, char *badopt, char *mtabopt); 814*eda14cbcSMatt Macy extern void zfs_adjust_mount_options(zfs_handle_t *zhp, const char *mntpoint, 815*eda14cbcSMatt Macy char *mntopts, char *mtabopt); 816*eda14cbcSMatt Macy #endif 817*eda14cbcSMatt Macy 818*eda14cbcSMatt Macy /* 819*eda14cbcSMatt Macy * Share support functions. 820*eda14cbcSMatt Macy */ 821*eda14cbcSMatt Macy extern boolean_t zfs_is_shared(zfs_handle_t *); 822*eda14cbcSMatt Macy extern int zfs_share(zfs_handle_t *); 823*eda14cbcSMatt Macy extern int zfs_unshare(zfs_handle_t *); 824*eda14cbcSMatt Macy 825*eda14cbcSMatt Macy /* 826*eda14cbcSMatt Macy * Protocol-specific share support functions. 827*eda14cbcSMatt Macy */ 828*eda14cbcSMatt Macy extern boolean_t zfs_is_shared_nfs(zfs_handle_t *, char **); 829*eda14cbcSMatt Macy extern boolean_t zfs_is_shared_smb(zfs_handle_t *, char **); 830*eda14cbcSMatt Macy extern int zfs_share_nfs(zfs_handle_t *); 831*eda14cbcSMatt Macy extern int zfs_share_smb(zfs_handle_t *); 832*eda14cbcSMatt Macy extern int zfs_shareall(zfs_handle_t *); 833*eda14cbcSMatt Macy extern int zfs_unshare_nfs(zfs_handle_t *, const char *); 834*eda14cbcSMatt Macy extern int zfs_unshare_smb(zfs_handle_t *, const char *); 835*eda14cbcSMatt Macy extern int zfs_unshareall_nfs(zfs_handle_t *); 836*eda14cbcSMatt Macy extern int zfs_unshareall_smb(zfs_handle_t *); 837*eda14cbcSMatt Macy extern int zfs_unshareall_bypath(zfs_handle_t *, const char *); 838*eda14cbcSMatt Macy extern int zfs_unshareall_bytype(zfs_handle_t *, const char *, const char *); 839*eda14cbcSMatt Macy extern int zfs_unshareall(zfs_handle_t *); 840*eda14cbcSMatt Macy extern int zfs_deleg_share_nfs(libzfs_handle_t *, char *, char *, char *, 841*eda14cbcSMatt Macy void *, void *, int, zfs_share_op_t); 842*eda14cbcSMatt Macy extern void zfs_commit_nfs_shares(void); 843*eda14cbcSMatt Macy extern void zfs_commit_smb_shares(void); 844*eda14cbcSMatt Macy extern void zfs_commit_all_shares(void); 845*eda14cbcSMatt Macy extern void zfs_commit_shares(const char *); 846*eda14cbcSMatt Macy 847*eda14cbcSMatt Macy extern int zfs_nicestrtonum(libzfs_handle_t *, const char *, uint64_t *); 848*eda14cbcSMatt Macy 849*eda14cbcSMatt Macy /* 850*eda14cbcSMatt Macy * Utility functions to run an external process. 851*eda14cbcSMatt Macy */ 852*eda14cbcSMatt Macy #define STDOUT_VERBOSE 0x01 853*eda14cbcSMatt Macy #define STDERR_VERBOSE 0x02 854*eda14cbcSMatt Macy #define NO_DEFAULT_PATH 0x04 /* Don't use $PATH to lookup the command */ 855*eda14cbcSMatt Macy 856*eda14cbcSMatt Macy int libzfs_run_process(const char *, char **, int); 857*eda14cbcSMatt Macy int libzfs_run_process_get_stdout(const char *, char *[], char *[], 858*eda14cbcSMatt Macy char **[], int *); 859*eda14cbcSMatt Macy int libzfs_run_process_get_stdout_nopath(const char *, char *[], char *[], 860*eda14cbcSMatt Macy char **[], int *); 861*eda14cbcSMatt Macy 862*eda14cbcSMatt Macy void libzfs_free_str_array(char **, int); 863*eda14cbcSMatt Macy 864*eda14cbcSMatt Macy int libzfs_envvar_is_set(char *); 865*eda14cbcSMatt Macy 866*eda14cbcSMatt Macy /* 867*eda14cbcSMatt Macy * Utility functions for zfs version 868*eda14cbcSMatt Macy */ 869*eda14cbcSMatt Macy extern void zfs_version_userland(char *, int); 870*eda14cbcSMatt Macy extern int zfs_version_kernel(char *, int); 871*eda14cbcSMatt Macy extern int zfs_version_print(void); 872*eda14cbcSMatt Macy 873*eda14cbcSMatt Macy /* 874*eda14cbcSMatt Macy * Given a device or file, determine if it is part of a pool. 875*eda14cbcSMatt Macy */ 876*eda14cbcSMatt Macy extern int zpool_in_use(libzfs_handle_t *, int, pool_state_t *, char **, 877*eda14cbcSMatt Macy boolean_t *); 878*eda14cbcSMatt Macy 879*eda14cbcSMatt Macy /* 880*eda14cbcSMatt Macy * Label manipulation. 881*eda14cbcSMatt Macy */ 882*eda14cbcSMatt Macy extern int zpool_clear_label(int); 883*eda14cbcSMatt Macy extern int zpool_set_bootenv(zpool_handle_t *, const char *); 884*eda14cbcSMatt Macy extern int zpool_get_bootenv(zpool_handle_t *, char *, size_t, off_t); 885*eda14cbcSMatt Macy 886*eda14cbcSMatt Macy /* 887*eda14cbcSMatt Macy * Management interfaces for SMB ACL files 888*eda14cbcSMatt Macy */ 889*eda14cbcSMatt Macy 890*eda14cbcSMatt Macy int zfs_smb_acl_add(libzfs_handle_t *, char *, char *, char *); 891*eda14cbcSMatt Macy int zfs_smb_acl_remove(libzfs_handle_t *, char *, char *, char *); 892*eda14cbcSMatt Macy int zfs_smb_acl_purge(libzfs_handle_t *, char *, char *); 893*eda14cbcSMatt Macy int zfs_smb_acl_rename(libzfs_handle_t *, char *, char *, char *, char *); 894*eda14cbcSMatt Macy 895*eda14cbcSMatt Macy /* 896*eda14cbcSMatt Macy * Enable and disable datasets within a pool by mounting/unmounting and 897*eda14cbcSMatt Macy * sharing/unsharing them. 898*eda14cbcSMatt Macy */ 899*eda14cbcSMatt Macy extern int zpool_enable_datasets(zpool_handle_t *, const char *, int); 900*eda14cbcSMatt Macy extern int zpool_disable_datasets(zpool_handle_t *, boolean_t); 901*eda14cbcSMatt Macy 902*eda14cbcSMatt Macy #ifdef __FreeBSD__ 903*eda14cbcSMatt Macy 904*eda14cbcSMatt Macy /* 905*eda14cbcSMatt Macy * Attach/detach the given filesystem to/from the given jail. 906*eda14cbcSMatt Macy */ 907*eda14cbcSMatt Macy extern int zfs_jail(zfs_handle_t *zhp, int jailid, int attach); 908*eda14cbcSMatt Macy 909*eda14cbcSMatt Macy /* 910*eda14cbcSMatt Macy * Set loader options for next boot. 911*eda14cbcSMatt Macy */ 912*eda14cbcSMatt Macy extern int zpool_nextboot(libzfs_handle_t *, uint64_t, uint64_t, const char *); 913*eda14cbcSMatt Macy 914*eda14cbcSMatt Macy #endif /* __FreeBSD__ */ 915*eda14cbcSMatt Macy 916*eda14cbcSMatt Macy #ifdef __cplusplus 917*eda14cbcSMatt Macy } 918*eda14cbcSMatt Macy #endif 919*eda14cbcSMatt Macy 920*eda14cbcSMatt Macy #endif /* _LIBZFS_H */ 921