libzfs_impl.h revision 205198
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/* 23205198Sdelphij * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24168404Spjd * Use is subject to license terms. 25168404Spjd */ 26168404Spjd 27168404Spjd#ifndef _LIBFS_IMPL_H 28168404Spjd#define _LIBFS_IMPL_H 29168404Spjd 30168404Spjd#include <sys/dmu.h> 31168404Spjd#include <sys/fs/zfs.h> 32168404Spjd#include <sys/zfs_ioctl.h> 33168404Spjd#include <sys/zfs_acl.h> 34185029Spjd#include <sys/spa.h> 35168404Spjd#include <sys/nvpair.h> 36168404Spjd 37185029Spjd#include <libshare.h> 38168404Spjd#include <libuutil.h> 39168404Spjd#include <libzfs.h> 40168404Spjd 41168404Spjd#ifdef __cplusplus 42168404Spjdextern "C" { 43168404Spjd#endif 44168404Spjd 45185029Spjd#ifdef VERIFY 46185029Spjd#undef VERIFY 47185029Spjd#endif 48185029Spjd#define VERIFY verify 49185029Spjd 50168404Spjdstruct libzfs_handle { 51168404Spjd int libzfs_error; 52168404Spjd int libzfs_fd; 53168404Spjd FILE *libzfs_mnttab; 54168404Spjd FILE *libzfs_sharetab; 55185029Spjd zpool_handle_t *libzfs_pool_handles; 56168404Spjd uu_avl_pool_t *libzfs_ns_avlpool; 57168404Spjd uu_avl_t *libzfs_ns_avl; 58168404Spjd uint64_t libzfs_ns_gen; 59168404Spjd int libzfs_desc_active; 60168404Spjd char libzfs_action[1024]; 61168404Spjd char libzfs_desc[1024]; 62185029Spjd char *libzfs_log_str; 63168404Spjd int libzfs_printerr; 64185029Spjd void *libzfs_sharehdl; /* libshare handle */ 65185029Spjd uint_t libzfs_shareflags; 66168404Spjd}; 67185029Spjd#define ZFSSHARE_MISS 0x01 /* Didn't find entry in cache */ 68168404Spjd 69168404Spjdstruct zfs_handle { 70168404Spjd libzfs_handle_t *zfs_hdl; 71185029Spjd zpool_handle_t *zpool_hdl; 72168404Spjd char zfs_name[ZFS_MAXNAMELEN]; 73168404Spjd zfs_type_t zfs_type; /* type including snapshot */ 74168404Spjd zfs_type_t zfs_head_type; /* type excluding snapshot */ 75168404Spjd dmu_objset_stats_t zfs_dmustats; 76168404Spjd nvlist_t *zfs_props; 77168404Spjd nvlist_t *zfs_user_props; 78168404Spjd boolean_t zfs_mntcheck; 79168404Spjd char *zfs_mntopts; 80205198Sdelphij uint8_t *zfs_props_table; 81168404Spjd}; 82168404Spjd 83168404Spjd/* 84168404Spjd * This is different from checking zfs_type, because it will also catch 85168404Spjd * snapshots of volumes. 86168404Spjd */ 87168404Spjd#define ZFS_IS_VOLUME(zhp) ((zhp)->zfs_head_type == ZFS_TYPE_VOLUME) 88168404Spjd 89168404Spjdstruct zpool_handle { 90168404Spjd libzfs_handle_t *zpool_hdl; 91185029Spjd zpool_handle_t *zpool_next; 92168404Spjd char zpool_name[ZPOOL_MAXNAMELEN]; 93168404Spjd int zpool_state; 94168404Spjd size_t zpool_config_size; 95168404Spjd nvlist_t *zpool_config; 96168404Spjd nvlist_t *zpool_old_config; 97168404Spjd nvlist_t *zpool_props; 98185029Spjd diskaddr_t zpool_start_block; 99168404Spjd}; 100168404Spjd 101185029Spjdtypedef enum { 102185029Spjd PROTO_NFS = 0, 103185029Spjd PROTO_SMB = 1, 104185029Spjd PROTO_END = 2 105185029Spjd} zfs_share_proto_t; 106185029Spjd 107185029Spjd/* 108185029Spjd * The following can be used as a bitmask and any new values 109185029Spjd * added must preserve that capability. 110185029Spjd */ 111185029Spjdtypedef enum { 112185029Spjd SHARED_NOT_SHARED = 0x0, 113185029Spjd SHARED_ISCSI = 0x1, 114185029Spjd SHARED_NFS = 0x2, 115185029Spjd SHARED_SMB = 0x4 116185029Spjd} zfs_share_type_t; 117185029Spjd 118168404Spjdint zfs_error(libzfs_handle_t *, int, const char *); 119168404Spjdint zfs_error_fmt(libzfs_handle_t *, int, const char *, ...); 120168404Spjdvoid zfs_error_aux(libzfs_handle_t *, const char *, ...); 121168404Spjdvoid *zfs_alloc(libzfs_handle_t *, size_t); 122168404Spjdvoid *zfs_realloc(libzfs_handle_t *, void *, size_t, size_t); 123168404Spjdchar *zfs_strdup(libzfs_handle_t *, const char *); 124168404Spjdint no_memory(libzfs_handle_t *); 125168404Spjd 126168404Spjdint zfs_standard_error(libzfs_handle_t *, int, const char *); 127168404Spjdint zfs_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 128168404Spjdint zpool_standard_error(libzfs_handle_t *, int, const char *); 129168404Spjdint zpool_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); 130168404Spjd 131168404Spjdint get_dependents(libzfs_handle_t *, boolean_t, const char *, char ***, 132168404Spjd size_t *); 133168404Spjd 134168404Spjd 135185029Spjdint zprop_parse_value(libzfs_handle_t *, nvpair_t *, int, zfs_type_t, 136185029Spjd nvlist_t *, char **, uint64_t *, const char *); 137185029Spjdint zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, 138185029Spjd zfs_type_t type); 139168404Spjd 140185029Spjd/* 141185029Spjd * Use this changelist_gather() flag to force attempting mounts 142185029Spjd * on each change node regardless of whether or not it is currently 143185029Spjd * mounted. 144185029Spjd */ 145185029Spjd#define CL_GATHER_MOUNT_ALWAYS 1 146185029Spjd 147168404Spjdtypedef struct prop_changelist prop_changelist_t; 148168404Spjd 149168404Spjdint zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t); 150185029Spjdint zcmd_write_src_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 151185029Spjdint zcmd_write_conf_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); 152168404Spjdint zcmd_expand_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *); 153168404Spjdint zcmd_read_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t **); 154168404Spjdvoid zcmd_free_nvlists(zfs_cmd_t *); 155168404Spjd 156168404Spjdint changelist_prefix(prop_changelist_t *); 157168404Spjdint changelist_postfix(prop_changelist_t *); 158168404Spjdvoid changelist_rename(prop_changelist_t *, const char *, const char *); 159185029Spjdvoid changelist_remove(prop_changelist_t *, const char *); 160168404Spjdvoid changelist_free(prop_changelist_t *); 161185029Spjdprop_changelist_t *changelist_gather(zfs_handle_t *, zfs_prop_t, int, int); 162185029Spjdint changelist_unshare(prop_changelist_t *, zfs_share_proto_t *); 163168404Spjdint changelist_haszonedchild(prop_changelist_t *); 164168404Spjd 165168404Spjdvoid remove_mountpoint(zfs_handle_t *); 166185029Spjdint create_parents(libzfs_handle_t *, char *, int); 167185029Spjdboolean_t isa_child_of(const char *dataset, const char *parent); 168168404Spjd 169168404Spjdzfs_handle_t *make_dataset_handle(libzfs_handle_t *, const char *); 170168404Spjd 171168404Spjdint zpool_open_silent(libzfs_handle_t *, const char *, zpool_handle_t **); 172168404Spjd 173168404Spjdint zvol_create_link(libzfs_handle_t *, const char *); 174168404Spjdint zvol_remove_link(libzfs_handle_t *, const char *); 175168404Spjdint zpool_iter_zvol(zpool_handle_t *, int (*)(const char *, void *), void *); 176185029Spjdboolean_t zpool_name_valid(libzfs_handle_t *, boolean_t, const char *); 177168404Spjd 178168404Spjdvoid namespace_clear(libzfs_handle_t *); 179168404Spjd 180185029Spjd/* 181185029Spjd * libshare (sharemgr) interfaces used internally. 182185029Spjd */ 183185029Spjd 184185029Spjdextern int zfs_init_libshare(libzfs_handle_t *, int); 185185029Spjdextern void zfs_uninit_libshare(libzfs_handle_t *); 186185029Spjdextern int zfs_parse_options(char *, zfs_share_proto_t); 187185029Spjd 188185029Spjdextern int zfs_unshare_proto(zfs_handle_t *zhp, 189185029Spjd const char *, zfs_share_proto_t *); 190185029Spjd 191168404Spjd#ifdef __FreeBSD__ 192185029Spjd 193168404Spjd/* 194168404Spjd * This is FreeBSD version of ioctl, because Solaris' ioctl() updates 195168404Spjd * zc_nvlist_dst_size even if an error is returned, on FreeBSD if an 196168404Spjd * error is returned zc_nvlist_dst_size won't be updated. 197168404Spjd */ 198168404Spjdstatic __inline int 199168404Spjdzcmd_ioctl(int fd, unsigned long cmd, zfs_cmd_t *zc) 200168404Spjd{ 201168404Spjd size_t oldsize; 202168404Spjd int ret; 203168404Spjd 204168404Spjd oldsize = zc->zc_nvlist_dst_size; 205168404Spjd ret = ioctl(fd, cmd, zc); 206168404Spjd if (ret == 0 && oldsize < zc->zc_nvlist_dst_size) { 207168404Spjd ret = -1; 208168404Spjd errno = ENOMEM; 209168404Spjd } 210168404Spjd 211168404Spjd return (ret); 212168404Spjd} 213168404Spjd#define ioctl(fd, cmd, zc) zcmd_ioctl((fd), (cmd), (zc)) 214168404Spjd#endif 215168404Spjd 216168404Spjd#ifdef __cplusplus 217168404Spjd} 218168404Spjd#endif 219168404Spjd 220168404Spjd#endif /* _LIBFS_IMPL_H */ 221