annotate usr/src/lib/libbe/common/be_snapshot.c @ 13025:3c7681e3e323

PSARC 2010/059 SNAP BE Management 6964804 SNAP BE management into ON 6971379 libbe should capture and give useful error when installgrub or ict.py fails. 6971390 beadm does not support labeled brand zones 6971394 BEADM_ERR_BE_DOES_NOT_EXIST has an extra space 6971397 libbe error messages need internationalization 6971402 Remove be_get_last_zone_be_callback 6971409 be_create_menu returns errors from both be_errno_t and errno sets
author Glenn Lagasse <glenn.lagasse@oracle.com>
date Wed, 04 Aug 2010 12:28:19 -0700
parents
children 70ccb19abd77
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13025
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2 * CDDL HEADER START
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
3 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
7 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
10 * See the License for the specific language governing permissions
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
11 * and limitations under the License.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
12 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
18 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
19 * CDDL HEADER END
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
20 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
21
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
22 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
23 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
24 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
25
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
26 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
27 * System includes
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
28 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
29 #include <assert.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
30 #include <libintl.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
31 #include <libnvpair.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
32 #include <libzfs.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
33 #include <stdio.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
34 #include <stdlib.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
35 #include <string.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
36 #include <sys/types.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
37 #include <sys/stat.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
38 #include <unistd.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
39
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
40 #include <libbe.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
41 #include <libbe_priv.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
42
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
43 /* Private function prototypes */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
44 static int be_rollback_check_callback(zfs_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
45 static int be_rollback_callback(zfs_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
46
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
47
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
48 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
49 /* Public Functions */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
50 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
51
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
52 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
53 * Function: be_create_snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
54 * Description: Creates a recursive snapshot of all the datasets within a BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
55 * If the name of the BE to snapshot is not provided, it assumes
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
56 * we're snapshotting the currently running BE. If the snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
57 * name is not provided it creates an auto named snapshot, which
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
58 * will be returned to the caller upon success.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
59 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
60 * be_attrs - pointer to nvlist_t of attributes being passed in.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
61 * The following attributes are used by this function:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
62 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
63 * BE_ATTR_ORIG_BE_NAME *optional
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
64 * BE_ATTR_SNAP_NAME *optional
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
65 * BE_ATTR_POLICY *optional
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
66 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
67 * If the BE_ATTR_SNAP_NAME was not passed in, upon
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
68 * successful BE snapshot creation, the following
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
69 * attribute value will be returned to the caller by
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
70 * setting it in the be_attrs parameter passed in:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
71 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
72 * BE_ATTR_SNAP_NAME
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
73 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
74 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
75 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
76 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
77 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
78 * Public
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
79 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
80 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
81 be_create_snapshot(nvlist_t *be_attrs)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
82 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
83 char *be_name = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
84 char *snap_name = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
85 char *policy = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
86 boolean_t autoname = B_FALSE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
87 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
88
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
89 /* Initialize libzfs handle */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
90 if (!be_zfs_init())
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
91 return (BE_ERR_INIT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
92
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
93 /* Get original BE name if one was provided */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
94 if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
95 BE_ATTR_ORIG_BE_NAME, DATA_TYPE_STRING, &be_name, NULL) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
96 be_print_err(gettext("be_create_snapshot: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
97 "lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
98 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
99 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
100 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
101
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
102 /* Validate original BE name if one was provided */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
103 if (be_name != NULL && !be_valid_be_name(be_name)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
104 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
105 "invalid BE name %s\n"), be_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
106 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
107 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
108 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
109
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
110 /* Get snapshot name to create if one was provided */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
111 if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
112 BE_ATTR_SNAP_NAME, DATA_TYPE_STRING, &snap_name, NULL) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
113 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
114 "failed to lookup BE_ATTR_SNAP_NAME attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
115 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
116 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
117 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
118
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
119 /* Get BE policy to create this snapshot under */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
120 if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
121 BE_ATTR_POLICY, DATA_TYPE_STRING, &policy, NULL) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
122 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
123 "failed to lookup BE_ATTR_POLICY attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
124 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
125 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
126 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
127
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
128 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
129 * If no snap_name ws provided, we're going to create an
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
130 * auto named snapshot. Set flag so that we know to pass
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
131 * the auto named snapshot to the caller later.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
132 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
133 if (snap_name == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
134 autoname = B_TRUE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
135
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
136 if ((ret = _be_create_snapshot(be_name, &snap_name, policy))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
137 == BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
138 if (autoname == B_TRUE) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
139 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
140 * Set auto named snapshot name in the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
141 * nvlist passed in by the caller.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
142 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
143 if (nvlist_add_string(be_attrs, BE_ATTR_SNAP_NAME,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
144 snap_name) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
145 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
146 "failed to add auto snap name (%s) to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
147 "be_attrs\n"), snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
148 ret = BE_ERR_NOMEM;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
149 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
150 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
151 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
152
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
153 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
154
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
155 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
156 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
157
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
158 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
159 * Function: be_destroy_snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
160 * Description: Iterates through all the datasets of the BE and deletes
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
161 * the snapshots of each one with the specified name. If the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
162 * BE name is not provided, it assumes we're operating on the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
163 * currently running BE. The name of the snapshot name to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
164 * destroy must be provided.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
165 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
166 * be_attrs - pointer to nvlist_t of attributes being passed in.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
167 * The following attribute values are used by this
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
168 * function:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
169 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
170 * BE_ATTR_ORIG_BE_NAME *optional
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
171 * BE_ATTR_SNAP_NAME *required
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
172 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
173 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
174 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
175 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
176 * Public
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
177 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
178 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
179 be_destroy_snapshot(nvlist_t *be_attrs)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
180 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
181 char *be_name = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
182 char *snap_name = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
183 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
184
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
185 /* Initialize libzfs handle */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
186 if (!be_zfs_init())
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
187 return (BE_ERR_INIT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
188
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
189 /* Get original BE name if one was provided */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
190 if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
191 BE_ATTR_ORIG_BE_NAME, DATA_TYPE_STRING, &be_name, NULL) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
192 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
193 "failed to lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
194 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
195 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
196
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
197 /* Validate original BE name if one was provided */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
198 if (be_name != NULL && !be_valid_be_name(be_name)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
199 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
200 "invalid BE name %s\n"), be_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
201 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
202 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
203
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
204 /* Get snapshot name to destroy */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
205 if (nvlist_lookup_string(be_attrs, BE_ATTR_SNAP_NAME, &snap_name)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
206 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
207 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
208 "failed to lookup BE_ATTR_SNAP_NAME attribute.\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
209 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
210 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
211
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
212 ret = _be_destroy_snapshot(be_name, snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
213
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
214 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
215
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
216 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
217 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
218
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
219 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
220 * Function: be_rollback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
221 * Description: Rolls back a BE and all of its children datasets to the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
222 * named snapshot. All of the BE's datasets must have the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
223 * named snapshot for this function to succeed. If the name
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
224 * of the BE is not passed in, this function assumes we're
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
225 * operating on the currently booted live BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
226 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
227 * Note - This function does not check if the BE has any
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
228 * younger snapshots than the one we're trying to rollback to.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
229 * If it does, then those younger snapshots and their dependent
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
230 * clone file systems will get destroyed in the process of
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
231 * rolling back.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
232 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
233 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
234 * be_attrs - pointer to nvlist_t of attributes being passed in.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
235 * The following attributes are used by this function:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
236 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
237 * BE_ATTR_ORIG_BE_NAME *optional
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
238 * BE_ATTR_SNAP_NAME *required
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
239 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
240 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
241 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
242 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
243 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
244 * Public
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
245 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
246 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
247 be_rollback(nvlist_t *be_attrs)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
248 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
249 be_transaction_data_t bt = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
250 zfs_handle_t *zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
251 char obe_root_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
252 int zret = 0, ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
253
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
254 /* Initialize libzfs handle */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
255 if (!be_zfs_init())
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
256 return (BE_ERR_INIT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
257
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
258 /* Get original BE name if one was provided */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
259 if (nvlist_lookup_pairs(be_attrs, NV_FLAG_NOENTOK,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
260 BE_ATTR_ORIG_BE_NAME, DATA_TYPE_STRING, &bt.obe_name, NULL) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
261 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
262 "failed to lookup BE_ATTR_ORIG_BE_NAME attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
263 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
264 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
265
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
266 /* If original BE name not provided, use current BE */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
267 if (bt.obe_name == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
268 if ((ret = be_find_current_be(&bt)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
269 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
270 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
271 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
272 /* Validate original BE name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
273 if (!be_valid_be_name(bt.obe_name)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
274 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
275 "invalid BE name %s\n"), bt.obe_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
276 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
277 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
278 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
279
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
280 /* Get snapshot name to rollback to */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
281 if (nvlist_lookup_string(be_attrs, BE_ATTR_SNAP_NAME, &bt.obe_snap_name)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
282 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
283 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
284 "failed to lookup BE_ATTR_SNAP_NAME attribute.\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
285 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
286 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
287
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
288 /* Find which zpool obe_name lives in */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
289 if ((zret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
290 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
291 "failed to find zpool for BE (%s)\n"), bt.obe_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
292 return (BE_ERR_BE_NOENT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
293 } else if (zret < 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
294 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
295 "zpool_iter failed: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
296 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
297 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
298 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
299
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
300 /* Generate string for BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
301 be_make_root_ds(bt.obe_zpool, bt.obe_name, obe_root_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
302 sizeof (obe_root_ds));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
303 bt.obe_root_ds = obe_root_ds;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
304
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
305 /* Get handle to BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
306 if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
307 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
308 "failed to open BE root dataset (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
309 bt.obe_root_ds, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
310 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
311 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
312
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
313 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
314 * Check that snapshot name exists for this BE and all of its
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
315 * children file systems. This call will end up closing the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
316 * zfs handle passed in whether it succeeds or fails.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
317 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
318 if ((ret = be_rollback_check_callback(zhp, bt.obe_snap_name)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
319 zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
320 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
321 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
322
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
323 /* Get handle to BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
324 if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
325 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
326 "failed to open BE root dataset (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
327 bt.obe_root_ds, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
328 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
329 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
330
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
331 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
332 * Iterate through a BE's datasets and roll them all back to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
333 * the specified snapshot. This call will end up closing the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
334 * zfs handle passed in whether it succeeds or fails.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
335 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
336 if ((ret = be_rollback_callback(zhp, bt.obe_snap_name)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
337 zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
338 be_print_err(gettext("be_rollback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
339 "failed to rollback BE %s to %s\n"), bt.obe_name,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
340 bt.obe_snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
341 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
342 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
343 zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
344 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
345 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
346 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
347
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
348
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
349 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
350 /* Semi-Private Functions */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
351 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
352
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
353 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
354 * Function: _be_create_snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
355 * Description: see be_create_snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
356 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
357 * be_name - The name of the BE that we're taking a snapshot of.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
358 * snap_name - The name of the snapshot we're creating. If
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
359 * snap_name is NULL an auto generated name will be used,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
360 * and upon success, will return that name via this
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
361 * reference pointer. The caller is responsible for
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
362 * freeing the returned name.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
363 * policy - The clean-up policy type. (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
364 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
365 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
366 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
367 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
368 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
369 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
370 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
371 _be_create_snapshot(char *be_name, char **snap_name, char *policy)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
372 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
373 be_transaction_data_t bt = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
374 zfs_handle_t *zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
375 nvlist_t *ss_props = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
376 char ss[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
377 char root_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
378 int pool_version = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
379 int i = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
380 int zret = 0, ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
381 boolean_t autoname = B_FALSE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
382
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
383 /* Set parameters in bt structure */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
384 bt.obe_name = be_name;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
385 bt.obe_snap_name = *snap_name;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
386 bt.policy = policy;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
387
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
388 /* If original BE name not supplied, use current BE */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
389 if (bt.obe_name == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
390 if ((ret = be_find_current_be(&bt)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
391 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
392 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
393 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
394
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
395 /* Find which zpool obe_name lives in */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
396 if ((zret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
397 be_print_err(gettext("be_create_snapshot: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
398 "find zpool for BE (%s)\n"), bt.obe_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
399 return (BE_ERR_BE_NOENT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
400 } else if (zret < 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
401 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
402 "zpool_iter failed: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
403 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
404 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
405 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
406
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
407 be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
408 sizeof (root_ds));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
409 bt.obe_root_ds = root_ds;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
410
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
411 /* If BE policy not specified, use the default policy */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
412 if (bt.policy == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
413 bt.policy = be_default_policy();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
414 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
415 /* Validate policy type */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
416 if (!valid_be_policy(bt.policy)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
417 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
418 "invalid BE policy type (%s)\n"), bt.policy);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
419 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
420 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
421 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
422
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
423 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
424 * If snapshot name not specified, set auto name flag and
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
425 * generate auto snapshot name.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
426 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
427 if (bt.obe_snap_name == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
428 autoname = B_TRUE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
429 if ((bt.obe_snap_name = be_auto_snap_name())
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
430 == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
431 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
432 "failed to create auto snapshot name\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
433 ret = BE_ERR_AUTONAME;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
434 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
435 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
436 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
437
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
438 /* Generate the name of the snapshot to take. */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
439 (void) snprintf(ss, sizeof (ss), "%s@%s", bt.obe_root_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
440 bt.obe_snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
441
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
442 /* Get handle to BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
443 if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
444 == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
445 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
446 "failed to open BE root dataset (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
447 bt.obe_root_ds, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
448 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
449 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
450 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
451
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
452 /* Get the ZFS pool version of the pool where this dataset resides */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
453 if (zfs_spa_version(zhp, &pool_version) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
454 be_print_err(gettext("be_create_snapshot: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
455 "get ZFS pool version for %s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
456 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
457 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
458
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
459 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
460 * If ZFS pool version supports snapshot user properties, store
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
461 * cleanup policy there. Otherwise don't set one - this snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
462 * will always inherit the cleanup policy from its parent.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
463 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
464 if (pool_version >= SPA_VERSION_SNAP_PROPS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
465 if (nvlist_alloc(&ss_props, NV_UNIQUE_NAME, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
466 be_print_err(gettext("be_create_snapshot: internal "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
467 "error: out of memory\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
468 return (BE_ERR_NOMEM);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
469 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
470 if (nvlist_add_string(ss_props, BE_POLICY_PROPERTY, bt.policy)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
471 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
472 be_print_err(gettext("be_create_snapshot: internal "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
473 "error: out of memory\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
474 nvlist_free(ss_props);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
475 return (BE_ERR_NOMEM);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
476 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
477 } else if (policy != NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
478 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
479 * If an explicit cleanup policy was requested
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
480 * by the caller and we don't support it, error out.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
481 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
482 be_print_err(gettext("be_create_snapshot: cannot set "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
483 "cleanup policy: ZFS pool version is %d\n"), pool_version);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
484 return (BE_ERR_NOTSUP);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
485 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
486
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
487 /* Create the snapshots recursively */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
488 if (zfs_snapshot(g_zfs, ss, B_TRUE, ss_props) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
489 if (!autoname || libzfs_errno(g_zfs) != EZFS_EXISTS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
490 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
491 "recursive snapshot of %s failed: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
492 ss, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
493
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
494 if (libzfs_errno(g_zfs) == EZFS_EXISTS)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
495 ret = BE_ERR_SS_EXISTS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
496 else
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
497 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
498
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
499 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
500 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
501 for (i = 1; i < BE_AUTO_NAME_MAX_TRY; i++) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
502
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
503 /* Sleep 1 before retrying */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
504 (void) sleep(1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
505
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
506 /* Generate new auto snapshot name. */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
507 free(bt.obe_snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
508 if ((bt.obe_snap_name =
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
509 be_auto_snap_name()) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
510 be_print_err(gettext(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
511 "be_create_snapshot: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
512 "create auto snapshot name\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
513 ret = BE_ERR_AUTONAME;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
514 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
515 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
516
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
517 /* Generate string of the snapshot to take. */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
518 (void) snprintf(ss, sizeof (ss), "%s@%s",
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
519 bt.obe_root_ds, bt.obe_snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
520
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
521 /* Create the snapshots recursively */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
522 if (zfs_snapshot(g_zfs, ss, B_TRUE, ss_props)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
523 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
524 if (libzfs_errno(g_zfs) !=
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
525 EZFS_EXISTS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
526 be_print_err(gettext(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
527 "be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
528 "recursive snapshot of %s "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
529 "failed: %s\n"), ss,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
530 libzfs_error_description(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
531 g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
532 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
533 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
534 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
535 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
536 break;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
537 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
538 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
539
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
540 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
541 * If we exhausted the maximum number of tries,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
542 * free the auto snap name and set error.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
543 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
544 if (i == BE_AUTO_NAME_MAX_TRY) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
545 be_print_err(gettext("be_create_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
546 "failed to create unique auto snapshot "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
547 "name\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
548 free(bt.obe_snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
549 bt.obe_snap_name = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
550 ret = BE_ERR_AUTONAME;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
551 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
552 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
553 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
554
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
555 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
556 * If we succeeded in creating an auto named snapshot, store
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
557 * the name in the nvlist passed in by the caller.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
558 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
559 if (autoname && bt.obe_snap_name) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
560 *snap_name = bt.obe_snap_name;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
561 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
562
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
563 done:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
564 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
565
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
566 if (ss_props != NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
567 nvlist_free(ss_props);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
568
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
569 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
570 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
571
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
572 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
573 * Function: _be_destroy_snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
574 * Description: see be_destroy_snapshot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
575 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
576 * be_name - The name of the BE that the snapshot belongs to.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
577 * snap_name - The name of the snapshot we're destroying.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
578 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
579 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
580 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
581 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
582 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
583 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
584 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
585 _be_destroy_snapshot(char *be_name, char *snap_name)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
586 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
587 be_transaction_data_t bt = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
588 zfs_handle_t *zhp;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
589 char ss[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
590 char root_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
591 int err = BE_SUCCESS, ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
592
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
593 /* Make sure we actaully have a snapshot name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
594 if (snap_name == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
595 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
596 "invalid snapshot name\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
597 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
598 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
599
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
600 /* Set parameters in bt structure */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
601 bt.obe_name = be_name;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
602 bt.obe_snap_name = snap_name;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
603
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
604 /* If original BE name not supplied, use current BE */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
605 if (bt.obe_name == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
606 if ((err = be_find_current_be(&bt)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
607 return (err);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
608 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
609 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
610
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
611 /* Find which zpool be_name lives in */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
612 if ((ret = zpool_iter(g_zfs, be_find_zpool_callback, &bt)) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
613 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
614 "failed to find zpool for BE (%s)\n"), bt.obe_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
615 return (BE_ERR_BE_NOENT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
616 } else if (ret < 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
617 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
618 "zpool_iter failed: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
619 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
620 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
621 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
622
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
623 be_make_root_ds(bt.obe_zpool, bt.obe_name, root_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
624 sizeof (root_ds));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
625 bt.obe_root_ds = root_ds;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
626
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
627 zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_DATASET);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
628 if (zhp == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
629 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
630 * The zfs_open failed, return an error.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
631 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
632 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
633 "failed to open BE root dataset (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
634 bt.obe_root_ds, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
635 err = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
636 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
637 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
638 * Generate the name of the snapshot to take.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
639 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
640 (void) snprintf(ss, sizeof (ss), "%s@%s", bt.obe_name,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
641 bt.obe_snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
642
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
643 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
644 * destroy the snapshot.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
645 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
646 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
647 * The boolean set to B_FALSE and passed to zfs_destroy_snaps()
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
648 * tells zfs to process and destroy the snapshots now.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
649 * Otherwise the call will potentially return where the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
650 * snapshot isn't actually destroyed yet, and ZFS is waiting
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
651 * until all the references to the snapshot have been
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
652 * released before actually destroying the snapshot.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
653 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
654 if (zfs_destroy_snaps(zhp, bt.obe_snap_name, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
655 err = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
656 be_print_err(gettext("be_destroy_snapshot: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
657 "failed to destroy snapshot %s: %s\n"), ss,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
658 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
659 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
660 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
661
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
662 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
663
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
664 return (err);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
665 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
666
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
667 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
668 /* Private Functions */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
669 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
670
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
671 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
672 * Function: be_rollback_check_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
673 * Description: Callback function used to iterate through a BE's filesystems
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
674 * to check if a given snapshot name exists.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
675 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
676 * zhp - zfs_handle_t pointer to filesystem being processed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
677 * data - name of the snapshot to check for.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
678 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
679 * 0 - Success, snapshot name exists for all filesystems.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
680 * be_errno_t - Failure, snapshot name does not exist for all
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
681 * filesystems.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
682 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
683 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
684 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
685 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
686 be_rollback_check_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
687 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
688 char *snap_name = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
689 char ss[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
690 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
691
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
692 /* Generate string for this filesystem's snapshot name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
693 (void) snprintf(ss, sizeof (ss), "%s@%s", zfs_get_name(zhp), snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
694
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
695 /* Check if snapshot exists */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
696 if (!zfs_dataset_exists(g_zfs, ss, ZFS_TYPE_SNAPSHOT)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
697 be_print_err(gettext("be_rollback_check_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
698 "snapshot does not exist %s\n"), ss);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
699 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
700 return (BE_ERR_SS_NOENT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
701 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
702
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
703 /* Iterate this dataset's children and check them */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
704 if ((ret = zfs_iter_filesystems(zhp, be_rollback_check_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
705 snap_name)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
706 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
707 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
708 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
709
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
710 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
711 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
712 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
713
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
714 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
715 * Function: be_rollback_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
716 * Description: Callback function used to iterate through a BE's filesystems
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
717 * and roll them all back to the specified snapshot name.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
718 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
719 * zhp - zfs_handle_t pointer to filesystem being processed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
720 * data - name of snapshot to rollback to.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
721 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
722 * 0 - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
723 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
724 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
725 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
726 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
727 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
728 be_rollback_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
729 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
730 zfs_handle_t *zhp_snap = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
731 char *snap_name = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
732 char ss[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
733 int ret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
734
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
735 /* Generate string for this filesystem's snapshot name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
736 (void) snprintf(ss, sizeof (ss), "%s@%s", zfs_get_name(zhp), snap_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
737
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
738 /* Get handle to this filesystem's snapshot */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
739 if ((zhp_snap = zfs_open(g_zfs, ss, ZFS_TYPE_SNAPSHOT)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
740 be_print_err(gettext("be_rollback_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
741 "failed to open snapshot %s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
742 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
743 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
744 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
745 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
746 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
747
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
748 /* Rollback dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
749 if (zfs_rollback(zhp, zhp_snap, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
750 be_print_err(gettext("be_rollback_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
751 "failed to rollback BE dataset %s to snapshot %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
752 zfs_get_name(zhp), ss, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
753 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
754 ZFS_CLOSE(zhp_snap);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
755 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
756 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
757 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
758
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
759 ZFS_CLOSE(zhp_snap);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
760 /* Iterate this dataset's children and roll them back */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
761 if ((ret = zfs_iter_filesystems(zhp, be_rollback_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
762 snap_name)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
763 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
764 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
765 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
766
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
767 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
768 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
769 }