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