Print this page
*** NO COMMENTS ***

@@ -22,11 +22,11 @@
 /*
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*
- * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
  */
 
 /*
  * System includes
  */

@@ -321,10 +321,19 @@
         /* Generate string for BE's root dataset */
         be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
             sizeof (obe_root_ds));
         bt.obe_root_ds = obe_root_ds;
 
+        if (getzoneid() != GLOBAL_ZONEID) {
+                if (!be_zone_compare_uuids(bt.obe_root_ds)) {
+                        be_print_err(gettext("be_rollback: rolling back zone "
+                            "root dataset from non-active global BE is not "
+                            "supported\n"));
+                        return (BE_ERR_NOTSUP);
+                }
+        }
+
         /* Get handle to BE's root dataset */
         if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET)) == NULL) {
                 be_print_err(gettext("be_rollback: "
                     "failed to open BE root dataset (%s): %s\n"),
                     bt.obe_root_ds, libzfs_error_description(g_zfs));

@@ -427,10 +436,20 @@
 
         be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
             sizeof (root_ds));
         bt.obe_root_ds = root_ds;
 
+        if (getzoneid() != GLOBAL_ZONEID) {
+                if (!be_zone_compare_uuids(bt.obe_root_ds)) {
+                        be_print_err(gettext("be_create_snapshot: creating "
+                            "snapshot for the zone root dataset from "
+                            "non-active global BE is not "
+                            "supported\n"));
+                        return (BE_ERR_NOTSUP);
+                }
+        }
+
         /* If BE policy not specified, use the default policy */
         if (bt.policy == NULL) {
                 bt.policy = be_default_policy();
         } else {
                 /* Validate policy type */

@@ -480,32 +499,35 @@
         /*
          * If ZFS pool version supports snapshot user properties, store
          * cleanup policy there.  Otherwise don't set one - this snapshot
          * will always inherit the cleanup policy from its parent.
          */
+        if (getzoneid() == GLOBAL_ZONEID) {
         if (pool_version >= SPA_VERSION_SNAP_PROPS) {
                 if (nvlist_alloc(&ss_props, NV_UNIQUE_NAME, 0) != 0) {
-                        be_print_err(gettext("be_create_snapshot: internal "
-                            "error: out of memory\n"));
+                                be_print_err(gettext("be_create_snapshot: "
+                                    "internal error: out of memory\n"));
                         return (BE_ERR_NOMEM);
                 }
-                if (nvlist_add_string(ss_props, BE_POLICY_PROPERTY, bt.policy)
-                    != 0) {
-                        be_print_err(gettext("be_create_snapshot: internal "
-                            "error: out of memory\n"));
+                        if (nvlist_add_string(ss_props, BE_POLICY_PROPERTY,
+                            bt.policy) != 0) {
+                                be_print_err(gettext("be_create_snapshot: "
+                                    "internal error: out of memory\n"));
                         nvlist_free(ss_props);
                         return (BE_ERR_NOMEM);
                 }
         } else if (policy != NULL) {
                 /*
                  * If an explicit cleanup policy was requested
                  * by the caller and we don't support it, error out.
                  */
                 be_print_err(gettext("be_create_snapshot: cannot set "
-                    "cleanup policy: ZFS pool version is %d\n"), pool_version);
+                            "cleanup policy: ZFS pool version is %d\n"),
+                            pool_version);
                 return (BE_ERR_NOTSUP);
         }
+        }
 
         /* Create the snapshots recursively */
         if (zfs_snapshot(g_zfs, ss, B_TRUE, ss_props) != 0) {
                 if (!autoname || libzfs_errno(g_zfs) != EZFS_EXISTS) {
                         be_print_err(gettext("be_create_snapshot: "