Current File : //usr/include/libbe.h
/*
 * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _LIBBE_H
#define	_LIBBE_H

#include <libnvpair.h>
#include <uuid/uuid.h>
#include <libzfs.h>

#ifdef __cplusplus
extern "C" {
#endif

#define	BE_ATTR_ORIG_BE_NAME			"orig_be_name"
#define	BE_ATTR_ORIG_BE_POOL			"orig_be_pool"
#define	BE_ATTR_SNAP_NAME			"snap_name"

#define	BE_ATTR_NEW_BE_NAME			"new_be_name"
#define	BE_ATTR_NEW_BE_POOL			"new_be_pool"
#define	BE_ATTR_NEW_BE_DESC			"new_be_desc"
#define	BE_ATTR_NEW_BE_NESTED_BE		"new_be_nested_be"
#define	BE_ATTR_NEW_BE_ALLOW_AUTO_NAMING	"new_be_allow_auto_naming"
#define	BE_ATTR_NEW_BE_PARENTBE			"new_be_parentbe"
#define	BE_ATTR_POLICY				"policy"
#define	BE_ATTR_ZFS_PROPERTIES			"zfs_properties"

#define	BE_ATTR_FS_NAMES			"fs_names"
#define	BE_ATTR_FS_ZFS_PROPERTIES		"fs_zfs_properties"
#define	BE_ATTR_FS_NUM				"fs_num"
#define	BE_ATTR_SHARED_FS_NAMES			"shared_fs_names"
#define	BE_ATTR_SHARED_FS_ZFS_PROPERTIES	"shared_fs_zfs_properties"
#define	BE_ATTR_SHARED_FS_NUM			"shared_fs_num"

#define	BE_ATTR_ALT_POOL			"alt_pool"
#define	BE_ATTR_MOUNTPOINT			"mountpoint"
#define	BE_ATTR_MOUNT_FLAGS			"mount_flags"
#define	BE_ATTR_UNMOUNT_FLAGS			"unmount_flags"
#define	BE_ATTR_DESTROY_FLAGS			"destroy_flags"
#define	BE_ATTR_ROOT_DS				"root_ds"
#define	BE_ATTR_UUID_STR			"uuid_str"

#define	BE_ATTR_ACTIVE				"active"
#define	BE_ATTR_ACTIVE_ON_BOOT			"active_boot"
#define	BE_ATTR_ACTIVE_UNBOOTABLE		"active_unbootable"
#define	BE_ATTR_ORPHAN				"orphan"
#define	BE_ATTR_SPACE				"space_used"
#define	BE_ATTR_DATASET				"dataset"
#define	BE_ATTR_STATUS				"status"
#define	BE_ATTR_DATE				"date"
#define	BE_ATTR_MOUNTED				"mounted"

/*
 * libbe error codes
 *
 * NOTE: there is a copy of this enum in beadm/messages.py. To keep these
 *       in sync please make sure to add any new error messages at the end
 *       of this enumeration.
 */
