Mercurial > illumos > illumos-gate
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 |
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 } |