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