enum {
	BE_SUCCESS = 0,
	BE_ERR_ACCESS = 4000,	/* permission denied */
	BE_ERR_ACTIVATE_CURR,	/* Activation of current BE failed */
	BE_ERR_AUTONAME,	/* auto naming failed */
	BE_ERR_BE_NOENT,	/* No such BE */
	BE_ERR_BUSY,		/* mount busy */
	BE_ERR_CANCELED,	/* operation canceled */
	BE_ERR_CLONE,		/* BE clone failed */
	BE_ERR_COPY,		/* BE copy failed */
	BE_ERR_CREATDS,		/* dataset creation failed */
	BE_ERR_CURR_BE_NOT_FOUND,	/* Can't find current BE */
	BE_ERR_DESTROY,		/* failed to destroy BE or snapshot */
	BE_ERR_DEMOTE,		/* BE demotion failed */
	BE_ERR_DSTYPE,		/* invalid dataset type */
	BE_ERR_BE_EXISTS,	/* BE exists */
	BE_ERR_INIT,		/* be_zfs_init failed */
	BE_ERR_INTR,		/* interrupted system call */
	BE_ERR_INVAL,		/* invalid argument */
	BE_ERR_INVALPROP,	/* invalid property for dataset */
	BE_ERR_INVALMOUNTPOINT,	/* Unexpected mountpoint */
	BE_ERR_MOUNT,		/* mount failed */
	BE_ERR_MOUNTED,		/* already mounted */
	BE_ERR_NAMETOOLONG, 	/* name > BUFSIZ */
	BE_ERR_NOENT,		/* Doesn't exist */
	BE_ERR_POOL_NOENT,	/* No such pool */
	BE_ERR_NODEV,		/* No such device */
	BE_ERR_NOTMOUNTED,	/* File system not mounted */
	BE_ERR_NOMEM,		/* not enough memory */
	BE_ERR_NONINHERIT,	/* property is not inheritable for BE dataset */
	BE_ERR_NXIO,		/* No such device or address */
	BE_ERR_NOSPC,		/* No space on device */
	BE_ERR_NOTSUP,		/* Operation not supported */
	BE_ERR_OPEN,		/* open failed */
	BE_ERR_PERM,		/* Not owner */
	BE_ERR_UNAVAIL,		/* The BE is currently unavailable */
	BE_ERR_PROMOTE,		/* BE promotion failed */
	BE_ERR_ROFS,		/* read only file system */
	BE_ERR_READONLYDS,	/* read only dataset */
	BE_ERR_READONLYPROP,	/* read only property */
	BE_ERR_SS_EXISTS,	/* snapshot exists */
	BE_ERR_SS_NOENT,	/* No such snapshot */
	BE_ERR_UMOUNT,		/* unmount failed */
	BE_ERR_UMOUNT_CURR_BE,	/* Can't unmount current BE */
	BE_ERR_UMOUNT_SHARED,	/* unmount of shared File System failed */
	BE_ERR_UNKNOWN,		/* Unknown error */
	BE_ERR_ZFS,		/* ZFS returned an error */
	BE_ERR_DESTROY_CURR_BE,	/* Cannot destroy current BE */
	BE_ERR_GEN_UUID,	/* Failed to generate uuid */
	BE_ERR_PARSE_UUID,	/* Failed to parse uuid */
	BE_ERR_NO_UUID,		/* BE has no uuid */
	BE_ERR_ZONE_NO_PARENTBE,    /* Zone root dataset has no parent uuid */
	BE_ERR_ZONE_MULTIPLE_ACTIVE, /* Zone has multiple active roots */
	BE_ERR_ZONE_NO_ACTIVE_ROOT, /* Zone has no active root for this BE */
	BE_ERR_ZONE_ROOT_NOT_SLASH, /* Zone root dataset mntpt is not / */
	BE_ERR_NO_MOUNTED_ZONE,	/* Zone not mounted in alternate BE */
	BE_ERR_MOUNT_ZONEROOT,	/* Failed to mount a zone root */
	BE_ERR_UMOUNT_ZONEROOT,	/* Failed to unmount a zone root */
	BE_ERR_ZONES_UNMOUNT,	/* Unable to unmount a zone. */
	BE_ERR_FAULT,		/* Bad Address */
	BE_ERR_RENAME_ACTIVE,	/* Renaming the active BE is not supported */
	BE_ERR_DEV_BUSY,	/* Device is Busy */
	BE_ERR_ZONE_SS_EXISTS,	/* zone snapshot already exists */
	BE_ERR_PKG_VERSION,	/* Package versioning error. */
	BE_ERR_ADD_SPLASH_ICT,	/* Add_splash_image ICT failed. */
	BE_ERR_PKG,		/* Error running pkg(1M). */
	BE_ERR_BOOTFILE_INST,	/* Error installing boot files. */
	BE_ERR_EXTCMD,		/* External command error */
	BE_ERR_ZONE_NOTSUP,	/* Operation not supported for zone BE */
	BE_ERR_ZONE_MPOOL_NOTSUP, /* Operation not supported for zone BE */
	BE_ERR_ZONE_RO_NOTSUP,	/* Operation not supported in a R/O zone */
	BE_ERR_NO_MENU_ENTRY,	/* Menu entry can't be found */
	BE_ERR_NESTED_PYTHON,	/* Attempted to nest Python interpreters */
	BE_ERR_PYTHON,		/* Native Python library call failed */
	BE_ERR_PYTHON_EXCEPT,	/* Python code raised an exception */
	BE_ERR_RENAME_ACTIVE_ON_BOOT, /* Can not rename active on boot BE */
	BE_ERR_NO_RPOOLS,	/* No root pools could be found */
	BE_ERR_SURI		/* Invalid storage URI */
} be_errno_t;

