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