1c1cb2cd8Shaad /* 2c1cb2cd8Shaad * CDDL HEADER SART 3c1cb2cd8Shaad * 4c1cb2cd8Shaad * The contents of this file are subject to the terms of the 5c1cb2cd8Shaad * Common Development and Distribution License (the "License"). 6c1cb2cd8Shaad * You may not use this file except in compliance with the License. 7c1cb2cd8Shaad * 8c1cb2cd8Shaad * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9c1cb2cd8Shaad * or http://www.opensolaris.org/os/licensing. 10c1cb2cd8Shaad * See the License for the specific language governing permissions 11c1cb2cd8Shaad * and limitations under the License. 12c1cb2cd8Shaad * 13c1cb2cd8Shaad * When distributing Covered Code, include this CDDL HEADER in each 14c1cb2cd8Shaad * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15c1cb2cd8Shaad * If applicable, add the following below this CDDL HEADER, with the 16c1cb2cd8Shaad * fields enclosed by brackets "[]" replaced with your own identifying 17c1cb2cd8Shaad * information: Portions Copyright [yyyy] [name of copyright owner] 18c1cb2cd8Shaad * 19c1cb2cd8Shaad * CDDL HEADER END 20c1cb2cd8Shaad */ 21c1cb2cd8Shaad 22c1cb2cd8Shaad /* 23*3227e6cfSchs * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 24*3227e6cfSchs * Copyright (c) 2011 Pawel Jakub Dawidek. All rights reserved. 25*3227e6cfSchs * Copyright (c) 2011, 2015 by Delphix. All rights reserved. 26*3227e6cfSchs * Copyright (c) 2013 Martin Matuska <mm@FreeBSD.org>. All rights reserved. 27c1cb2cd8Shaad */ 28c1cb2cd8Shaad 29*3227e6cfSchs #ifndef _LIBZFS_IMPL_H 30*3227e6cfSchs #define _LIBZFS_IMPL_H 31c1cb2cd8Shaad 32c1cb2cd8Shaad #include <sys/fs/zfs.h> 33c1cb2cd8Shaad #include <sys/spa.h> 34c1cb2cd8Shaad #include <sys/nvpair.h> 35*3227e6cfSchs #include <sys/dmu.h> 36*3227e6cfSchs #include <sys/zfs_ioctl.h> 37c1cb2cd8Shaad 38*3227e6cfSchs #include <libshare.h> 39c1cb2cd8Shaad #include <libuutil.h> 40c1cb2cd8Shaad #include <libzfs.h> 41*3227e6cfSchs #include <libzfs_core.h> 42*3227e6cfSchs #include <libzfs_compat.h> 43f59c7639Shaad 44c1cb2cd8Shaad #ifdef __cplusplus 45c1cb2cd8Shaad extern "C" { 46c1cb2cd8Shaad #endif 47c1cb2cd8Shaad 48f59c7639Shaad typedef struct libzfs_fru { 49f59c7639Shaad char *zf_device; 50f59c7639Shaad char *zf_fru; 51f59c7639Shaad struct libzfs_fru *zf_chain; 52f59c7639Shaad struct libzfs_fru *zf_next; 53f59c7639Shaad } libzfs_fru_t; 54f59c7639Shaad 55c1cb2cd8Shaad struct libzfs_handle { 56c1cb2cd8Shaad int libzfs_error; 57c1cb2cd8Shaad int libzfs_fd; 58c1cb2cd8Shaad FILE *libzfs_mnttab; 59c1cb2cd8Shaad FILE *libzfs_sharetab; 60c1cb2cd8Shaad zpool_handle_t *libzfs_pool_handles; 61c1cb2cd8Shaad uu_avl_pool_t *libzfs_ns_avlpool; 62c1cb2cd8Shaad uu_avl_t *libzfs_ns_avl; 63c1cb2cd8Shaad uint64_t libzfs_ns_gen; 64c1cb2cd8Shaad int libzfs_desc_active; 65c1cb2cd8Shaad char libzfs_action[1024]; 66c1cb2cd8Shaad char libzfs_desc[1024]; 67c1cb2cd8Shaad int libzfs_printerr; 68*3227e6cfSchs int libzfs_storeerr; /* stuff error messages into buffer */ 69c1cb2cd8Shaad void *libzfs_sharehdl; /* libshare handle */ 70c1cb2cd8Shaad uint_t libzfs_shareflags; 71f59c7639Shaad boolean_t libzfs_mnttab_enable; 72f59c7639Shaad avl_tree_t libzfs_mnttab_cache; 73f59c7639Shaad int libzfs_pool_iter; 74f59c7639Shaad libzfs_fru_t **libzfs_fru_hash; 75f59c7639Shaad libzfs_fru_t *libzfs_fru_list; 76f59c7639Shaad char libzfs_chassis_id[256]; 77c1cb2cd8Shaad }; 78f59c7639Shaad 79c1cb2cd8Shaad #define ZFSSHARE_MISS 0x01 /* Didn't find entry in cache */ 80c1cb2cd8Shaad 81c1cb2cd8Shaad struct zfs_handle { 82c1cb2cd8Shaad libzfs_handle_t *zfs_hdl; 83c1cb2cd8Shaad zpool_handle_t *zpool_hdl; 84*3227e6cfSchs char zfs_name[ZFS_MAX_DATASET_NAME_LEN]; 85c1cb2cd8Shaad zfs_type_t zfs_type; /* type including snapshot */ 86c1cb2cd8Shaad zfs_type_t zfs_head_type; /* type excluding snapshot */ 87c1cb2cd8Shaad dmu_objset_stats_t zfs_dmustats; 88c1cb2cd8Shaad nvlist_t *zfs_props; 89c1cb2cd8Shaad nvlist_t *zfs_user_props; 90f59c7639Shaad nvlist_t *zfs_recvd_props; 91c1cb2cd8Shaad boolean_t zfs_mntcheck; 92c1cb2cd8Shaad char *zfs_mntopts; 93f59c7639Shaad uint8_t *zfs_props_table; 94c1cb2cd8Shaad }; 95c1cb2cd8Shaad 96c1cb2cd8Shaad /* 97c1cb2cd8Shaad * This is different from checking zfs_type, because it will also catch 98c1cb2cd8Shaad * snapshots of volumes. 99c1cb2cd8Shaad */ 100c1cb2cd8Shaad #define ZFS_IS_VOLUME(zhp) ((zhp)->zfs_head_type == ZFS_TYPE_VOLUME) 101c1cb2cd8Shaad 102c1cb2cd8Shaad struct zpool_handle { 103c1cb2cd8Shaad libzfs_handle_t *zpool_hdl; 104c1cb2cd8Shaad zpool_handle_t *zpool_next; 105*3227e6cfSchs char zpool_name[ZFS_MAX_DATASET_NAME_LEN]; 106c1cb2cd8Shaad int zpool_state; 107c1cb2cd8Shaad size_t zpool_config_size; 108c1cb2cd8Shaad nvlist_t *zpool_config; 109c1cb2cd8Shaad nvlist_t *zpool_old_config; 110c1cb2cd8Shaad nvlist_t *zpool_props; 111c1cb2cd8Shaad diskaddr_t zpool_start_block; 112c1cb2cd8Shaad }; 113c1cb2cd8Shaad 114c1cb2cd8Shaad typedef enum { 115c1cb2cd8Shaad PROTO_NFS = 0, 116c1cb2cd8Shaad PROTO_SMB = 1, 117c1cb2cd8Shaad PROTO_END = 2 118c1cb2cd8Shaad } zfs_share_proto_t; 119c1cb2cd8Shaad 120c1cb2cd8Shaad /* 121c1cb2cd8Shaad * The following can be used as a bitmask and any new values 122c1cb2cd8Shaad * added must preserve that capability. 123c1cb2cd8Shaad */ 124c1cb2cd8Shaad typedef enum { 125c1cb2cd8Shaad SHARED_NOT_SHARED = 0x0, 126c1cb2cd8Shaad SHARED_NFS = 0x2, 127c1cb2cd8Shaad SHARED_SMB = 0x4 128c1cb2cd8Shaad } zfs_share_type_t; 129c1cb2cd8Shaad 130c1cb2cd8Shaad int zfs_error(libzfs_handle_t *, int, const char *); 131c1cb2cd8Shaad int zfs_error_fmt(libzfs_handle_t *, int, const char *, ...); 132c1cb2cd8Shaad void zfs_error_aux(libzfs_handle_t *, const char *, ...); 133c1cb2cd8Shaad void *zfs_alloc(libzfs_handle_t *, size_t); 134c1cb2cd8Shaad void *zfs_realloc(libzfs_handle_t *, void *, size_t, size_t); 135*3227e6cfSchs char *zfs_asprintf(libzfs_handle_t *, const char *, ...); 136c1cb2cd8Shaad char *zfs_strdup(libzfs_handle_t *, const char *); 137c1cb2cd8Shaad int no_memory(libzfs_handle_t *); 138c1cb2cd8Shaad 139c1cb2cd8Shaad int zfs_standard_error(libzfs_handle_t *, int, const char *); 140c1cb2cd8Shaad int zfs_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 141c1cb2cd8Shaad int zpool_standard_error(libzfs_handle_t *, int, const char *); 142c1cb2cd8Shaad int zpool_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 143c1cb2cd8Shaad 144c1cb2cd8Shaad int get_dependents(libzfs_handle_t *, boolean_t, const char *, char ***, 145c1cb2cd8Shaad size_t *); 146*3227e6cfSchs zfs_handle_t *make_dataset_handle_zc(libzfs_handle_t *, zfs_cmd_t *); 147*3227e6cfSchs zfs_handle_t *make_dataset_simple_handle_zc(zfs_handle_t *, zfs_cmd_t *); 148c1cb2cd8Shaad 149c1cb2cd8Shaad int zprop_parse_value(libzfs_handle_t *, nvpair_t *, int, zfs_type_t, 150c1cb2cd8Shaad nvlist_t *, char **, uint64_t *, const char *); 151c1cb2cd8Shaad int zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, 152c1cb2cd8Shaad zfs_type_t type); 153c1cb2cd8Shaad 154c1cb2cd8Shaad /* 155c1cb2cd8Shaad * Use this changelist_gather() flag to force attempting mounts 156c1cb2cd8Shaad * on each change node regardless of whether or not it is currently 157c1cb2cd8Shaad * mounted. 158c1cb2cd8Shaad */ 159*3227e6cfSchs #define CL_GATHER_MOUNT_ALWAYS 0x01 160*3227e6cfSchs /* 161*3227e6cfSchs * Use this changelist_gather() flag to prevent unmounting of file systems. 162*3227e6cfSchs */ 163*3227e6cfSchs #define CL_GATHER_DONT_UNMOUNT 0x02 164c1cb2cd8Shaad 165c1cb2cd8Shaad typedef struct prop_changelist prop_changelist_t; 166c1cb2cd8Shaad 167c1cb2cd8Shaad int zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t); 168c1cb2cd8Shaad int zcmd_write_src_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 169c1cb2cd8Shaad int zcmd_write_conf_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 170c1cb2cd8Shaad int zcmd_expand_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *); 171c1cb2cd8Shaad int zcmd_read_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t **); 172c1cb2cd8Shaad void zcmd_free_nvlists(zfs_cmd_t *); 173c1cb2cd8Shaad 174c1cb2cd8Shaad int changelist_prefix(prop_changelist_t *); 175c1cb2cd8Shaad int changelist_postfix(prop_changelist_t *); 176c1cb2cd8Shaad void changelist_rename(prop_changelist_t *, const char *, const char *); 177c1cb2cd8Shaad void changelist_remove(prop_changelist_t *, const char *); 178c1cb2cd8Shaad void changelist_free(prop_changelist_t *); 179c1cb2cd8Shaad prop_changelist_t *changelist_gather(zfs_handle_t *, zfs_prop_t, int, int); 180c1cb2cd8Shaad int changelist_unshare(prop_changelist_t *, zfs_share_proto_t *); 181c1cb2cd8Shaad int changelist_haszonedchild(prop_changelist_t *); 182c1cb2cd8Shaad 183c1cb2cd8Shaad void remove_mountpoint(zfs_handle_t *); 184c1cb2cd8Shaad int create_parents(libzfs_handle_t *, char *, int); 185c1cb2cd8Shaad boolean_t isa_child_of(const char *dataset, const char *parent); 186c1cb2cd8Shaad 187c1cb2cd8Shaad zfs_handle_t *make_dataset_handle(libzfs_handle_t *, const char *); 188*3227e6cfSchs zfs_handle_t *make_bookmark_handle(zfs_handle_t *, const char *, 189*3227e6cfSchs nvlist_t *props); 190c1cb2cd8Shaad 191c1cb2cd8Shaad int zpool_open_silent(libzfs_handle_t *, const char *, zpool_handle_t **); 192c1cb2cd8Shaad 193c1cb2cd8Shaad boolean_t zpool_name_valid(libzfs_handle_t *, boolean_t, const char *); 194c1cb2cd8Shaad 195*3227e6cfSchs int zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type, 196*3227e6cfSchs boolean_t modifying); 197*3227e6cfSchs 198c1cb2cd8Shaad void namespace_clear(libzfs_handle_t *); 199c1cb2cd8Shaad 200c1cb2cd8Shaad /* 201c1cb2cd8Shaad * libshare (sharemgr) interfaces used internally. 202c1cb2cd8Shaad */ 203c1cb2cd8Shaad 204c1cb2cd8Shaad extern int zfs_init_libshare(libzfs_handle_t *, int); 205c1cb2cd8Shaad extern void zfs_uninit_libshare(libzfs_handle_t *); 206c1cb2cd8Shaad extern int zfs_parse_options(char *, zfs_share_proto_t); 207c1cb2cd8Shaad 208f59c7639Shaad extern int zfs_unshare_proto(zfs_handle_t *, 209c1cb2cd8Shaad const char *, zfs_share_proto_t *); 210f59c7639Shaad 211f59c7639Shaad extern void libzfs_fru_clear(libzfs_handle_t *, boolean_t); 212f59c7639Shaad 213c1cb2cd8Shaad #ifdef __cplusplus 214c1cb2cd8Shaad } 215c1cb2cd8Shaad #endif 216c1cb2cd8Shaad 217*3227e6cfSchs #endif /* _LIBZFS_IMPL_H */ 218