/*
 * Data structures used to return the listing and information of BEs.
 */
typedef struct be_dataset_list {
	uint64_t	be_ds_space_used;
	boolean_t	be_ds_mounted;
	char		*be_dataset_name;
	time_t		be_ds_creation;	/* Date/time stamp when created */
	char		*be_ds_mntpt;
	char		*be_ds_plcy_type;	/* cleanup policy type */
	struct be_dataset_list	*be_next_dataset;
} be_dataset_list_t;

typedef struct be_snapshot_list {
	uint64_t be_snapshot_space_used;	/* bytes of disk space used */
	char	*be_snapshot_name;
	time_t	be_snapshot_creation;	/* Date/time stamp when created */
	char	*be_snapshot_type;	/* cleanup policy type */
	struct	be_snapshot_list *be_next_snapshot;
} be_snapshot_list_t;

typedef struct be_node_list {
	boolean_t be_mounted;		/* is BE currently mounted */
	boolean_t be_active_on_boot;	/* is this BE active on boot */
	boolean_t be_active;		/* is this BE active currently */
	boolean_t be_active_unbootable; /* is this BE potentially bootable */
	boolean_t be_orphan;		/* is this BE orphan */
	uint64_t be_space_used;
	char *be_node_name;
	char *be_rpool;
	char *be_root_ds;
	char *be_mntpt;
	char *be_policy_type;		/* cleanup policy type */
	char *be_uuid_str;		/* string representation of uuid */
	time_t be_node_creation;	/* Date/time stamp when created */
	struct be_dataset_list *be_node_datasets;
	uint_t be_node_num_datasets;
	struct be_snapshot_list *be_node_snapshots;
	uint_t be_node_num_snapshots;
	struct be_node_list *be_next_node;
} be_node_list_t;

/* Flags used with mounting a BE */
#define	BE_MOUNT_FLAG_NULL		0x00000000
#define	BE_MOUNT_FLAG_SHARED_FS		0x00000001
#define	BE_MOUNT_FLAG_SHARED_RW		0x00000002
#define	BE_MOUNT_FLAG_NO_ZONES		0x00000004

/* Flags used with unmounting a BE */
#define	BE_UNMOUNT_FLAG_NULL		0x00000000
#define	BE_UNMOUNT_FLAG_FORCE		0x00000001
#define	BE_UNMOUNT_FLAG_NO_ZONES	0x00000002

/* Flags used with destroying a BE */
#define	BE_DESTROY_FLAG_NULL		0x00000000
#define	BE_DESTROY_FLAG_SNAPSHOTS	0x00000001
#define	BE_DESTROY_FLAG_FORCE_UNMOUNT	0x00000002

/*
 * BE functions
 */
int be_init(nvlist_t *);
int be_destroy(nvlist_t *);
int be_copy(nvlist_t *);

int be_mount(nvlist_t *);
int be_unmount(nvlist_t *);

int be_rename(nvlist_t *);

int be_activate(nvlist_t *);

int be_create_snapshot(nvlist_t *);
int be_destroy_snapshot(nvlist_t *);
int be_rollback(nvlist_t *);
int be_check_bootable_zbe(be_node_list_t *, be_node_list_t *, boolean_t *);

/*
 * Functions for listing and getting information about existing BEs.
 */
int be_list(char *, char *, be_node_list_t **);
void be_free_list(be_node_list_t *);
int be_max_avail(char *, uint64_t *);
char *be_err_to_str(int);

/*
 * Library functions
 */
void libbe_print_errors(boolean_t);

/*
 * Consolidation Private helper function for utilities involved in fast reboot.
 */
int be_get_boot_args_and_mountpt(int, char *, size_t, char *, size_t);

/*
 * Consolidation Private helper functions for kernel zones.
 */
int be_change_kz_ref(const char *, const char *, const char *, boolean_t);

#ifdef __cplusplus
}
#endif

#endif	/* _LIBBE_H */