f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * CDDL HEADER START
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse *
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * The contents of this file are subject to the terms of the
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Common Development and Distribution License (the "License").
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * You may not use this file except in compliance with the License.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse *
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * or http://www.opensolaris.org/os/licensing.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * See the License for the specific language governing permissions
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * and limitations under the License.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse *
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * When distributing Covered Code, include this CDDL HEADER in each
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * If applicable, add the following below this CDDL HEADER, with the
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * fields enclosed by brackets "[]" replaced with your own identifying
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * information: Portions Copyright [yyyy] [name of copyright owner]
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse *
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * CDDL HEADER END
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin/*
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * System includes
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <assert.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <errno.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <libintl.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <libnvpair.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <libzfs.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <stdio.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <stdlib.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <string.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <sys/mntent.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <sys/mnttab.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <sys/mount.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <sys/stat.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <sys/types.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <sys/vfstab.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <unistd.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <libbe.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse#include <libbe_priv.h>
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassetypedef struct active_zone_root_data {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse uuid_t parent_uuid;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *zoneroot_ds;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse} active_zone_root_data_t;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassetypedef struct mounted_zone_root_data {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *zone_altroot;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *zoneroot_ds;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse} mounted_zone_root_data_t;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/* Private function prototypes */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassestatic int be_find_active_zone_root_callback(zfs_handle_t *, void *);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassestatic int be_find_mounted_zone_root_callback(zfs_handle_t *, void *);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassestatic boolean_t be_zone_get_active(zfs_handle_t *);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/* ******************************************************************** */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/* Semi-Private Functions */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/* ******************************************************************** */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_make_zoneroot
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: Generate a string for a zone's zoneroot given the
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zone's zonepath.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zonepath - pointer to zonepath
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zoneroot - pointer to buffer to retrn zoneroot in.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zoneroot_size - size of zoneroot
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * None
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Semi-private (library wise use only)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassevoid
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_make_zoneroot(char *zonepath, char *zoneroot, int zoneroot_size)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse (void) snprintf(zoneroot, zoneroot_size, "%s/root", zonepath);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_find_active_zone_root
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: This function will find the active zone root of a zone for
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * a given global BE. It will iterate all of the zone roots
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * under a zonepath, find the zone roots that belong to the
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * specified global BE, and return the one that is active.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * be_zhp - zfs handle to global BE root dataset.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zonepath_ds - pointer to zone's zonepath dataset.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zoneroot_ds - pointer to a buffer to store the dataset name of
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * the zone's zoneroot that's currently active for this
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * given global BE..
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zoneroot-ds_size - size of zoneroot_ds.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * BE_SUCCESS - Success
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * be_errno_t - Failure
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Semi-private (library wide use only)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasseint
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_find_active_zone_root(zfs_handle_t *be_zhp, char *zonepath_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *zoneroot_ds, int zoneroot_ds_size)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse active_zone_root_data_t azr_data = { 0 };
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zfs_handle_t *zhp;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char zone_container_ds[MAXPATHLEN];
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse int ret = BE_SUCCESS;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get the uuid of the parent global BE */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if (getzoneid() == GLOBAL_ZONEID) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if ((ret = be_get_uuid(zfs_get_name(be_zhp),
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin &azr_data.parent_uuid)) != BE_SUCCESS) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin be_print_err(gettext("be_find_active_zone_root: failed "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "to get uuid for BE root dataset %s\n"),
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin zfs_get_name(be_zhp));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (ret);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin } else {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if ((ret = be_zone_get_parent_uuid(zfs_get_name(be_zhp),
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin &azr_data.parent_uuid)) != BE_SUCCESS) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin be_print_err(gettext("be_find_active_zone_root: failed "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "to get parentbe uuid for zone root dataset %s\n"),
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin zfs_get_name(be_zhp));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (ret);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin /* Generate string for the root container dataset for this zone. */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_make_container_ds(zonepath_ds, zone_container_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse sizeof (zone_container_ds));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get handle to this zone's root container dataset */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM))
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse == NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_find_active_zone_root: failed to "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "open zone root container dataset (%s): %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zone_container_ds, libzfs_error_description(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (zfs_err_to_be_err(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Iterate through all of this zone's BEs, looking for ones
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * that belong to the parent global BE, and finding the one
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * that is marked active.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((ret = zfs_iter_filesystems(zhp, be_find_active_zone_root_callback,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse &azr_data)) != 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_find_active_zone_root: failed to "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "find active zone root in zonepath dataset %s: %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zonepath_ds, be_err_to_str(ret));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse goto done;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (azr_data.zoneroot_ds != NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse (void) strlcpy(zoneroot_ds, azr_data.zoneroot_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zoneroot_ds_size);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse free(azr_data.zoneroot_ds);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse } else {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_find_active_zone_root: failed to "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "find active zone root in zonepath dataset %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zonepath_ds);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = BE_ERR_ZONE_NO_ACTIVE_ROOT;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassedone:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ZFS_CLOSE(zhp);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (ret);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_find_mounted_zone_root
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: This function will find the dataset mounted as the zoneroot
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * of a zone for a given mounted global BE.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zone_altroot - path of zoneroot wrt the mounted global BE.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zonepath_ds - dataset of the zone's zonepath.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zoneroot_ds - pointer to a buffer to store the dataset of
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * the zoneroot that currently mounted for this zone
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * in the mounted global BE.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zoneroot_ds_size - size of zoneroot_ds
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * BE_SUCCESS - Success
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * be_errno_t - Failure
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Semi-private (library wide use only)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasseint
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_find_mounted_zone_root(char *zone_altroot, char *zonepath_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *zoneroot_ds, int zoneroot_ds_size)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse mounted_zone_root_data_t mzr_data = { 0 };
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zfs_handle_t *zhp = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char zone_container_ds[MAXPATHLEN];
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse int ret = BE_SUCCESS;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse int zret = 0;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Generate string for the root container dataset for this zone. */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_make_container_ds(zonepath_ds, zone_container_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse sizeof (zone_container_ds));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get handle to this zone's root container dataset. */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((zhp = zfs_open(g_zfs, zone_container_ds, ZFS_TYPE_FILESYSTEM))
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse == NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_find_mounted_zone_root: failed to "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "open zone root container dataset (%s): %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zone_container_ds, libzfs_error_description(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (zfs_err_to_be_err(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse mzr_data.zone_altroot = zone_altroot;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Iterate through all of the zone's BEs, looking for the one
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * that is currently mounted at the zone altroot in the mounted
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * global BE.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((zret = zfs_iter_filesystems(zhp,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_find_mounted_zone_root_callback, &mzr_data)) == 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_find_mounted_zone_root: did not "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "find mounted zone under altroot zonepath %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zonepath_ds);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = BE_ERR_NO_MOUNTED_ZONE;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse goto done;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse } else if (zret < 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_find_mounted_zone_root: "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "zfs_iter_filesystems failed: %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse libzfs_error_description(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = zfs_err_to_be_err(g_zfs);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse goto done;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (mzr_data.zoneroot_ds != NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse (void) strlcpy(zoneroot_ds, mzr_data.zoneroot_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zoneroot_ds_size);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse free(mzr_data.zoneroot_ds);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassedone:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ZFS_CLOSE(zhp);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (ret);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_zone_supported
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: This function will determine if a zone is supported
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * based on its zonepath dataset. The zonepath dataset
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * must:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * - not be under any global BE root dataset.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * - have a root container dataset underneath it.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse *
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zonepath_ds - name of dataset of the zonepath of the
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zone to check.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * B_TRUE - zone is supported
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * B_FALSE - zone is not supported
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Semi-private (library wide use only)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasseboolean_t
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_zone_supported(char *zonepath_ds)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char zone_container_ds[MAXPATHLEN];
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse int ret = 0;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Make sure the dataset for the zonepath is not hierarchically
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * under any reserved BE root container dataset of any pool.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((ret = zpool_iter(g_zfs, be_check_be_roots_callback,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zonepath_ds)) > 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_supported: "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "zonepath dataset %s not supported\n"), zonepath_ds);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_FALSE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse } else if (ret < 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_supported: "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "zpool_iter failed: %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse libzfs_error_description(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_FALSE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Make sure the zonepath has a zone root container dataset
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * underneath it.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_make_container_ds(zonepath_ds, zone_container_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse sizeof (zone_container_ds));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (!zfs_dataset_exists(g_zfs, zone_container_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ZFS_TYPE_FILESYSTEM)) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_supported: "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "zonepath dataset (%s) does not have a zone root container "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "dataset, zone is not supported, skipping ...\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zonepath_ds);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_FALSE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_TRUE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_get_supported_brandlist
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Desciption: This functions retuns a list of supported brands in
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * a zoneBrandList_t object.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * None
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Failure - NULL if no supported brands found.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Success - pointer to zoneBrandList structure.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Semi-private (library wide use only)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn LagassezoneBrandList_t *
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_get_supported_brandlist(void)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (z_make_brand_list(BE_ZONE_SUPPORTED_BRANDS,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse BE_ZONE_SUPPORTED_BRANDS_DELIM));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_zone_get_parent_uuid
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: This function gets the parentbe property of a zone root
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * dataset, parsed it into internal uuid format, and returns
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * it in the uuid_t reference pointer passed in.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * root_ds - dataset name of a zone root dataset
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * uu - pointer to a uuid_t to return the parentbe uuid in
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * BE_SUCCESS - Success
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * be_errno_t - Failure
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Private
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasseint
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_zone_get_parent_uuid(const char *root_ds, uuid_t *uu)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zfs_handle_t *zhp = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse nvlist_t *userprops = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse nvlist_t *propname = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *uu_string = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse int ret = BE_SUCCESS;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get handle to zone root dataset */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((zhp = zfs_open(g_zfs, root_ds, ZFS_TYPE_FILESYSTEM)) == NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_get_parent_uuid: failed to "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "open zone root dataset (%s): %s\n"), root_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse libzfs_error_description(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (zfs_err_to_be_err(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get user properties for zone root dataset */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((userprops = zfs_get_user_props(zhp)) == NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_get_parent_uuid: "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "failed to get user properties for zone root "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "dataset (%s): %s\n"), root_ds,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse libzfs_error_description(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = zfs_err_to_be_err(g_zfs);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse goto done;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get UUID string from zone's root dataset user properties */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (nvlist_lookup_nvlist(userprops, BE_ZONE_PARENTBE_PROPERTY,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse &propname) != 0 || nvlist_lookup_string(propname, ZPROP_VALUE,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse &uu_string) != 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_get_parent_uuid: failed to "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "get parent uuid property from zone root dataset user "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "properties.\n"));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = BE_ERR_ZONE_NO_PARENTBE;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse goto done;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Parse the uuid string into internal format */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (uuid_parse(uu_string, *uu) != 0 || uuid_is_null(*uu)) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_get_parent_uuid: failed to "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "parse parentuuid\n"));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = BE_ERR_PARSE_UUID;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassedone:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ZFS_CLOSE(zhp);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (ret);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin/*
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Function: be_zone_set_parent_uuid
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Description: This function sets parentbe uuid into
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * a zfs user property for a root zone dataset.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Parameters:
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * root_ds - Root zone dataset of the BE to set a uuid on.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Return:
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * be_errno_t - Failure
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * BE_SUCCESS - Success
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Scope:
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Semi-private (library wide uses only)
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Ereminint
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Ereminbe_zone_set_parent_uuid(char *root_ds, uuid_t uu)
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin{
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin zfs_handle_t *zhp = NULL;
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin char uu_string[UUID_PRINTABLE_STRING_LENGTH];
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin int ret = BE_SUCCESS;
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin uuid_unparse(uu, uu_string);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin /* Get handle to the root zone dataset. */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if ((zhp = zfs_open(g_zfs, root_ds, ZFS_TYPE_FILESYSTEM)) == NULL) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin be_print_err(gettext("be_zone_set_parent_uuid: failed to "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "open root zone dataset (%s): %s\n"), root_ds,
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin libzfs_error_description(g_zfs));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (zfs_err_to_be_err(g_zfs));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin /* Set parentbe uuid property for the root zone dataset */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if (zfs_prop_set(zhp, BE_ZONE_PARENTBE_PROPERTY, uu_string) != 0) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin be_print_err(gettext("be_zone_set_parent_uuid: failed to "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "set parentbe uuid property for root zone dataset: %s\n"),
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin libzfs_error_description(g_zfs));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin ret = zfs_err_to_be_err(g_zfs);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin ZFS_CLOSE(zhp);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (ret);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin}
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin/*
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Function: be_zone_compare_uuids
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Description: This function compare the parentbe uuid of the
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * current running root zone dataset with the parentbe
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * uuid of the given root zone dataset.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Parameters:
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * root_ds - Root zone dataset of the BE to compare.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Return:
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * B_TRUE - root dataset has right parentbe uuid
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * B_FALSE - root dataset has wrong parentbe uuid
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Scope:
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Semi-private (library wide uses only)
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Ereminboolean_t
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Ereminbe_zone_compare_uuids(char *root_ds)
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin{
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin char *active_ds;
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin uuid_t parent_uuid = {0};
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin uuid_t cur_parent_uuid = {0};
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin /* Get parentbe uuid from given zone root dataset */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if ((be_zone_get_parent_uuid(root_ds,
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin &parent_uuid)) != BE_SUCCESS) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin be_print_err(gettext("be_zone_compare_uuids: failed to get "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "parentbe uuid from the given BE\n"));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (B_FALSE);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin /*
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Find current running zone root dataset and get it's parentbe
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * uuid property.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin */
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if ((active_ds = be_get_ds_from_dir("/")) != NULL) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if ((be_zone_get_parent_uuid(active_ds,
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin &cur_parent_uuid)) != BE_SUCCESS) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin be_print_err(gettext("be_zone_compare_uuids: failed "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "to get parentbe uuid from the current running zone "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "root dataset\n"));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (B_FALSE);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin } else {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin be_print_err(gettext("be_zone_compare_uuids: zone root dataset "
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin "is not mounted\n"));
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (B_FALSE);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if (uuid_compare(parent_uuid, cur_parent_uuid) != 0) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (B_FALSE);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin return (B_TRUE);
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin}
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/* ******************************************************************** */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/* Private Functions */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/* ******************************************************************** */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_find_active_zone_root_callback
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: This function is used as a callback to iterate over all of
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * a zone's root datasets, finding the one that is marked active
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * for the parent BE specified in the data passed in. The name
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * of the zone's active root dataset is returned in heap storage
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * in the active_zone_root_data_t structure passed in, so the
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * caller is responsible for freeing it.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zhp - zfs_handle_t pointer to current dataset being processed
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * data - active_zone_root_data_t pointer
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * 0 - Success
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * >0 - Failure
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Private
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassestatic int
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_find_active_zone_root_callback(zfs_handle_t *zhp, void *data)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse active_zone_root_data_t *azr_data = data;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse uuid_t parent_uuid = { 0 };
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse int iret = 0;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse int ret = 0;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((iret = be_zone_get_parent_uuid(zfs_get_name(zhp), &parent_uuid))
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse != BE_SUCCESS) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_find_active_zone_root_callback: "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "skipping zone root dataset (%s): %s\n"),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse zfs_get_name(zhp), be_err_to_str(iret));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse goto done;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (uuid_compare(azr_data->parent_uuid, parent_uuid) == 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Found a zone root dataset belonging to the right parent,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * check if its active.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (be_zone_get_active(zhp)) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Found active zone root dataset, if its already
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * set in the callback data, that means this
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * is the second one we've found. Return error.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (azr_data->zoneroot_ds != NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = BE_ERR_ZONE_MULTIPLE_ACTIVE;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse goto done;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse azr_data->zoneroot_ds = strdup(zfs_get_name(zhp));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (azr_data->zoneroot_ds == NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ret = BE_ERR_NOMEM;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassedone:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse ZFS_CLOSE(zhp);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (ret);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_find_mounted_zone_root_callback
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: This function is used as a callback to iterate over all of
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * a zone's root datasets, find the one that is currently
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * mounted for the parent BE specified in the data passed in.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * The name of the zone's mounted root dataset is returned in
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * heap storage the mounted_zone_data_t structure passed in,
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * so the caller is responsible for freeing it.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zhp - zfs_handle_t pointer to the current dataset being
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * processed
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * data - mounted_zone_data_t pointer
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * 0 - not mounted as zone's root
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * 1 - this dataset is mounted as zone's root
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Private
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassestatic int
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_find_mounted_zone_root_callback(zfs_handle_t *zhp, void *data)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse mounted_zone_root_data_t *mzr_data = data;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *mp = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (zfs_is_mounted(zhp, &mp) && mp != NULL &&
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse strcmp(mp, mzr_data->zone_altroot) == 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse mzr_data->zoneroot_ds = strdup(zfs_get_name(zhp));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse free(mp);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (1);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse free(mp);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (0);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse/*
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Function: be_zone_get_active
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Description: This function gets the active property of a zone root
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * dataset, and returns true if active property is on.
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Parameters:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * zfs - zfs_handle_t pointer to zone root dataset to check
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Returns:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * B_TRUE - zone root dataset is active
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * B_FALSE - zone root dataset is not active
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Scope:
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse * Private
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassestatic boolean_t
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagassebe_zone_get_active(zfs_handle_t *zhp)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse{
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse nvlist_t *userprops = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse nvlist_t *propname = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse char *active_str = NULL;
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get user properties for the zone root dataset */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if ((userprops = zfs_get_user_props(zhp)) == NULL) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse be_print_err(gettext("be_zone_get_active: "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "failed to get user properties for zone root "
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse "dataset (%s): %s\n"), zfs_get_name(zhp),
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse libzfs_error_description(g_zfs));
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_FALSE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse /* Get active property from the zone root dataset user properties */
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (nvlist_lookup_nvlist(userprops, BE_ZONE_ACTIVE_PROPERTY, &propname)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse != 0 || nvlist_lookup_string(propname, ZPROP_VALUE, &active_str)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse != 0) {
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_FALSE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse }
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse if (strcmp(active_str, "on") == 0)
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_TRUE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse return (B_FALSE);
f169c0eae91b2ee787cf8d6dcf8edd9159d4c9e2Glenn Lagasse}