libzfs_impl.h revision 219089
1168404Spjd/* 2185029Spjd * CDDL HEADER SART 3168404Spjd * 4168404Spjd * The contents of this file are subject to the terms of the 5168404Spjd * Common Development and Distribution License (the "License"). 6168404Spjd * You may not use this file except in compliance with the License. 7168404Spjd * 8168404Spjd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9168404Spjd * or http://www.opensolaris.org/os/licensing. 10168404Spjd * See the License for the specific language governing permissions 11168404Spjd * and limitations under the License. 12168404Spjd * 13168404Spjd * When distributing Covered Code, include this CDDL HEADER in each 14168404Spjd * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15168404Spjd * If applicable, add the following below this CDDL HEADER, with the 16168404Spjd * fields enclosed by brackets "[]" replaced with your own identifying 17168404Spjd * information: Portions Copyright [yyyy] [name of copyright owner] 18168404Spjd * 19168404Spjd * CDDL HEADER END 20168404Spjd */ 21168404Spjd 22168404Spjd/* 23219089Spjd * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 24168404Spjd */ 25168404Spjd 26168404Spjd#ifndef _LIBFS_IMPL_H 27168404Spjd#define _LIBFS_IMPL_H 28168404Spjd 29168404Spjd#include <sys/dmu.h> 30168404Spjd#include <sys/fs/zfs.h> 31168404Spjd#include <sys/zfs_ioctl.h> 32185029Spjd#include <sys/spa.h> 33168404Spjd#include <sys/nvpair.h> 34168404Spjd 35185029Spjd#include <libshare.h> 36168404Spjd#include <libuutil.h> 37168404Spjd#include <libzfs.h> 38168404Spjd 39219089Spjd#include "zfs_ioctl_compat.h" 40219089Spjd 41168404Spjd#ifdef __cplusplus 42168404Spjdextern "C" { 43168404Spjd#endif 44168404Spjd 45185029Spjd#ifdef VERIFY 46185029Spjd#undef VERIFY 47185029Spjd#endif 48185029Spjd#define VERIFY verify 49185029Spjd 50219089Spjdtypedef struct libzfs_fru { 51219089Spjd char *zf_device; 52219089Spjd char *zf_fru; 53219089Spjd struct libzfs_fru *zf_chain; 54219089Spjd struct libzfs_fru *zf_next; 55219089Spjd} libzfs_fru_t; 56219089Spjd 57168404Spjdstruct libzfs_handle { 58168404Spjd int libzfs_error; 59168404Spjd int libzfs_fd; 60168404Spjd FILE *libzfs_mnttab; 61168404Spjd FILE *libzfs_sharetab; 62185029Spjd zpool_handle_t *libzfs_pool_handles; 63168404Spjd uu_avl_pool_t *libzfs_ns_avlpool; 64168404Spjd uu_avl_t *libzfs_ns_avl; 65168404Spjd uint64_t libzfs_ns_gen; 66168404Spjd int libzfs_desc_active; 67168404Spjd char libzfs_action[1024]; 68168404Spjd char libzfs_desc[1024]; 69185029Spjd char *libzfs_log_str; 70168404Spjd int libzfs_printerr; 71219089Spjd int libzfs_storeerr; /* stuff error messages into buffer */ 72185029Spjd void *libzfs_sharehdl; /* libshare handle */ 73185029Spjd uint_t libzfs_shareflags; 74209962Smm boolean_t libzfs_mnttab_enable; 75209962Smm avl_tree_t libzfs_mnttab_cache; 76219089Spjd int libzfs_pool_iter; 77219089Spjd libzfs_fru_t **libzfs_fru_hash; 78219089Spjd libzfs_fru_t *libzfs_fru_list; 79219089Spjd char libzfs_chassis_id[256]; 80168404Spjd}; 81219089Spjd 82185029Spjd#define ZFSSHARE_MISS 0x01 /* Didn't find entry in cache */ 83168404Spjd 84168404Spjdstruct zfs_handle { 85168404Spjd libzfs_handle_t *zfs_hdl; 86185029Spjd zpool_handle_t *zpool_hdl; 87168404Spjd char zfs_name[ZFS_MAXNAMELEN]; 88168404Spjd zfs_type_t zfs_type; /* type including snapshot */ 89168404Spjd zfs_type_t zfs_head_type; /* type excluding snapshot */ 90168404Spjd dmu_objset_stats_t zfs_dmustats; 91168404Spjd nvlist_t *zfs_props; 92168404Spjd nvlist_t *zfs_user_props; 93219089Spjd nvlist_t *zfs_recvd_props; 94168404Spjd boolean_t zfs_mntcheck; 95168404Spjd char *zfs_mntopts; 96205198Sdelphij uint8_t *zfs_props_table; 97168404Spjd}; 98168404Spjd 99168404Spjd/* 100168404Spjd * This is different from checking zfs_type, because it will also catch 101168404Spjd * snapshots of volumes. 102168404Spjd */ 103168404Spjd#define ZFS_IS_VOLUME(zhp) ((zhp)->zfs_head_type == ZFS_TYPE_VOLUME) 104168404Spjd 105168404Spjdstruct zpool_handle { 106168404Spjd libzfs_handle_t *zpool_hdl; 107185029Spjd zpool_handle_t *zpool_next; 108168404Spjd char zpool_name[ZPOOL_MAXNAMELEN]; 109168404Spjd int zpool_state; 110168404Spjd size_t zpool_config_size; 111168404Spjd nvlist_t *zpool_config; 112168404Spjd nvlist_t *zpool_old_config; 113168404Spjd nvlist_t *zpool_props; 114185029Spjd diskaddr_t zpool_start_block; 115168404Spjd}; 116168404Spjd 117185029Spjdtypedef enum { 118185029Spjd PROTO_NFS = 0, 119185029Spjd PROTO_SMB = 1, 120185029Spjd PROTO_END = 2 121185029Spjd} zfs_share_proto_t; 122185029Spjd 123185029Spjd/* 124185029Spjd * The following can be used as a bitmask and any new values 125185029Spjd * added must preserve that capability. 126185029Spjd */ 127185029Spjdtypedef enum { 128185029Spjd SHARED_NOT_SHARED = 0x0, 129185029Spjd SHARED_NFS = 0x2, 130185029Spjd SHARED_SMB = 0x4 131185029Spjd} zfs_share_type_t; 132185029Spjd 133168404Spjdint zfs_error(libzfs_handle_t *, int, const char *); 134168404Spjdint zfs_error_fmt(libzfs_handle_t *, int, const char *, ...); 135168404Spjdvoid zfs_error_aux(libzfs_handle_t *, const char *, ...); 136168404Spjdvoid *zfs_alloc(libzfs_handle_t *, size_t); 137168404Spjdvoid *zfs_realloc(libzfs_handle_t *, void *, size_t, size_t); 138219089Spjdchar *zfs_asprintf(libzfs_handle_t *, const char *, ...); 139168404Spjdchar *zfs_strdup(libzfs_handle_t *, const char *); 140168404Spjdint no_memory(libzfs_handle_t *); 141168404Spjd 142168404Spjdint zfs_standard_error(libzfs_handle_t *, int, const char *); 143168404Spjdint zfs_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 144168404Spjdint zpool_standard_error(libzfs_handle_t *, int, const char *); 145168404Spjdint zpool_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 146168404Spjd 147168404Spjdint get_dependents(libzfs_handle_t *, boolean_t, const char *, char ***, 148168404Spjd size_t *); 149168404Spjd 150168404Spjd 151185029Spjdint zprop_parse_value(libzfs_handle_t *, nvpair_t *, int, zfs_type_t, 152185029Spjd nvlist_t *, char **, uint64_t *, const char *); 153185029Spjdint zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, 154185029Spjd zfs_type_t type); 155168404Spjd 156185029Spjd/* 157185029Spjd * Use this changelist_gather() flag to force attempting mounts 158185029Spjd * on each change node regardless of whether or not it is currently 159185029Spjd * mounted. 160185029Spjd */ 161185029Spjd#define CL_GATHER_MOUNT_ALWAYS 1 162185029Spjd 163168404Spjdtypedef struct prop_changelist prop_changelist_t; 164168404Spjd 165168404Spjdint zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t); 166185029Spjdint zcmd_write_src_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 167185029Spjdint zcmd_write_conf_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 168168404Spjdint zcmd_expand_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *); 169168404Spjdint zcmd_read_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t **); 170168404Spjdvoid zcmd_free_nvlists(zfs_cmd_t *); 171168404Spjd 172168404Spjdint changelist_prefix(prop_changelist_t *); 173168404Spjdint changelist_postfix(prop_changelist_t *); 174168404Spjdvoid changelist_rename(prop_changelist_t *, const char *, const char *); 175185029Spjdvoid changelist_remove(prop_changelist_t *, const char *); 176168404Spjdvoid changelist_free(prop_changelist_t *); 177185029Spjdprop_changelist_t *changelist_gather(zfs_handle_t *, zfs_prop_t, int, int); 178185029Spjdint changelist_unshare(prop_changelist_t *, zfs_share_proto_t *); 179168404Spjdint changelist_haszonedchild(prop_changelist_t *); 180168404Spjd 181168404Spjdvoid remove_mountpoint(zfs_handle_t *); 182185029Spjdint create_parents(libzfs_handle_t *, char *, int); 183185029Spjdboolean_t isa_child_of(const char *dataset, const char *parent); 184168404Spjd 185168404Spjdzfs_handle_t *make_dataset_handle(libzfs_handle_t *, const char *); 186168404Spjd 187168404Spjdint zpool_open_silent(libzfs_handle_t *, const char *, zpool_handle_t **); 188168404Spjd 189185029Spjdboolean_t zpool_name_valid(libzfs_handle_t *, boolean_t, const char *); 190168404Spjd 191219089Spjdint zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type, 192219089Spjd boolean_t modifying); 193219089Spjd 194168404Spjdvoid namespace_clear(libzfs_handle_t *); 195168404Spjd 196185029Spjd/* 197185029Spjd * libshare (sharemgr) interfaces used internally. 198185029Spjd */ 199185029Spjd 200185029Spjdextern int zfs_init_libshare(libzfs_handle_t *, int); 201185029Spjdextern void zfs_uninit_libshare(libzfs_handle_t *); 202185029Spjdextern int zfs_parse_options(char *, zfs_share_proto_t); 203185029Spjd 204209962Smmextern int zfs_unshare_proto(zfs_handle_t *, 205185029Spjd const char *, zfs_share_proto_t *); 206185029Spjd 207219089Spjdextern void libzfs_fru_clear(libzfs_handle_t *, boolean_t); 208185029Spjd 209219089Spjd#ifndef sun 210219089Spjdstatic int zfs_kernel_version = 0; 211219089Spjd 212168404Spjd/* 213168404Spjd * This is FreeBSD version of ioctl, because Solaris' ioctl() updates 214168404Spjd * zc_nvlist_dst_size even if an error is returned, on FreeBSD if an 215168404Spjd * error is returned zc_nvlist_dst_size won't be updated. 216168404Spjd */ 217168404Spjdstatic __inline int 218168404Spjdzcmd_ioctl(int fd, unsigned long cmd, zfs_cmd_t *zc) 219168404Spjd{ 220219089Spjd size_t oldsize, zfs_kernel_version_size; 221219089Spjd int version, ret, cflag = ZFS_CMD_COMPAT_NONE; 222168404Spjd 223219089Spjd zfs_kernel_version_size = sizeof(zfs_kernel_version); 224219089Spjd if (zfs_kernel_version == 0) { 225219089Spjd sysctlbyname("vfs.zfs.version.spa", &zfs_kernel_version, 226219089Spjd &zfs_kernel_version_size, NULL, 0); 227219089Spjd } 228219089Spjd 229219089Spjd if (zfs_kernel_version == SPA_VERSION_15 || 230219089Spjd zfs_kernel_version == SPA_VERSION_14 || 231219089Spjd zfs_kernel_version == SPA_VERSION_13) 232219089Spjd cflag = ZFS_CMD_COMPAT_V15; 233219089Spjd 234168404Spjd oldsize = zc->zc_nvlist_dst_size; 235219089Spjd ret = zcmd_ioctl_compat(fd, cmd, zc, cflag); 236219089Spjd 237168404Spjd if (ret == 0 && oldsize < zc->zc_nvlist_dst_size) { 238168404Spjd ret = -1; 239168404Spjd errno = ENOMEM; 240168404Spjd } 241168404Spjd 242168404Spjd return (ret); 243168404Spjd} 244168404Spjd#define ioctl(fd, cmd, zc) zcmd_ioctl((fd), (cmd), (zc)) 245219089Spjd#endif /* !sun */ 246168404Spjd 247168404Spjd#ifdef __cplusplus 248168404Spjd} 249168404Spjd#endif 250168404Spjd 251168404Spjd#endif /* _LIBFS_IMPL_H */ 252