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