Print this page
*** NO COMMENTS ***

*** 22,32 **** /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. */ /* ! * Copyright 2011 Nexenta Systems, Inc. All rights reserved. */ /* * System includes --- 22,32 ---- /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. */ /* ! * Copyright 2013 Nexenta Systems, Inc. All rights reserved. */ /* * System includes
*** 51,60 **** --- 51,61 ---- #include <unistd.h> #include <fcntl.h> #include <deflt.h> #include <wait.h> #include <libdevinfo.h> + #include <libgen.h> #include <libbe.h> #include <libbe_priv.h> /* Private function prototypes */
*** 228,244 **** be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds, int be_root_ds_size) { struct be_defaults be_defaults; be_get_defaults(&be_defaults); ! if (be_defaults.be_deflt_rpool_container) ! (void) snprintf(be_root_ds, be_root_ds_size, "%s/%s", zpool, ! be_name); ! else ! (void) snprintf(be_root_ds, be_root_ds_size, "%s/%s/%s", zpool, ! BE_CONTAINER_DS_NAME, be_name); } /* * Function: be_make_container_ds * Description: Generate string for the BE container dataset given a pool name. --- 229,262 ---- be_make_root_ds(const char *zpool, const char *be_name, char *be_root_ds, int be_root_ds_size) { struct be_defaults be_defaults; be_get_defaults(&be_defaults); + char *root_ds = NULL; ! if (getzoneid() == GLOBAL_ZONEID) { ! if (be_defaults.be_deflt_rpool_container) { ! (void) snprintf(be_root_ds, be_root_ds_size, ! "%s/%s", zpool, be_name); ! } else { ! (void) snprintf(be_root_ds, be_root_ds_size, ! "%s/%s/%s", zpool, BE_CONTAINER_DS_NAME, be_name); ! } ! } else { ! /* ! * In non-global zone we can use path from mounted root dataset ! * to generate BE's root dataset string. ! */ ! if ((root_ds = be_get_ds_from_dir("/")) != NULL) { ! (void) snprintf(be_root_ds, be_root_ds_size, "%s/%s", ! dirname(root_ds), be_name); ! } else { ! be_print_err(gettext("be_make_root_ds: zone root " ! "dataset is not mounted\n")); ! return; ! } ! } } /* * Function: be_make_container_ds * Description: Generate string for the BE container dataset given a pool name.
*** 256,271 **** be_make_container_ds(const char *zpool, char *container_ds, int container_ds_size) { struct be_defaults be_defaults; be_get_defaults(&be_defaults); ! if (be_defaults.be_deflt_rpool_container) ! (void) snprintf(container_ds, container_ds_size, "%s", zpool); ! else ! (void) snprintf(container_ds, container_ds_size, "%s/%s", zpool, ! BE_CONTAINER_DS_NAME); } /* * Function: be_make_name_from_ds * Description: This function takes a dataset name and strips off the --- 274,303 ---- be_make_container_ds(const char *zpool, char *container_ds, int container_ds_size) { struct be_defaults be_defaults; be_get_defaults(&be_defaults); + char *root_ds = NULL; ! if (getzoneid() == GLOBAL_ZONEID) { ! if (be_defaults.be_deflt_rpool_container) { ! (void) snprintf(container_ds, container_ds_size, ! "%s", zpool); ! } else { ! (void) snprintf(container_ds, container_ds_size, ! "%s/%s", zpool, BE_CONTAINER_DS_NAME); ! } ! } else { ! if ((root_ds = be_get_ds_from_dir("/")) != NULL) { ! (void) strlcpy(container_ds, dirname(root_ds), ! container_ds_size); ! } else { ! be_print_err(gettext("be_make_container_ds: zone root " ! "dataset is not mounted\n")); ! return; ! } ! } } /* * Function: be_make_name_from_ds * Description: This function takes a dataset name and strips off the
*** 2434,2448 **** { be_transaction_data_t *bt = data; zfs_handle_t *zhp = NULL; const char *zpool = zpool_get_name(zlp); char be_container_ds[MAXPATHLEN]; /* * Generate string for BE container dataset */ ! be_make_container_ds(zpool, be_container_ds, sizeof (be_container_ds)); /* * Check if a BE container dataset exists in this pool. */ if (!zfs_dataset_exists(g_zfs, be_container_ds, ZFS_TYPE_FILESYSTEM)) { --- 2466,2494 ---- { be_transaction_data_t *bt = data; zfs_handle_t *zhp = NULL; const char *zpool = zpool_get_name(zlp); char be_container_ds[MAXPATHLEN]; + char *zpath = NULL; /* * Generate string for BE container dataset */ ! if (getzoneid() != GLOBAL_ZONEID) { ! if ((zpath = be_get_ds_from_dir("/")) != NULL) { ! (void) strlcpy(be_container_ds, dirname(zpath), ! sizeof (be_container_ds)); ! } else { ! be_print_err(gettext( ! "be_zpool_find_current_be_callback: " ! "zone root dataset is not mounted\n")); ! return (0); ! } ! } else { ! be_make_container_ds(zpool, be_container_ds, ! sizeof (be_container_ds)); ! } /* * Check if a BE container dataset exists in this pool. */ if (!zfs_dataset_exists(g_zfs, be_container_ds, ZFS_TYPE_FILESYSTEM)) {