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