]>
Commit | Line | Data |
---|---|---|
34dc7c2f BB |
1 | /* |
2 | * CDDL HEADER SART | |
3 | * | |
4 | * The contents of this file are subject to the terms of the | |
5 | * Common Development and Distribution License (the "License"). | |
6 | * You may not use this file except in compliance with the License. | |
7 | * | |
8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
9 | * or http://www.opensolaris.org/os/licensing. | |
10 | * See the License for the specific language governing permissions | |
11 | * and limitations under the License. | |
12 | * | |
13 | * When distributing Covered Code, include this CDDL HEADER in each | |
14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
15 | * If applicable, add the following below this CDDL HEADER, with the | |
16 | * fields enclosed by brackets "[]" replaced with your own identifying | |
17 | * information: Portions Copyright [yyyy] [name of copyright owner] | |
18 | * | |
19 | * CDDL HEADER END | |
20 | */ | |
21 | ||
22 | /* | |
572e2857 | 23 | * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
a10d50f9 | 24 | * Copyright (c) 2011, 2017 by Delphix. All rights reserved. |
50a343d8 | 25 | * Copyright (c) 2018 Datto Inc. |
34dc7c2f BB |
26 | */ |
27 | ||
6f1ffb06 MA |
28 | #ifndef _LIBZFS_IMPL_H |
29 | #define _LIBZFS_IMPL_H | |
34dc7c2f | 30 | |
34dc7c2f | 31 | #include <sys/fs/zfs.h> |
34dc7c2f BB |
32 | #include <sys/spa.h> |
33 | #include <sys/nvpair.h> | |
eca7b760 IK |
34 | #include <sys/dmu.h> |
35 | #include <sys/zfs_ioctl.h> | |
34dc7c2f BB |
36 | |
37 | #include <libuutil.h> | |
38 | #include <libzfs.h> | |
39 | #include <libshare.h> | |
6f1ffb06 | 40 | #include <libzfs_core.h> |
34dc7c2f BB |
41 | |
42 | #ifdef __cplusplus | |
43 | extern "C" { | |
44 | #endif | |
45 | ||
34dc7c2f BB |
46 | struct libzfs_handle { |
47 | int libzfs_error; | |
48 | int libzfs_fd; | |
49 | FILE *libzfs_mnttab; | |
50 | FILE *libzfs_sharetab; | |
b128c09f | 51 | zpool_handle_t *libzfs_pool_handles; |
34dc7c2f BB |
52 | uu_avl_pool_t *libzfs_ns_avlpool; |
53 | uu_avl_t *libzfs_ns_avl; | |
54 | uint64_t libzfs_ns_gen; | |
55 | int libzfs_desc_active; | |
56 | char libzfs_action[1024]; | |
57 | char libzfs_desc[1024]; | |
34dc7c2f | 58 | int libzfs_printerr; |
572e2857 | 59 | int libzfs_storeerr; /* stuff error messages into buffer */ |
34dc7c2f BB |
60 | void *libzfs_sharehdl; /* libshare handle */ |
61 | uint_t libzfs_shareflags; | |
9babb374 | 62 | boolean_t libzfs_mnttab_enable; |
a10d50f9 SR |
63 | /* |
64 | * We need a lock to handle the case where parallel mount | |
65 | * threads are populating the mnttab cache simultaneously. The | |
66 | * lock only protects the integrity of the avl tree, and does | |
67 | * not protect the contents of the mnttab entries themselves. | |
68 | */ | |
69 | pthread_mutex_t libzfs_mnttab_cache_lock; | |
fb5f0bc8 | 70 | avl_tree_t libzfs_mnttab_cache; |
428870ff | 71 | int libzfs_pool_iter; |
428870ff | 72 | char libzfs_chassis_id[256]; |
d99a0153 | 73 | boolean_t libzfs_prop_debug; |
34dc7c2f | 74 | }; |
428870ff | 75 | |
34dc7c2f BB |
76 | #define ZFSSHARE_MISS 0x01 /* Didn't find entry in cache */ |
77 | ||
78 | struct zfs_handle { | |
79 | libzfs_handle_t *zfs_hdl; | |
b128c09f | 80 | zpool_handle_t *zpool_hdl; |
eca7b760 | 81 | char zfs_name[ZFS_MAX_DATASET_NAME_LEN]; |
34dc7c2f BB |
82 | zfs_type_t zfs_type; /* type including snapshot */ |
83 | zfs_type_t zfs_head_type; /* type excluding snapshot */ | |
84 | dmu_objset_stats_t zfs_dmustats; | |
85 | nvlist_t *zfs_props; | |
86 | nvlist_t *zfs_user_props; | |
428870ff | 87 | nvlist_t *zfs_recvd_props; |
34dc7c2f BB |
88 | boolean_t zfs_mntcheck; |
89 | char *zfs_mntopts; | |
9babb374 | 90 | uint8_t *zfs_props_table; |
34dc7c2f BB |
91 | }; |
92 | ||
93 | /* | |
94 | * This is different from checking zfs_type, because it will also catch | |
95 | * snapshots of volumes. | |
96 | */ | |
97 | #define ZFS_IS_VOLUME(zhp) ((zhp)->zfs_head_type == ZFS_TYPE_VOLUME) | |
98 | ||
99 | struct zpool_handle { | |
100 | libzfs_handle_t *zpool_hdl; | |
b128c09f | 101 | zpool_handle_t *zpool_next; |
eca7b760 | 102 | char zpool_name[ZFS_MAX_DATASET_NAME_LEN]; |
34dc7c2f BB |
103 | int zpool_state; |
104 | size_t zpool_config_size; | |
105 | nvlist_t *zpool_config; | |
106 | nvlist_t *zpool_old_config; | |
107 | nvlist_t *zpool_props; | |
108 | diskaddr_t zpool_start_block; | |
109 | }; | |
110 | ||
330d06f9 | 111 | typedef enum { |
34dc7c2f BB |
112 | PROTO_NFS = 0, |
113 | PROTO_SMB = 1, | |
114 | PROTO_END = 2 | |
115 | } zfs_share_proto_t; | |
116 | ||
117 | /* | |
118 | * The following can be used as a bitmask and any new values | |
119 | * added must preserve that capability. | |
120 | */ | |
121 | typedef enum { | |
122 | SHARED_NOT_SHARED = 0x0, | |
34dc7c2f BB |
123 | SHARED_NFS = 0x2, |
124 | SHARED_SMB = 0x4 | |
125 | } zfs_share_type_t; | |
126 | ||
379ca9cf | 127 | #define CONFIG_BUF_MINSIZE 262144 |
28b40c8a | 128 | |
34dc7c2f BB |
129 | int zfs_error(libzfs_handle_t *, int, const char *); |
130 | int zfs_error_fmt(libzfs_handle_t *, int, const char *, ...); | |
131 | void zfs_error_aux(libzfs_handle_t *, const char *, ...); | |
132 | void *zfs_alloc(libzfs_handle_t *, size_t); | |
133 | void *zfs_realloc(libzfs_handle_t *, void *, size_t, size_t); | |
572e2857 | 134 | char *zfs_asprintf(libzfs_handle_t *, const char *, ...); |
34dc7c2f BB |
135 | char *zfs_strdup(libzfs_handle_t *, const char *); |
136 | int no_memory(libzfs_handle_t *); | |
137 | ||
138 | int zfs_standard_error(libzfs_handle_t *, int, const char *); | |
139 | int zfs_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); | |
140 | int zpool_standard_error(libzfs_handle_t *, int, const char *); | |
141 | int zpool_standard_error_fmt(libzfs_handle_t *, int, const char *, ...); | |
142 | ||
330d06f9 MA |
143 | zfs_handle_t *make_dataset_handle_zc(libzfs_handle_t *, zfs_cmd_t *); |
144 | zfs_handle_t *make_dataset_simple_handle_zc(zfs_handle_t *, zfs_cmd_t *); | |
34dc7c2f BB |
145 | |
146 | int zprop_parse_value(libzfs_handle_t *, nvpair_t *, int, zfs_type_t, | |
147 | nvlist_t *, char **, uint64_t *, const char *); | |
148 | int zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, | |
149 | zfs_type_t type); | |
150 | ||
b128c09f BB |
151 | /* |
152 | * Use this changelist_gather() flag to force attempting mounts | |
153 | * on each change node regardless of whether or not it is currently | |
154 | * mounted. | |
155 | */ | |
156 | #define CL_GATHER_MOUNT_ALWAYS 1 | |
50a343d8 AP |
157 | /* |
158 | * changelist_gather() flag to force it to iterate on mounted datasets only | |
159 | */ | |
160 | #define CL_GATHER_ITER_MOUNTED 2 | |
b128c09f | 161 | |
34dc7c2f BB |
162 | typedef struct prop_changelist prop_changelist_t; |
163 | ||
164 | int zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t); | |
165 | int zcmd_write_src_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); | |
166 | int zcmd_write_conf_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t *); | |
167 | int zcmd_expand_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *); | |
168 | int zcmd_read_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, nvlist_t **); | |
169 | void zcmd_free_nvlists(zfs_cmd_t *); | |
170 | ||
171 | int changelist_prefix(prop_changelist_t *); | |
172 | int changelist_postfix(prop_changelist_t *); | |
173 | void changelist_rename(prop_changelist_t *, const char *, const char *); | |
174 | void changelist_remove(prop_changelist_t *, const char *); | |
175 | void changelist_free(prop_changelist_t *); | |
b128c09f | 176 | prop_changelist_t *changelist_gather(zfs_handle_t *, zfs_prop_t, int, int); |
34dc7c2f BB |
177 | int changelist_unshare(prop_changelist_t *, zfs_share_proto_t *); |
178 | int changelist_haszonedchild(prop_changelist_t *); | |
179 | ||
180 | void remove_mountpoint(zfs_handle_t *); | |
181 | int create_parents(libzfs_handle_t *, char *, int); | |
182 | boolean_t isa_child_of(const char *dataset, const char *parent); | |
183 | ||
184 | zfs_handle_t *make_dataset_handle(libzfs_handle_t *, const char *); | |
da536844 MA |
185 | zfs_handle_t *make_bookmark_handle(zfs_handle_t *, const char *, |
186 | nvlist_t *props); | |
34dc7c2f BB |
187 | |
188 | int zpool_open_silent(libzfs_handle_t *, const char *, zpool_handle_t **); | |
189 | ||
34dc7c2f BB |
190 | boolean_t zpool_name_valid(libzfs_handle_t *, boolean_t, const char *); |
191 | ||
572e2857 BB |
192 | int zfs_validate_name(libzfs_handle_t *hdl, const char *path, int type, |
193 | boolean_t modifying); | |
194 | ||
34dc7c2f BB |
195 | void namespace_clear(libzfs_handle_t *); |
196 | ||
197 | /* | |
198 | * libshare (sharemgr) interfaces used internally. | |
199 | */ | |
200 | ||
201 | extern int zfs_init_libshare(libzfs_handle_t *, int); | |
202 | extern void zfs_uninit_libshare(libzfs_handle_t *); | |
203 | extern int zfs_parse_options(char *, zfs_share_proto_t); | |
204 | ||
9babb374 | 205 | extern int zfs_unshare_proto(zfs_handle_t *, |
34dc7c2f | 206 | const char *, zfs_share_proto_t *); |
428870ff | 207 | |
73cdcc63 MM |
208 | typedef struct { |
209 | zfs_prop_t p_prop; | |
210 | char *p_name; | |
211 | int p_share_err; | |
212 | int p_unshare_err; | |
213 | } proto_table_t; | |
214 | ||
215 | typedef struct differ_info { | |
216 | zfs_handle_t *zhp; | |
217 | char *fromsnap; | |
218 | char *frommnt; | |
219 | char *tosnap; | |
220 | char *tomnt; | |
221 | char *ds; | |
222 | char *dsmnt; | |
223 | char *tmpsnap; | |
224 | char errbuf[1024]; | |
225 | boolean_t isclone; | |
226 | boolean_t scripted; | |
227 | boolean_t classify; | |
228 | boolean_t timestamped; | |
229 | uint64_t shares; | |
230 | int zerr; | |
231 | int cleanupfd; | |
232 | int outputfd; | |
233 | int datafd; | |
234 | } differ_info_t; | |
235 | ||
236 | extern proto_table_t proto_table[PROTO_END]; | |
237 | ||
238 | extern int do_mount(const char *src, const char *mntpt, char *opts, int flags); | |
239 | extern int do_unmount(const char *mntpt, int flags); | |
240 | extern int zfs_can_user_mount(void); | |
241 | extern int zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto); | |
242 | extern int unshare_one(libzfs_handle_t *hdl, const char *name, | |
243 | const char *mountpoint, zfs_share_proto_t proto); | |
244 | extern boolean_t zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen, | |
245 | zprop_source_t *source, int flags); | |
246 | extern zfs_share_type_t is_shared_impl(libzfs_handle_t *hdl, | |
247 | const char *mountpoint, zfs_share_proto_t proto); | |
248 | extern int libzfs_load_module(void); | |
249 | extern int zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, | |
250 | const char *msg); | |
251 | extern int find_shares_object(differ_info_t *di); | |
252 | extern void libzfs_set_pipe_max(int infd); | |
253 | ||
34dc7c2f BB |
254 | #ifdef __cplusplus |
255 | } | |
256 | #endif | |
257 | ||
6f1ffb06 | 258 | #endif /* _LIBZFS_IMPL_H */ |