1fa9e4066Sahrens /* 25b6e0c46Sdougm * CDDL HEADER SART 3fa9e4066Sahrens * 4fa9e4066Sahrens * The contents of this file are subject to the terms of the 5ea8dc4b6Seschrock * Common Development and Distribution License (the "License"). 6ea8dc4b6Seschrock * You may not use this file except in compliance with the License. 7fa9e4066Sahrens * 8fa9e4066Sahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9fa9e4066Sahrens * or http://www.opensolaris.org/os/licensing. 10fa9e4066Sahrens * See the License for the specific language governing permissions 11fa9e4066Sahrens * and limitations under the License. 12fa9e4066Sahrens * 13fa9e4066Sahrens * When distributing Covered Code, include this CDDL HEADER in each 14fa9e4066Sahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15fa9e4066Sahrens * If applicable, add the following below this CDDL HEADER, with the 16fa9e4066Sahrens * fields enclosed by brackets "[]" replaced with your own identifying 17fa9e4066Sahrens * information: Portions Copyright [yyyy] [name of copyright owner] 18fa9e4066Sahrens * 19fa9e4066Sahrens * CDDL HEADER END 20fa9e4066Sahrens */ 21f3861e1aSahl 22fa9e4066Sahrens /* 2399d5e173STim Haley * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 240d8fa8f8SMartin Matuska * Copyright (c) 2011 Pawel Jakub Dawidek. All rights reserved. 25591e0e13SSebastien Roy * Copyright (c) 2011, 2017 by Delphix. All rights reserved. 266c24238bSJason King * Copyright 2020 Joyent, Inc. 27fa9e4066Sahrens */ 28fa9e4066Sahrens 294445fffbSMatthew Ahrens #ifndef _LIBZFS_IMPL_H 304445fffbSMatthew Ahrens #define _LIBZFS_IMPL_H 31fa9e4066Sahrens 32fa9e4066Sahrens #include <sys/fs/zfs.h> 33ecd6cf80Smarks #include <sys/spa.h> 34fa9e4066Sahrens #include <sys/nvpair.h> 359adfa60dSMatthew Ahrens #include <sys/dmu.h> 369adfa60dSMatthew Ahrens #include <sys/zfs_ioctl.h> 37591e0e13SSebastien Roy #include <synch.h> 386c24238bSJason King #include <regex.h> 39fa9e4066Sahrens 4099653d4eSeschrock #include <libuutil.h> 41fa9e4066Sahrens #include <libzfs.h> 4267331909Sdougm #include <libshare.h> 434445fffbSMatthew Ahrens #include <libzfs_core.h> 44727feae5SJoshua M. Clulow #include <libdevinfo.h> 45fa9e4066Sahrens 46069f55e2SEric Schrock #include <fm/libtopo.h> 47069f55e2SEric Schrock 48fa9e4066Sahrens #ifdef __cplusplus 49fa9e4066Sahrens extern "C" { 50fa9e4066Sahrens #endif 51fa9e4066Sahrens 525da9ad7bSgw #ifdef VERIFY 535da9ad7bSgw #undef VERIFY 545da9ad7bSgw #endif 555da9ad7bSgw #define VERIFY verify 565da9ad7bSgw 57069f55e2SEric Schrock typedef struct libzfs_fru { 58069f55e2SEric Schrock char *zf_device; 59069f55e2SEric Schrock char *zf_fru; 60069f55e2SEric Schrock struct libzfs_fru *zf_chain; 61069f55e2SEric Schrock struct libzfs_fru *zf_next; 62069f55e2SEric Schrock } libzfs_fru_t; 63069f55e2SEric Schrock 6499653d4eSeschrock struct libzfs_handle { 6599653d4eSeschrock int libzfs_error; 6699653d4eSeschrock int libzfs_fd; 6799653d4eSeschrock FILE *libzfs_mnttab; 6899653d4eSeschrock FILE *libzfs_sharetab; 6929ab75c9Srm zpool_handle_t *libzfs_pool_handles; 7099653d4eSeschrock uu_avl_pool_t *libzfs_ns_avlpool; 7199653d4eSeschrock uu_avl_t *libzfs_ns_avl; 7299653d4eSeschrock uint64_t libzfs_ns_gen; 7399653d4eSeschrock int libzfs_desc_active; 7499653d4eSeschrock char libzfs_action[1024]; 7599653d4eSeschrock char libzfs_desc[1024]; 7699653d4eSeschrock int libzfs_printerr; 7799d5e173STim Haley int libzfs_storeerr; /* stuff error messages into buffer */ 7867331909Sdougm void *libzfs_sharehdl; /* libshare handle */ 79b2634b9cSEric Taylor boolean_t libzfs_mnttab_enable; 80591e0e13SSebastien Roy /* 81591e0e13SSebastien Roy * We need a lock to handle the case where parallel mount 82591e0e13SSebastien Roy * threads are populating the mnttab cache simultaneously. The 83591e0e13SSebastien Roy * lock only protects the integrity of the avl tree, and does 84591e0e13SSebastien Roy * not protect the contents of the mnttab entries themselves. 85591e0e13SSebastien Roy */ 86591e0e13SSebastien Roy mutex_t libzfs_mnttab_cache_lock; 87ebedde84SEric Taylor avl_tree_t libzfs_mnttab_cache; 88069f55e2SEric Schrock int libzfs_pool_iter; 89069f55e2SEric Schrock topo_hdl_t *libzfs_topo_hdl; 90069f55e2SEric Schrock libzfs_fru_t **libzfs_fru_hash; 91069f55e2SEric Schrock libzfs_fru_t *libzfs_fru_list; 92069f55e2SEric Schrock char libzfs_chassis_id[256]; 93dfc11533SChris Williamson boolean_t libzfs_prop_debug; 94727feae5SJoshua M. Clulow di_devlink_handle_t libzfs_devlink; 956c24238bSJason King regex_t libzfs_urire; 96*c5286370SAllan Jude uint64_t libzfs_max_nvlist; 9799653d4eSeschrock }; 98069f55e2SEric Schrock 99fa9e4066Sahrens struct zfs_handle { 10099653d4eSeschrock libzfs_handle_t *zfs_hdl; 10129ab75c9Srm zpool_handle_t *zpool_hdl; 1029adfa60dSMatthew Ahrens char zfs_name[ZFS_MAX_DATASET_NAME_LEN]; 103a2eea2e1Sahrens zfs_type_t zfs_type; /* type including snapshot */ 104a2eea2e1Sahrens zfs_type_t zfs_head_type; /* type excluding snapshot */ 105fa9e4066Sahrens dmu_objset_stats_t zfs_dmustats; 1067f7322feSeschrock nvlist_t *zfs_props; 107e9dbad6fSeschrock nvlist_t *zfs_user_props; 10892241e0bSTom Erickson nvlist_t *zfs_recvd_props; 1093bb79becSeschrock boolean_t zfs_mntcheck; 110fa9e4066Sahrens char *zfs_mntopts; 1112e5e9e19SSanjeev Bagewadi uint8_t *zfs_props_table; 112fa9e4066Sahrens }; 113fa9e4066Sahrens 114e9dbad6fSeschrock /* 115e9dbad6fSeschrock * This is different from checking zfs_type, because it will also catch 116e9dbad6fSeschrock * snapshots of volumes. 117e9dbad6fSeschrock */ 118a2eea2e1Sahrens #define ZFS_IS_VOLUME(zhp) ((zhp)->zfs_head_type == ZFS_TYPE_VOLUME) 119e9dbad6fSeschrock 120fa9e4066Sahrens struct zpool_handle { 12199653d4eSeschrock libzfs_handle_t *zpool_hdl; 12229ab75c9Srm zpool_handle_t *zpool_next; 1239adfa60dSMatthew Ahrens char zpool_name[ZFS_MAX_DATASET_NAME_LEN]; 124fa9e4066Sahrens int zpool_state; 125fa9e4066Sahrens size_t zpool_config_size; 126fa9e4066Sahrens nvlist_t *zpool_config; 127088e9d47Seschrock nvlist_t *zpool_old_config; 128b1b8ab34Slling nvlist_t *zpool_props; 1298488aeb5Staylor diskaddr_t zpool_start_block; 130fa9e4066Sahrens }; 131fa9e4066Sahrens 13219b94df9SMatthew Ahrens typedef enum { 133da6c28aaSamw PROTO_NFS = 0, 134da6c28aaSamw PROTO_SMB = 1, 135da6c28aaSamw PROTO_END = 2 136da6c28aaSamw } zfs_share_proto_t; 137da6c28aaSamw 138da6c28aaSamw /* 139da6c28aaSamw * The following can be used as a bitmask and any new values 140da6c28aaSamw * added must preserve that capability. 141da6c28aaSamw */ 142da6c28aaSamw typedef enum { 143da6c28aaSamw SHARED_NOT_SHARED = 0x0, 144da6c28aaSamw SHARED_NFS = 0x2, 145da6c28aaSamw SHARED_SMB = 0x4 146da6c28aaSamw } zfs_share_type_t; 147da6c28aaSamw 1486c24238bSJason King 1496c24238bSJason King /* 1506c24238bSJason King * From RFC3986 Appendix B. The regex is a bit of a beast, but with an 1516c24238bSJason King * example URI of: 1526c24238bSJason King * 1536c24238bSJason King * http://www.ics.uci.edu/pub/ietf/uri/#Related 1546c24238bSJason King * 1556c24238bSJason King * URI_REGEX should match with the following subexpressions: 1566c24238bSJason King * 1576c24238bSJason King * $1 = http: 1586c24238bSJason King * $2 = http 1596c24238bSJason King * $3 = //www.ics.uci.edu 1606c24238bSJason King * $4 = www.ics.uci.edu 1616c24238bSJason King * $5 = /pub/ietf/uri/ 1626c24238bSJason King * $6 = <undefined> 1636c24238bSJason King * $7 = <undefined> 1646c24238bSJason King * $8 = #Related 1656c24238bSJason King * $9 = Related 1666c24238bSJason King * 1676c24238bSJason King * More generally: 1686c24238bSJason King * 1696c24238bSJason King * scheme = $2 1706c24238bSJason King * authority = $4 1716c24238bSJason King * path = $5 1726c24238bSJason King * query = $7 1736c24238bSJason King * fragment = $9 1746c24238bSJason King * 1756c24238bSJason King * We only care about the value of the scheme component ($2) in order to 1766c24238bSJason King * invoke the correct handler. Each handler should do any additional URI 1776c24238bSJason King * validation as required. 1786c24238bSJason King */ 1796c24238bSJason King #define URI_REGEX \ 1806c24238bSJason King "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?" 1816c24238bSJason King #define URI_NMATCH 10 /* whole URI match ($0) + 9 subexps */ 1826c24238bSJason King #define URI_SCHEMESUBEXP 2 /* '$2' */ 1836c24238bSJason King 1846c24238bSJason King typedef int (*zfs_uri_handler_fn_t)(struct libzfs_handle *, const char *, 1856c24238bSJason King const char *, zfs_keyformat_t, boolean_t, uint8_t **, size_t *); 1866c24238bSJason King 1876c24238bSJason King typedef struct zfs_uri_handler { 1886c24238bSJason King const char *zuh_scheme; 1896c24238bSJason King zfs_uri_handler_fn_t zuh_handler; 1906c24238bSJason King } zfs_uri_handler_t; 1916c24238bSJason King 192e0f1c0afSOlaf Faaland #define CONFIG_BUF_MINSIZE 262144 1938b65a70bSPavel Zakharov 194ece3d9b3Slling int zfs_error(libzfs_handle_t *, int, const char *); 195ece3d9b3Slling int zfs_error_fmt(libzfs_handle_t *, int, const char *, ...); 19699653d4eSeschrock void zfs_error_aux(libzfs_handle_t *, const char *, ...); 19799653d4eSeschrock void *zfs_alloc(libzfs_handle_t *, size_t); 198e9dbad6fSeschrock void *zfs_realloc(libzfs_handle_t *, void *, size_t, size_t); 19999d5e173STim Haley char *zfs_asprintf(libzfs_handle_t *, const char *, ...); 20099653d4eSeschrock char *zfs_strdup(libzfs_handle_t *, const char *); 20199653d4eSeschrock int no_memory(libzfs_handle_t *); 202fa9e4066Sahrens 203ece3d9b3Slling int zfs_standard_error(libzfs_handle_t *, int, const char *); 204ece3d9b3Slling int zfs_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 205ece3d9b3Slling int zpool_standard_error(libzfs_handle_t *, int, const char *); 206ece3d9b3Slling int zpool_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 207fa9e4066Sahrens 2083bb79becSeschrock int get_dependents(libzfs_handle_t *, boolean_t, const char *, char ***, 2093bb79becSeschrock size_t *); 21019b94df9SMatthew Ahrens zfs_handle_t *make_dataset_handle_zc(libzfs_handle_t *, zfs_cmd_t *); 2110d8fa8f8SMartin Matuska zfs_handle_t *make_dataset_simple_handle_zc(zfs_handle_t *, zfs_cmd_t *); 212b1b8ab34Slling 213990b4856Slling int zprop_parse_value(libzfs_handle_t *, nvpair_t *, int, zfs_type_t, 214990b4856Slling nvlist_t *, char **, uint64_t *, const char *); 215990b4856Slling int zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, 216990b4856Slling zfs_type_t type); 217b1b8ab34Slling 2180069fd67STim Haley /* 2190069fd67STim Haley * Use this changelist_gather() flag to force attempting mounts 2200069fd67STim Haley * on each change node regardless of whether or not it is currently 2210069fd67STim Haley * mounted. 2220069fd67STim Haley */ 2230069fd67STim Haley #define CL_GATHER_MOUNT_ALWAYS 1 2240069fd67STim Haley 225fa9e4066Sahrens typedef struct prop_changelist prop_changelist_t; 226fa9e4066Sahrens 227e9dbad6fSeschrock int zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t); 228990b4856Slling int zcmd_write_src_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 229990b4856Slling int zcmd_write_conf_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 230e9dbad6fSeschrock int zcmd_expand_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *); 231e9dbad6fSeschrock int zcmd_read_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t **); 232e9dbad6fSeschrock void zcmd_free_nvlists(zfs_cmd_t *); 233e9dbad6fSeschrock 234fa9e4066Sahrens int changelist_prefix(prop_changelist_t *); 235fa9e4066Sahrens int changelist_postfix(prop_changelist_t *); 236fa9e4066Sahrens void changelist_rename(prop_changelist_t *, const char *, const char *); 2373cb34c60Sahrens void changelist_remove(prop_changelist_t *, const char *); 238fa9e4066Sahrens void changelist_free(prop_changelist_t *); 2390069fd67STim Haley prop_changelist_t *changelist_gather(zfs_handle_t *, zfs_prop_t, int, int); 240da6c28aaSamw int changelist_unshare(prop_changelist_t *, zfs_share_proto_t *); 241fa9e4066Sahrens int changelist_haszonedchild(prop_changelist_t *); 242fa9e4066Sahrens 243fa9e4066Sahrens void remove_mountpoint(zfs_handle_t *); 2443cb34c60Sahrens int create_parents(libzfs_handle_t *, char *, int); 245d87468daSrm boolean_t isa_child_of(const char *dataset, const char *parent); 246fa9e4066Sahrens 24799653d4eSeschrock zfs_handle_t *make_dataset_handle(libzfs_handle_t *, const char *); 24878f17100SMatthew Ahrens zfs_handle_t *make_bookmark_handle(zfs_handle_t *, const char *, 24978f17100SMatthew Ahrens nvlist_t *props); 250ea8dc4b6Seschrock 25194de1d4cSeschrock int zpool_open_silent(libzfs_handle_t *, const char *, zpool_handle_t **); 252fa9e4066Sahrens 253e7cbe64fSgw boolean_t zpool_name_valid(libzfs_handle_t *, boolean_t, const char *); 254fa9e4066Sahrens 25599d5e173STim Haley int zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type, 25699d5e173STim Haley boolean_t modifying); 25799d5e173STim Haley 25899653d4eSeschrock void namespace_clear(libzfs_handle_t *); 259fa9e4066Sahrens 26067331909Sdougm /* 26167331909Sdougm * libshare (sharemgr) interfaces used internally. 26267331909Sdougm */ 26367331909Sdougm 26467331909Sdougm extern int zfs_init_libshare(libzfs_handle_t *, int); 265da6c28aaSamw extern int zfs_parse_options(char *, zfs_share_proto_t); 26667331909Sdougm 267743a77edSAlan Wright extern int zfs_unshare_proto(zfs_handle_t *, 268da6c28aaSamw const char *, zfs_share_proto_t *); 269069f55e2SEric Schrock 270069f55e2SEric Schrock extern void libzfs_fru_clear(libzfs_handle_t *, boolean_t); 271069f55e2SEric Schrock 272fa9e4066Sahrens #ifdef __cplusplus 273fa9e4066Sahrens } 274fa9e4066Sahrens #endif 275fa9e4066Sahrens 2764445fffbSMatthew Ahrens #endif /* _LIBZFS_IMPL_H */ 277