Print this page
patch zone-auto-create-be
*** 21,30 ****
--- 21,31 ----
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2014 by Delphix. All rights reserved.
+ * Copyright 2015 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
*/
/*
* System includes
*/
*** 1616,1647 ****
char *zonepath = NULL;
char *zonename = NULL;
char *zonepath_ds = NULL;
char *mp = NULL;
zoneList_t zlist = NULL;
- zoneBrandList_t *brands = NULL;
zfs_handle_t *zhp = NULL;
/* If zones are not implemented, then get out. */
if (!z_zones_are_implemented()) {
return (BE_SUCCESS);
}
- /* Get list of supported brands */
- if ((brands = be_get_supported_brandlist()) == NULL) {
- be_print_err(gettext("be_destroy_zones: "
- "no supported brands\n"));
- return (BE_SUCCESS);
- }
-
/* Get handle to BE's root dataset */
if ((zhp = zfs_open(g_zfs, be_root_ds, ZFS_TYPE_FILESYSTEM)) ==
NULL) {
be_print_err(gettext("be_destroy_zones: failed to "
"open BE root dataset (%s): %s\n"), be_root_ds,
libzfs_error_description(g_zfs));
- z_free_brand_list(brands);
return (zfs_err_to_be_err(g_zfs));
}
/*
* If the global BE is not mounted, we must mount it here to
--- 1617,1639 ----
*** 1652,1675 ****
BE_MOUNT_FLAG_NO_ZONES)) != BE_SUCCESS) {
be_print_err(gettext("be_destroy_zones: failed to "
"mount the BE (%s) for zones processing.\n"),
be_name);
ZFS_CLOSE(zhp);
- z_free_brand_list(brands);
return (ret);
}
}
ZFS_CLOSE(zhp);
z_set_zone_root(mp);
free(mp);
! /* Get list of supported zones. */
! if ((zlist = z_get_nonglobal_zone_list_by_brand(brands)) == NULL) {
! z_free_brand_list(brands);
return (BE_SUCCESS);
- }
/* Unmount the BE before destroying the zones in it. */
if (dd->force_unmount)
force_umnt = BE_UNMOUNT_FLAG_FORCE;
if ((ret = _be_unmount(be_name, force_umnt)) != BE_SUCCESS) {
--- 1644,1664 ----
BE_MOUNT_FLAG_NO_ZONES)) != BE_SUCCESS) {
be_print_err(gettext("be_destroy_zones: failed to "
"mount the BE (%s) for zones processing.\n"),
be_name);
ZFS_CLOSE(zhp);
return (ret);
}
}
ZFS_CLOSE(zhp);
z_set_zone_root(mp);
free(mp);
! /* Get list of zones. */
! if ((zlist = z_get_nonglobal_branded_zone_list()) == NULL)
return (BE_SUCCESS);
/* Unmount the BE before destroying the zones in it. */
if (dd->force_unmount)
force_umnt = BE_UNMOUNT_FLAG_FORCE;
if ((ret = _be_unmount(be_name, force_umnt)) != BE_SUCCESS) {
*** 1678,1687 ****
--- 1667,1687 ----
goto done;
}
/* Iterate through the zones and destroy them. */
for (i = 0; (zonename = z_zlist_get_zonename(zlist, i)) != NULL; i++) {
+ boolean_t auto_create;
+
+ if (z_zlist_is_zone_auto_create_be(zlist, i, &auto_create) != 0) {
+ be_print_err(gettext("be_destroy_zones: failed to get "
+ "auto-create-be brand property\n"));
+ ret = -1; // XXX
+ goto done;
+ }
+
+ if (!auto_create)
+ continue;
/* Skip zones that aren't at least installed */
if (z_zlist_get_current_state(zlist, i) < ZONE_STATE_INSTALLED)
continue;
*** 1714,1724 ****
}
free(zonepath_ds);
}
done:
- z_free_brand_list(brands);
z_free_zone_list(zlist);
return (ret);
}
--- 1714,1723 ----
*** 1906,1931 ****
be_transaction_data_t bt = { 0 };
zfs_handle_t *obe_zhp = NULL;
zfs_handle_t *nbe_zhp = NULL;
zfs_handle_t *z_zhp = NULL;
zoneList_t zlist = NULL;
- zoneBrandList_t *brands = NULL;
boolean_t mounted_here = B_FALSE;
char *snap_name = NULL;
/* If zones are not implemented, then get out. */
if (!z_zones_are_implemented()) {
return (BE_SUCCESS);
}
- /* Get list of supported brands */
- if ((brands = be_get_supported_brandlist()) == NULL) {
- be_print_err(gettext("be_copy_zones: "
- "no supported brands\n"));
- return (BE_SUCCESS);
- }
-
/* Get handle to origin BE's root dataset */
if ((obe_zhp = zfs_open(g_zfs, obe_root_ds, ZFS_TYPE_FILESYSTEM))
== NULL) {
be_print_err(gettext("be_copy_zones: failed to open "
"the origin BE root dataset (%s) for zones processing: "
--- 1905,1922 ----
*** 1969,1989 ****
mounted_here = B_TRUE;
}
z_set_zone_root(temp_mntpt);
! /* Get list of supported zones. */
! if ((zlist = z_get_nonglobal_zone_list_by_brand(brands)) == NULL) {
ret = BE_SUCCESS;
goto done;
}
for (i = 0; (zonename = z_zlist_get_zonename(zlist, i)) != NULL; i++) {
be_fs_list_data_t fld = { 0 };
char zonepath_ds[MAXPATHLEN];
char *ds = NULL;
/* Get zonepath of zone */
zonepath = z_zlist_get_zonepath(zlist, i);
/* Skip zones that aren't at least installed */
--- 1960,1990 ----
mounted_here = B_TRUE;
}
z_set_zone_root(temp_mntpt);
! /* Get list of zones. */
! if ((zlist = z_get_nonglobal_branded_zone_list()) == NULL) {
ret = BE_SUCCESS;
goto done;
}
for (i = 0; (zonename = z_zlist_get_zonename(zlist, i)) != NULL; i++) {
be_fs_list_data_t fld = { 0 };
char zonepath_ds[MAXPATHLEN];
char *ds = NULL;
+ boolean_t auto_create;
+
+ if (z_zlist_is_zone_auto_create_be(zlist, i, &auto_create) != 0) {
+ be_print_err(gettext("be_copy_zones: failed to get "
+ "auto-create-be brand property\n"));
+ ret = -1; // XXX
+ }
+
+ if (!auto_create)
+ continue;
/* Get zonepath of zone */
zonepath = z_zlist_get_zonepath(zlist, i);
/* Skip zones that aren't at least installed */
*** 2247,2258 ****
ZFS_CLOSE(z_zhp);
}
done:
free(snap_name);
- if (brands != NULL)
- z_free_brand_list(brands);
if (zlist != NULL)
z_free_zone_list(zlist);
if (mounted_here)
(void) _be_unmount(obe_name, 0);
--- 2248,2257 ----