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