1 /*
2 * CDDL HEADER START
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 /*
23 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26 /*
27 * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
28 * Copyright 2015 Toomas Soome <tsoome@me.com>
29 * Copyright 2015 Gary Mills
30 */
31
32 #ifndef _LIBBE_H
33 #define _LIBBE_H
34
35 #include <libnvpair.h>
36 #include <uuid/uuid.h>
37 #include <libzfs.h>
38
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42
43 #define BE_ATTR_ORIG_BE_NAME "orig_be_name"
44 #define BE_ATTR_ORIG_BE_POOL "orig_be_pool"
45 #define BE_ATTR_SNAP_NAME "snap_name"
46
47 #define BE_ATTR_NEW_BE_NAME "new_be_name"
48 #define BE_ATTR_NEW_BE_POOL "new_be_pool"
49 #define BE_ATTR_NEW_BE_DESC "new_be_desc"
50 #define BE_ATTR_POLICY "policy"
51 #define BE_ATTR_ZFS_PROPERTIES "zfs_properties"
52
53 #define BE_ATTR_FS_NAMES "fs_names"
54 #define BE_ATTR_FS_NUM "fs_num"
55 #define BE_ATTR_SHARED_FS_NAMES "shared_fs_names"
56 #define BE_ATTR_SHARED_FS_NUM "shared_fs_num"
57
58 #define BE_ATTR_MOUNTPOINT "mountpoint"
59 #define BE_ATTR_MOUNT_FLAGS "mount_flags"
60 #define BE_ATTR_UNMOUNT_FLAGS "unmount_flags"
61 #define BE_ATTR_DESTROY_FLAGS "destroy_flags"
62 #define BE_ATTR_ROOT_DS "root_ds"
63 #define BE_ATTR_UUID_STR "uuid_str"
64
65 #define BE_ATTR_ACTIVE "active"
66 #define BE_ATTR_ACTIVE_ON_BOOT "active_boot"
67 #define BE_ATTR_GLOBAL_ACTIVE "global_active"
68 #define BE_ATTR_SPACE "space_used"
69 #define BE_ATTR_DATASET "dataset"
70 #define BE_ATTR_STATUS "status"
71 #define BE_ATTR_DATE "date"
72 #define BE_ATTR_MOUNTED "mounted"
73
74 /*
75 * libbe error codes
76 *
77 * NOTE: there is a copy of this enum in beadm/messages.py. To keep these
78 * in sync please make sure to add any new error messages at the end
79 * of this enumeration.
80 */
81 enum {
82 BE_SUCCESS = 0,
83 BE_ERR_ACCESS = 4000, /* permission denied */
84 BE_ERR_ACTIVATE_CURR, /* Activation of current BE failed */
85 BE_ERR_AUTONAME, /* auto naming failed */
86 BE_ERR_BE_NOENT, /* No such BE */
87 BE_ERR_BUSY, /* mount busy */
88 BE_ERR_CANCELED, /* operation canceled */
89 BE_ERR_CLONE, /* BE clone failed */
90 BE_ERR_COPY, /* BE copy failed */
91 BE_ERR_CREATDS, /* dataset creation failed */
92 BE_ERR_CURR_BE_NOT_FOUND, /* Can't find current BE */
93 BE_ERR_DESTROY, /* failed to destroy BE or snapshot */
94 BE_ERR_DEMOTE, /* BE demotion failed */
95 BE_ERR_DSTYPE, /* invalid dataset type */
96 BE_ERR_BE_EXISTS, /* BE exists */
97 BE_ERR_INIT, /* be_zfs_init failed */
98 BE_ERR_INTR, /* interupted system call */
99 BE_ERR_INVAL, /* invalid argument */
100 BE_ERR_INVALPROP, /* invalid property for dataset */
101 BE_ERR_INVALMOUNTPOINT, /* Unexpected mountpoint */
102 BE_ERR_MOUNT, /* mount failed */
103 BE_ERR_MOUNTED, /* already mounted */
104 BE_ERR_NAMETOOLONG, /* name > BUFSIZ */
105 BE_ERR_NOENT, /* Doesn't exist */
106 BE_ERR_POOL_NOENT, /* No such pool */
107 BE_ERR_NODEV, /* No such device */
108 BE_ERR_NOTMOUNTED, /* File system not mounted */
109 BE_ERR_NOMEM, /* not enough memory */
110 BE_ERR_NONINHERIT, /* property is not inheritable for BE dataset */
111 BE_ERR_NXIO, /* No such device or address */
112 BE_ERR_NOSPC, /* No space on device */
113 BE_ERR_NOTSUP, /* Operation not supported */
114 BE_ERR_OPEN, /* open failed */
115 BE_ERR_PERM, /* Not owner */
116 BE_ERR_UNAVAIL, /* The BE is currently unavailable */
117 BE_ERR_PROMOTE, /* BE promotion failed */
118 BE_ERR_ROFS, /* read only file system */
119 BE_ERR_READONLYDS, /* read only dataset */
120 BE_ERR_READONLYPROP, /* read only property */
121 BE_ERR_SS_EXISTS, /* snapshot exists */
122 BE_ERR_SS_NOENT, /* No such snapshot */
123 BE_ERR_UMOUNT, /* unmount failed */
124 BE_ERR_UMOUNT_CURR_BE, /* Can't unmount current BE */
125 BE_ERR_UMOUNT_SHARED, /* unmount of shared File System failed */
126 BE_ERR_UNKNOWN, /* Unknown error */
127 BE_ERR_ZFS, /* ZFS returned an error */
128 BE_ERR_DESTROY_CURR_BE, /* Cannot destroy current BE */
129 BE_ERR_GEN_UUID, /* Failed to generate uuid */
130 BE_ERR_PARSE_UUID, /* Failed to parse uuid */
131 BE_ERR_NO_UUID, /* BE has no uuid */
132 BE_ERR_ZONE_NO_PARENTBE, /* Zone root dataset has no parent uuid */
133 BE_ERR_ZONE_MULTIPLE_ACTIVE, /* Zone has multiple active roots */
134 BE_ERR_ZONE_NO_ACTIVE_ROOT, /* Zone has no active root for this BE */
135 BE_ERR_ZONE_ROOT_NOT_LEGACY, /* Zone root dataset mntpt is not legacy */
136 BE_ERR_NO_MOUNTED_ZONE, /* Zone not mounted in alternate BE */
137 BE_ERR_MOUNT_ZONEROOT, /* Failed to mount a zone root */
138 BE_ERR_UMOUNT_ZONEROOT, /* Failed to unmount a zone root */
139 BE_ERR_ZONES_UNMOUNT, /* Unable to unmount a zone. */
140 BE_ERR_FAULT, /* Bad Address */
141 BE_ERR_RENAME_ACTIVE, /* Renaming the active BE is not supported */
142 BE_ERR_NO_MENU, /* Missing boot menu file */
143 BE_ERR_DEV_BUSY, /* Device is Busy */
144 BE_ERR_BAD_MENU_PATH, /* Invalid path for menu.lst file */
145 BE_ERR_ZONE_SS_EXISTS, /* zone snapshot already exists */
146 BE_ERR_ADD_SPLASH_ICT, /* Add_splash_image ICT failed */
147 BE_ERR_BOOTFILE_INST, /* Error installing boot files */
148 BE_ERR_EXTCMD /* External command error */
149 } be_errno_t;
150
151 /*
152 * Data structures used to return the listing and information of BEs.
153 */
154 typedef struct be_dataset_list {
155 uint64_t be_ds_space_used;
156 boolean_t be_ds_mounted;
157 char *be_dataset_name;
158 time_t be_ds_creation; /* Date/time stamp when created */
159 char *be_ds_mntpt;
160 char *be_ds_plcy_type; /* cleanup policy type */
161 struct be_dataset_list *be_next_dataset;
162 } be_dataset_list_t;
163
164 typedef struct be_snapshot_list {
165 uint64_t be_snapshot_space_used; /* bytes of disk space used */
166 char *be_snapshot_name;
167 time_t be_snapshot_creation; /* Date/time stamp when created */
168 char *be_snapshot_type; /* cleanup policy type */
169 struct be_snapshot_list *be_next_snapshot;
170 } be_snapshot_list_t;
171
172 typedef struct be_node_list {
173 boolean_t be_mounted; /* is BE currently mounted */
174 boolean_t be_active_on_boot; /* is this BE active on boot */
175 boolean_t be_active; /* is this BE active currently */
176 boolean_t be_global_active; /* is zone's BE associated with */
177 /* an active global BE */
178 uint64_t be_space_used;
179 char *be_node_name;
180 char *be_rpool;
181 char *be_root_ds;
182 char *be_mntpt;
183 char *be_policy_type; /* cleanup policy type */
184 char *be_uuid_str; /* string representation of uuid */
185 time_t be_node_creation; /* Date/time stamp when created */
186 struct be_dataset_list *be_node_datasets;
187 uint_t be_node_num_datasets;
188 struct be_snapshot_list *be_node_snapshots;
189 uint_t be_node_num_snapshots;
190 struct be_node_list *be_next_node;
191 } be_node_list_t;
192
193 /* Flags used with mounting a BE */
194 #define BE_MOUNT_FLAG_NULL 0x00000000
195 #define BE_MOUNT_FLAG_SHARED_FS 0x00000001
196 #define BE_MOUNT_FLAG_SHARED_RW 0x00000002
197 #define BE_MOUNT_FLAG_NO_ZONES 0x00000004
198
199 /* Flags used with unmounting a BE */
200 #define BE_UNMOUNT_FLAG_NULL 0x00000000
201 #define BE_UNMOUNT_FLAG_FORCE 0x00000001
202
203 /* Flags used with destroying a BE */
204 #define BE_DESTROY_FLAG_NULL 0x00000000
205 #define BE_DESTROY_FLAG_SNAPSHOTS 0x00000001
206 #define BE_DESTROY_FLAG_FORCE_UNMOUNT 0x00000002
207
208 /* sort rules for be_sort() */
209 typedef enum {
210 BE_SORT_UNSPECIFIED = -1,
211 BE_SORT_DATE = 0,
212 BE_SORT_DATE_REV,
213 BE_SORT_NAME,
214 BE_SORT_NAME_REV,
215 BE_SORT_SPACE,
216 BE_SORT_SPACE_REV
217 } be_sort_t;
218
219 /*
220 * BE functions
221 */
222 int be_init(nvlist_t *);
223 int be_destroy(nvlist_t *);
224 int be_copy(nvlist_t *);
225
226 int be_mount(nvlist_t *);
227 int be_unmount(nvlist_t *);
228
229 int be_rename(nvlist_t *);
230
231 int be_activate(nvlist_t *);
232
233 int be_create_snapshot(nvlist_t *);
234 int be_destroy_snapshot(nvlist_t *);
235 int be_rollback(nvlist_t *);
236
237 /*
238 * Functions for listing and getting information about existing BEs.
239 */
240 int be_list(char *, be_node_list_t **);
241 void be_free_list(be_node_list_t *);
242 int be_max_avail(char *, uint64_t *);
243 char *be_err_to_str(int);
244 int be_sort(be_node_list_t **, int);
245
246 /*
247 * Library functions
248 */
249 void libbe_print_errors(boolean_t);
250
251 #ifdef __cplusplus
252 }
253 #endif
254
255 #endif /* _LIBBE_H */