1*13013Sglenn.lagasse@oracle.com /*
2*13013Sglenn.lagasse@oracle.com * CDDL HEADER START
3*13013Sglenn.lagasse@oracle.com *
4*13013Sglenn.lagasse@oracle.com * The contents of this file are subject to the terms of the
5*13013Sglenn.lagasse@oracle.com * Common Development and Distribution License (the "License").
6*13013Sglenn.lagasse@oracle.com * You may not use this file except in compliance with the License.
7*13013Sglenn.lagasse@oracle.com *
8*13013Sglenn.lagasse@oracle.com * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*13013Sglenn.lagasse@oracle.com * or http://www.opensolaris.org/os/licensing.
10*13013Sglenn.lagasse@oracle.com * See the License for the specific language governing permissions
11*13013Sglenn.lagasse@oracle.com * and limitations under the License.
12*13013Sglenn.lagasse@oracle.com *
13*13013Sglenn.lagasse@oracle.com * When distributing Covered Code, include this CDDL HEADER in each
14*13013Sglenn.lagasse@oracle.com * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*13013Sglenn.lagasse@oracle.com * If applicable, add the following below this CDDL HEADER, with the
16*13013Sglenn.lagasse@oracle.com * fields enclosed by brackets "[]" replaced with your own identifying
17*13013Sglenn.lagasse@oracle.com * information: Portions Copyright [yyyy] [name of copyright owner]
18*13013Sglenn.lagasse@oracle.com *
19*13013Sglenn.lagasse@oracle.com * CDDL HEADER END
20*13013Sglenn.lagasse@oracle.com */
21*13013Sglenn.lagasse@oracle.com
22*13013Sglenn.lagasse@oracle.com /*
23*13013Sglenn.lagasse@oracle.com * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24*13013Sglenn.lagasse@oracle.com */
25*13013Sglenn.lagasse@oracle.com
26*13013Sglenn.lagasse@oracle.com /*
27*13013Sglenn.lagasse@oracle.com * System includes
28*13013Sglenn.lagasse@oracle.com */
29*13013Sglenn.lagasse@oracle.com
30*13013Sglenn.lagasse@oracle.com #include <stdio.h>
31*13013Sglenn.lagasse@oracle.com #include <strings.h>
32*13013Sglenn.lagasse@oracle.com #include <libzfs.h>
33*13013Sglenn.lagasse@oracle.com
34*13013Sglenn.lagasse@oracle.com #include "libbe.h"
35*13013Sglenn.lagasse@oracle.com
36*13013Sglenn.lagasse@oracle.com static int be_do_create(int argc, char **argv);
37*13013Sglenn.lagasse@oracle.com static int be_do_destroy(int argc, char **argv);
38*13013Sglenn.lagasse@oracle.com static int be_do_list(int argc, char **argv);
39*13013Sglenn.lagasse@oracle.com static int be_do_mount(int argc, char **argv);
40*13013Sglenn.lagasse@oracle.com static int be_do_unmount(int argc, char **argv);
41*13013Sglenn.lagasse@oracle.com static int be_do_rename(int argc, char **argv);
42*13013Sglenn.lagasse@oracle.com static int be_do_activate(int argc, char **argv);
43*13013Sglenn.lagasse@oracle.com static int be_do_create_snapshot(int argc, char **argv);
44*13013Sglenn.lagasse@oracle.com static int be_do_destroy_snapshot(int argc, char **argv);
45*13013Sglenn.lagasse@oracle.com static int be_do_rollback(int argc, char **argv);
46*13013Sglenn.lagasse@oracle.com static void usage(void);
47*13013Sglenn.lagasse@oracle.com
48*13013Sglenn.lagasse@oracle.com typedef struct be_command {
49*13013Sglenn.lagasse@oracle.com const char *name;
50*13013Sglenn.lagasse@oracle.com int (*func)(int argc, char **argv);
51*13013Sglenn.lagasse@oracle.com } be_command_t;
52*13013Sglenn.lagasse@oracle.com
53*13013Sglenn.lagasse@oracle.com static be_command_t command_table[] = {
54*13013Sglenn.lagasse@oracle.com { "create", be_do_create },
55*13013Sglenn.lagasse@oracle.com { "destroy", be_do_destroy },
56*13013Sglenn.lagasse@oracle.com { "list", be_do_list },
57*13013Sglenn.lagasse@oracle.com { "mount", be_do_mount },
58*13013Sglenn.lagasse@oracle.com { "unmount", be_do_unmount },
59*13013Sglenn.lagasse@oracle.com { "rename", be_do_rename },
60*13013Sglenn.lagasse@oracle.com { "activate", be_do_activate },
61*13013Sglenn.lagasse@oracle.com { "create_snap", be_do_create_snapshot },
62*13013Sglenn.lagasse@oracle.com { "destroy_snap", be_do_destroy_snapshot },
63*13013Sglenn.lagasse@oracle.com };
64*13013Sglenn.lagasse@oracle.com
65*13013Sglenn.lagasse@oracle.com static int fs_num = 2;
66*13013Sglenn.lagasse@oracle.com static int shared_fs_num = 2;
67*13013Sglenn.lagasse@oracle.com static char *fs_names[2] = {"/", "/opt"};
68*13013Sglenn.lagasse@oracle.com static char *shared_fs_names[4] = {"/export", "/export/home"};
69*13013Sglenn.lagasse@oracle.com
70*13013Sglenn.lagasse@oracle.com static void
usage(void)71*13013Sglenn.lagasse@oracle.com usage(void)
72*13013Sglenn.lagasse@oracle.com {
73*13013Sglenn.lagasse@oracle.com (void) printf("usage:\n"
74*13013Sglenn.lagasse@oracle.com "\ttbeadm\n"
75*13013Sglenn.lagasse@oracle.com "\ttbeadm create [-d BE_desc] [-e nonActiveBe | -i] \n"
76*13013Sglenn.lagasse@oracle.com "\t\t[-o property=value] ... [-p zpool] [beName]\n"
77*13013Sglenn.lagasse@oracle.com "\ttbeadm destroy [-fs] beName\n"
78*13013Sglenn.lagasse@oracle.com "\ttbeadm create_snap [-p policy] beName [snapshot]\n"
79*13013Sglenn.lagasse@oracle.com "\ttbeadm destroy_snap beName snapshot\n"
80*13013Sglenn.lagasse@oracle.com "\ttbeadm list [-s] [beName]\n"
81*13013Sglenn.lagasse@oracle.com "\ttbeadm mount [-s ro|rw] beName mountpoint\n"
82*13013Sglenn.lagasse@oracle.com "\ttbeadm unmount [-f] beName\n"
83*13013Sglenn.lagasse@oracle.com "\ttbeadm rename origBeName newBeName\n"
84*13013Sglenn.lagasse@oracle.com "\ttbeadm activate beName\n"
85*13013Sglenn.lagasse@oracle.com "\ttbeadm rollback beName snapshot\n");
86*13013Sglenn.lagasse@oracle.com }
87*13013Sglenn.lagasse@oracle.com
88*13013Sglenn.lagasse@oracle.com int
main(int argc,char ** argv)89*13013Sglenn.lagasse@oracle.com main(int argc, char **argv) {
90*13013Sglenn.lagasse@oracle.com
91*13013Sglenn.lagasse@oracle.com if (argc < 2) {
92*13013Sglenn.lagasse@oracle.com usage();
93*13013Sglenn.lagasse@oracle.com return (1);
94*13013Sglenn.lagasse@oracle.com }
95*13013Sglenn.lagasse@oracle.com
96*13013Sglenn.lagasse@oracle.com /* Turn error printing on */
97*13013Sglenn.lagasse@oracle.com libbe_print_errors(B_TRUE);
98*13013Sglenn.lagasse@oracle.com
99*13013Sglenn.lagasse@oracle.com if (strcmp(argv[1], "create") == 0) {
100*13013Sglenn.lagasse@oracle.com return (be_do_create(argc - 1, argv + 1));
101*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "destroy") == 0) {
102*13013Sglenn.lagasse@oracle.com return (be_do_destroy(argc - 1, argv + 1));
103*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "list") == 0) {
104*13013Sglenn.lagasse@oracle.com return (be_do_list(argc - 1, argv + 1));
105*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "mount") == 0) {
106*13013Sglenn.lagasse@oracle.com return (be_do_mount(argc - 1, argv + 1));
107*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "unmount") == 0) {
108*13013Sglenn.lagasse@oracle.com return (be_do_unmount(argc - 1, argv + 1));
109*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "rename") == 0) {
110*13013Sglenn.lagasse@oracle.com return (be_do_rename(argc - 2, argv + 2));
111*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "activate") == 0) {
112*13013Sglenn.lagasse@oracle.com return (be_do_activate(argc - 2, argv + 2));
113*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "create_snap") == 0) {
114*13013Sglenn.lagasse@oracle.com return (be_do_create_snapshot(argc - 1, argv + 1));
115*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "destroy_snap") == 0) {
116*13013Sglenn.lagasse@oracle.com return (be_do_destroy_snapshot(argc - 2, argv + 2));
117*13013Sglenn.lagasse@oracle.com } else if (strcmp(argv[1], "rollback") == 0) {
118*13013Sglenn.lagasse@oracle.com return (be_do_rollback(argc - 2, argv + 2));
119*13013Sglenn.lagasse@oracle.com } else {
120*13013Sglenn.lagasse@oracle.com usage();
121*13013Sglenn.lagasse@oracle.com return (1);
122*13013Sglenn.lagasse@oracle.com }
123*13013Sglenn.lagasse@oracle.com
124*13013Sglenn.lagasse@oracle.com /* NOTREACHED */
125*13013Sglenn.lagasse@oracle.com }
126*13013Sglenn.lagasse@oracle.com
127*13013Sglenn.lagasse@oracle.com static int
be_do_create(int argc,char ** argv)128*13013Sglenn.lagasse@oracle.com be_do_create(int argc, char **argv)
129*13013Sglenn.lagasse@oracle.com {
130*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
131*13013Sglenn.lagasse@oracle.com char *obe_name = NULL;
132*13013Sglenn.lagasse@oracle.com char *snap_name = NULL;
133*13013Sglenn.lagasse@oracle.com char *nbe_zpool = NULL;
134*13013Sglenn.lagasse@oracle.com char *nbe_name = NULL;
135*13013Sglenn.lagasse@oracle.com char *nbe_desc = NULL;
136*13013Sglenn.lagasse@oracle.com nvlist_t *zfs_props = NULL;
137*13013Sglenn.lagasse@oracle.com char *propname = NULL;
138*13013Sglenn.lagasse@oracle.com char *propval = NULL;
139*13013Sglenn.lagasse@oracle.com char *strval = NULL;
140*13013Sglenn.lagasse@oracle.com boolean_t init = B_FALSE;
141*13013Sglenn.lagasse@oracle.com int c;
142*13013Sglenn.lagasse@oracle.com int ret = BE_SUCCESS;
143*13013Sglenn.lagasse@oracle.com
144*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&zfs_props, NV_UNIQUE_NAME, 0) != 0) {
145*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
146*13013Sglenn.lagasse@oracle.com return (1);
147*13013Sglenn.lagasse@oracle.com }
148*13013Sglenn.lagasse@oracle.com
149*13013Sglenn.lagasse@oracle.com while ((c = getopt(argc, argv, "d:e:io:p:")) != -1) {
150*13013Sglenn.lagasse@oracle.com switch (c) {
151*13013Sglenn.lagasse@oracle.com case 'd':
152*13013Sglenn.lagasse@oracle.com nbe_desc = optarg;
153*13013Sglenn.lagasse@oracle.com break;
154*13013Sglenn.lagasse@oracle.com case 'e':
155*13013Sglenn.lagasse@oracle.com obe_name = optarg;
156*13013Sglenn.lagasse@oracle.com break;
157*13013Sglenn.lagasse@oracle.com case 'i':
158*13013Sglenn.lagasse@oracle.com /* Special option to test be_init() function */
159*13013Sglenn.lagasse@oracle.com init = B_TRUE;
160*13013Sglenn.lagasse@oracle.com break;
161*13013Sglenn.lagasse@oracle.com case 'o':
162*13013Sglenn.lagasse@oracle.com if (zfs_props == NULL) {
163*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&zfs_props, NV_UNIQUE_NAME,
164*13013Sglenn.lagasse@oracle.com 0) != 0) {
165*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
166*13013Sglenn.lagasse@oracle.com return (1);
167*13013Sglenn.lagasse@oracle.com }
168*13013Sglenn.lagasse@oracle.com }
169*13013Sglenn.lagasse@oracle.com
170*13013Sglenn.lagasse@oracle.com propname = optarg;
171*13013Sglenn.lagasse@oracle.com if ((propval = strchr(propname, '=')) == NULL) {
172*13013Sglenn.lagasse@oracle.com (void) fprintf(stderr, "missing "
173*13013Sglenn.lagasse@oracle.com "'=' for -o option\n");
174*13013Sglenn.lagasse@oracle.com return (1);
175*13013Sglenn.lagasse@oracle.com }
176*13013Sglenn.lagasse@oracle.com *propval = '\0';
177*13013Sglenn.lagasse@oracle.com propval++;
178*13013Sglenn.lagasse@oracle.com if (nvlist_lookup_string(zfs_props, propname,
179*13013Sglenn.lagasse@oracle.com &strval) == 0) {
180*13013Sglenn.lagasse@oracle.com (void) fprintf(stderr, "property '%s' "
181*13013Sglenn.lagasse@oracle.com "specified multiple times\n", propname);
182*13013Sglenn.lagasse@oracle.com return (1);
183*13013Sglenn.lagasse@oracle.com }
184*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(zfs_props, propname, propval)
185*13013Sglenn.lagasse@oracle.com != 0) {
186*13013Sglenn.lagasse@oracle.com (void) fprintf(stderr, "internal "
187*13013Sglenn.lagasse@oracle.com "error: out of memory\n");
188*13013Sglenn.lagasse@oracle.com return (1);
189*13013Sglenn.lagasse@oracle.com }
190*13013Sglenn.lagasse@oracle.com break;
191*13013Sglenn.lagasse@oracle.com case 'p':
192*13013Sglenn.lagasse@oracle.com nbe_zpool = optarg;
193*13013Sglenn.lagasse@oracle.com break;
194*13013Sglenn.lagasse@oracle.com default:
195*13013Sglenn.lagasse@oracle.com usage();
196*13013Sglenn.lagasse@oracle.com return (1);
197*13013Sglenn.lagasse@oracle.com }
198*13013Sglenn.lagasse@oracle.com }
199*13013Sglenn.lagasse@oracle.com
200*13013Sglenn.lagasse@oracle.com if (init && obe_name) {
201*13013Sglenn.lagasse@oracle.com printf("ERROR: -e and -i are exclusive options\n");
202*13013Sglenn.lagasse@oracle.com usage();
203*13013Sglenn.lagasse@oracle.com return (1);
204*13013Sglenn.lagasse@oracle.com }
205*13013Sglenn.lagasse@oracle.com
206*13013Sglenn.lagasse@oracle.com argc -= optind;
207*13013Sglenn.lagasse@oracle.com argv += optind;
208*13013Sglenn.lagasse@oracle.com
209*13013Sglenn.lagasse@oracle.com if (argc == 1) {
210*13013Sglenn.lagasse@oracle.com nbe_name = argv[0];
211*13013Sglenn.lagasse@oracle.com } else if (argc > 1) {
212*13013Sglenn.lagasse@oracle.com usage();
213*13013Sglenn.lagasse@oracle.com return (1);
214*13013Sglenn.lagasse@oracle.com }
215*13013Sglenn.lagasse@oracle.com
216*13013Sglenn.lagasse@oracle.com if (obe_name) {
217*13013Sglenn.lagasse@oracle.com /*
218*13013Sglenn.lagasse@oracle.com * Check if obe_name is really a snapshot name.
219*13013Sglenn.lagasse@oracle.com * If so, split it out.
220*13013Sglenn.lagasse@oracle.com */
221*13013Sglenn.lagasse@oracle.com char *cp = NULL;
222*13013Sglenn.lagasse@oracle.com
223*13013Sglenn.lagasse@oracle.com cp = strrchr(obe_name, '@');
224*13013Sglenn.lagasse@oracle.com if (cp != NULL) {
225*13013Sglenn.lagasse@oracle.com cp[0] = '\0';
226*13013Sglenn.lagasse@oracle.com if (cp[1] != NULL && cp[1] != '\0') {
227*13013Sglenn.lagasse@oracle.com snap_name = cp+1;
228*13013Sglenn.lagasse@oracle.com }
229*13013Sglenn.lagasse@oracle.com }
230*13013Sglenn.lagasse@oracle.com }
231*13013Sglenn.lagasse@oracle.com
232*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
233*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
234*13013Sglenn.lagasse@oracle.com return (1);
235*13013Sglenn.lagasse@oracle.com }
236*13013Sglenn.lagasse@oracle.com
237*13013Sglenn.lagasse@oracle.com if (zfs_props) {
238*13013Sglenn.lagasse@oracle.com if (nvlist_add_nvlist(be_attrs, BE_ATTR_ZFS_PROPERTIES,
239*13013Sglenn.lagasse@oracle.com zfs_props) != 0) {
240*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
241*13013Sglenn.lagasse@oracle.com "BE_ATTR_ZFS_PROPERTES (%s).\n", zfs_props);
242*13013Sglenn.lagasse@oracle.com return (1);
243*13013Sglenn.lagasse@oracle.com }
244*13013Sglenn.lagasse@oracle.com }
245*13013Sglenn.lagasse@oracle.com
246*13013Sglenn.lagasse@oracle.com if (obe_name != NULL) {
247*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
248*13013Sglenn.lagasse@oracle.com != 0) {
249*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
250*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
251*13013Sglenn.lagasse@oracle.com return (1);
252*13013Sglenn.lagasse@oracle.com }
253*13013Sglenn.lagasse@oracle.com }
254*13013Sglenn.lagasse@oracle.com
255*13013Sglenn.lagasse@oracle.com if (snap_name != NULL) {
256*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_SNAP_NAME, snap_name)
257*13013Sglenn.lagasse@oracle.com != 0) {
258*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
259*13013Sglenn.lagasse@oracle.com "BE_ATTR_SNAP_NANE (%s).\n", snap_name);
260*13013Sglenn.lagasse@oracle.com return (1);
261*13013Sglenn.lagasse@oracle.com }
262*13013Sglenn.lagasse@oracle.com }
263*13013Sglenn.lagasse@oracle.com
264*13013Sglenn.lagasse@oracle.com if (nbe_zpool != NULL) {
265*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_NEW_BE_POOL, nbe_zpool)
266*13013Sglenn.lagasse@oracle.com != 0) {
267*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
268*13013Sglenn.lagasse@oracle.com "BE_ATTR_NEW_BE_POOL (%s).\n", nbe_zpool);
269*13013Sglenn.lagasse@oracle.com return (1);
270*13013Sglenn.lagasse@oracle.com }
271*13013Sglenn.lagasse@oracle.com }
272*13013Sglenn.lagasse@oracle.com
273*13013Sglenn.lagasse@oracle.com if (nbe_name) {
274*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_NEW_BE_NAME, nbe_name)
275*13013Sglenn.lagasse@oracle.com != 0) {
276*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
277*13013Sglenn.lagasse@oracle.com "BE_ATTR_NEW_BE_NAME (%s).\n", nbe_name);
278*13013Sglenn.lagasse@oracle.com return (1);
279*13013Sglenn.lagasse@oracle.com }
280*13013Sglenn.lagasse@oracle.com }
281*13013Sglenn.lagasse@oracle.com
282*13013Sglenn.lagasse@oracle.com if (nbe_desc) {
283*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_NEW_BE_DESC, nbe_desc)
284*13013Sglenn.lagasse@oracle.com != 0) {
285*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
286*13013Sglenn.lagasse@oracle.com "BE_ATTR_NEW_BE_DESC (%s)\n", nbe_desc);
287*13013Sglenn.lagasse@oracle.com return (1);
288*13013Sglenn.lagasse@oracle.com }
289*13013Sglenn.lagasse@oracle.com }
290*13013Sglenn.lagasse@oracle.com
291*13013Sglenn.lagasse@oracle.com if (init) {
292*13013Sglenn.lagasse@oracle.com /*
293*13013Sglenn.lagasse@oracle.com * Add the default file system test values to test
294*13013Sglenn.lagasse@oracle.com * creating an initial BE.
295*13013Sglenn.lagasse@oracle.com */
296*13013Sglenn.lagasse@oracle.com if (nvlist_add_uint16(be_attrs, BE_ATTR_FS_NUM, fs_num) != 0) {
297*13013Sglenn.lagasse@oracle.com printf("nvlist_add_uint16 failed for BE_ATTR_FS_NUM "
298*13013Sglenn.lagasse@oracle.com "(%d).\n", fs_num);
299*13013Sglenn.lagasse@oracle.com return (1);
300*13013Sglenn.lagasse@oracle.com }
301*13013Sglenn.lagasse@oracle.com
302*13013Sglenn.lagasse@oracle.com if (nvlist_add_string_array(be_attrs, BE_ATTR_FS_NAMES,
303*13013Sglenn.lagasse@oracle.com fs_names, fs_num) != 0) {
304*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string_array failed for "
305*13013Sglenn.lagasse@oracle.com "BE_ATTR_FS_NAMES\n");
306*13013Sglenn.lagasse@oracle.com return (1);
307*13013Sglenn.lagasse@oracle.com }
308*13013Sglenn.lagasse@oracle.com
309*13013Sglenn.lagasse@oracle.com if (nvlist_add_uint16(be_attrs, BE_ATTR_SHARED_FS_NUM,
310*13013Sglenn.lagasse@oracle.com shared_fs_num) != 0) {
311*13013Sglenn.lagasse@oracle.com printf("nvlist_add_uint16 failed for "
312*13013Sglenn.lagasse@oracle.com "BE_ATTR_SHARED_FS_NUM (%d).\n", shared_fs_num);
313*13013Sglenn.lagasse@oracle.com return (1);
314*13013Sglenn.lagasse@oracle.com }
315*13013Sglenn.lagasse@oracle.com
316*13013Sglenn.lagasse@oracle.com if (nvlist_add_string_array(be_attrs, BE_ATTR_SHARED_FS_NAMES,
317*13013Sglenn.lagasse@oracle.com shared_fs_names, shared_fs_num) != 0) {
318*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string_array failed for "
319*13013Sglenn.lagasse@oracle.com "BE_ATTR_SHARED_FS_NAMES\n");
320*13013Sglenn.lagasse@oracle.com return (1);
321*13013Sglenn.lagasse@oracle.com }
322*13013Sglenn.lagasse@oracle.com
323*13013Sglenn.lagasse@oracle.com return (be_init(be_attrs));
324*13013Sglenn.lagasse@oracle.com }
325*13013Sglenn.lagasse@oracle.com
326*13013Sglenn.lagasse@oracle.com ret = be_copy(be_attrs);
327*13013Sglenn.lagasse@oracle.com
328*13013Sglenn.lagasse@oracle.com if (!nbe_name & ret == BE_SUCCESS) {
329*13013Sglenn.lagasse@oracle.com /*
330*13013Sglenn.lagasse@oracle.com * We requested an auto named BE; find out the
331*13013Sglenn.lagasse@oracle.com * name of the BE that was created for us and
332*13013Sglenn.lagasse@oracle.com * the auto snapshot created from the original BE.
333*13013Sglenn.lagasse@oracle.com */
334*13013Sglenn.lagasse@oracle.com if (nvlist_lookup_string(be_attrs, BE_ATTR_NEW_BE_NAME,
335*13013Sglenn.lagasse@oracle.com &nbe_name) != 0) {
336*13013Sglenn.lagasse@oracle.com printf("failed to get BE_ATTR_NEW_BE_NAME attribute\n");
337*13013Sglenn.lagasse@oracle.com ret = 1;
338*13013Sglenn.lagasse@oracle.com } else {
339*13013Sglenn.lagasse@oracle.com printf("Auto named BE: %s\n", nbe_name);
340*13013Sglenn.lagasse@oracle.com }
341*13013Sglenn.lagasse@oracle.com
342*13013Sglenn.lagasse@oracle.com if (nvlist_lookup_string(be_attrs, BE_ATTR_SNAP_NAME,
343*13013Sglenn.lagasse@oracle.com &snap_name) != 0) {
344*13013Sglenn.lagasse@oracle.com printf("failed to get BE_ATTR_SNAP_NAME attribute\n");
345*13013Sglenn.lagasse@oracle.com ret = 1;
346*13013Sglenn.lagasse@oracle.com } else {
347*13013Sglenn.lagasse@oracle.com printf("Auto named snapshot: %s\n", snap_name);
348*13013Sglenn.lagasse@oracle.com }
349*13013Sglenn.lagasse@oracle.com }
350*13013Sglenn.lagasse@oracle.com
351*13013Sglenn.lagasse@oracle.com return (ret);
352*13013Sglenn.lagasse@oracle.com }
353*13013Sglenn.lagasse@oracle.com
354*13013Sglenn.lagasse@oracle.com static int
be_do_destroy(int argc,char ** argv)355*13013Sglenn.lagasse@oracle.com be_do_destroy(int argc, char **argv)
356*13013Sglenn.lagasse@oracle.com {
357*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
358*13013Sglenn.lagasse@oracle.com int c;
359*13013Sglenn.lagasse@oracle.com int destroy_flags = 0;
360*13013Sglenn.lagasse@oracle.com char *be_name;
361*13013Sglenn.lagasse@oracle.com
362*13013Sglenn.lagasse@oracle.com while ((c = getopt(argc, argv, "fs")) != -1) {
363*13013Sglenn.lagasse@oracle.com switch (c) {
364*13013Sglenn.lagasse@oracle.com case 'f':
365*13013Sglenn.lagasse@oracle.com destroy_flags |= BE_DESTROY_FLAG_FORCE_UNMOUNT;
366*13013Sglenn.lagasse@oracle.com break;
367*13013Sglenn.lagasse@oracle.com case 's':
368*13013Sglenn.lagasse@oracle.com destroy_flags |= BE_DESTROY_FLAG_SNAPSHOTS;
369*13013Sglenn.lagasse@oracle.com break;
370*13013Sglenn.lagasse@oracle.com default:
371*13013Sglenn.lagasse@oracle.com usage();
372*13013Sglenn.lagasse@oracle.com return (1);
373*13013Sglenn.lagasse@oracle.com }
374*13013Sglenn.lagasse@oracle.com }
375*13013Sglenn.lagasse@oracle.com
376*13013Sglenn.lagasse@oracle.com argc -= optind;
377*13013Sglenn.lagasse@oracle.com argv += optind;
378*13013Sglenn.lagasse@oracle.com
379*13013Sglenn.lagasse@oracle.com if (argc != 1) {
380*13013Sglenn.lagasse@oracle.com usage();
381*13013Sglenn.lagasse@oracle.com return (1);
382*13013Sglenn.lagasse@oracle.com }
383*13013Sglenn.lagasse@oracle.com
384*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
385*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
386*13013Sglenn.lagasse@oracle.com return (1);
387*13013Sglenn.lagasse@oracle.com }
388*13013Sglenn.lagasse@oracle.com
389*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, argv[0]) != 0) {
390*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for BE_ATTR_NEW_BE_NAME "
391*13013Sglenn.lagasse@oracle.com "(%s).\n", argv[0]);
392*13013Sglenn.lagasse@oracle.com return (1);
393*13013Sglenn.lagasse@oracle.com }
394*13013Sglenn.lagasse@oracle.com
395*13013Sglenn.lagasse@oracle.com if (nvlist_add_uint16(be_attrs, BE_ATTR_DESTROY_FLAGS, destroy_flags)
396*13013Sglenn.lagasse@oracle.com != 0) {
397*13013Sglenn.lagasse@oracle.com printf("nvlist_add_uint16 failed for "
398*13013Sglenn.lagasse@oracle.com "BE_ATTR_DESTROY_FLAGS.\n");
399*13013Sglenn.lagasse@oracle.com return (1);
400*13013Sglenn.lagasse@oracle.com }
401*13013Sglenn.lagasse@oracle.com
402*13013Sglenn.lagasse@oracle.com return (be_destroy(be_attrs));
403*13013Sglenn.lagasse@oracle.com }
404*13013Sglenn.lagasse@oracle.com
405*13013Sglenn.lagasse@oracle.com static int
be_do_list(int argc,char ** argv)406*13013Sglenn.lagasse@oracle.com be_do_list(int argc, char **argv)
407*13013Sglenn.lagasse@oracle.com {
408*13013Sglenn.lagasse@oracle.com int err = BE_SUCCESS;
409*13013Sglenn.lagasse@oracle.com be_node_list_t *be_nodes;
410*13013Sglenn.lagasse@oracle.com be_node_list_t *cur_be;
411*13013Sglenn.lagasse@oracle.com boolean_t snaps = B_FALSE;
412*13013Sglenn.lagasse@oracle.com int c = 0;
413*13013Sglenn.lagasse@oracle.com
414*13013Sglenn.lagasse@oracle.com while ((c = getopt(argc, argv, "s")) != -1) {
415*13013Sglenn.lagasse@oracle.com switch (c) {
416*13013Sglenn.lagasse@oracle.com case 's':
417*13013Sglenn.lagasse@oracle.com snaps = B_TRUE;
418*13013Sglenn.lagasse@oracle.com break;
419*13013Sglenn.lagasse@oracle.com default:
420*13013Sglenn.lagasse@oracle.com usage();
421*13013Sglenn.lagasse@oracle.com return (1);
422*13013Sglenn.lagasse@oracle.com }
423*13013Sglenn.lagasse@oracle.com }
424*13013Sglenn.lagasse@oracle.com
425*13013Sglenn.lagasse@oracle.com argc -= optind;
426*13013Sglenn.lagasse@oracle.com argv += optind;
427*13013Sglenn.lagasse@oracle.com
428*13013Sglenn.lagasse@oracle.com
429*13013Sglenn.lagasse@oracle.com if (argc == 1) {
430*13013Sglenn.lagasse@oracle.com err = be_list(argv[0], &be_nodes);
431*13013Sglenn.lagasse@oracle.com } else {
432*13013Sglenn.lagasse@oracle.com err = be_list(NULL, &be_nodes);
433*13013Sglenn.lagasse@oracle.com }
434*13013Sglenn.lagasse@oracle.com
435*13013Sglenn.lagasse@oracle.com if (err == BE_SUCCESS) {
436*13013Sglenn.lagasse@oracle.com
437*13013Sglenn.lagasse@oracle.com printf(
438*13013Sglenn.lagasse@oracle.com "BE name\t\tActive\tActive \tDataset\t\t\tPolicy\tUUID\n");
439*13013Sglenn.lagasse@oracle.com printf(
440*13013Sglenn.lagasse@oracle.com " \t\t \ton boot\t \t\t\t \t \n");
441*13013Sglenn.lagasse@oracle.com printf(
442*13013Sglenn.lagasse@oracle.com "-------\t\t------\t-------\t-------\t\t\t------\t----\n");
443*13013Sglenn.lagasse@oracle.com
444*13013Sglenn.lagasse@oracle.com for (cur_be = be_nodes; cur_be != NULL;
445*13013Sglenn.lagasse@oracle.com cur_be = cur_be->be_next_node) {
446*13013Sglenn.lagasse@oracle.com
447*13013Sglenn.lagasse@oracle.com int name_len = strlen(cur_be->be_node_name);
448*13013Sglenn.lagasse@oracle.com int ds_len = strlen(cur_be->be_root_ds);
449*13013Sglenn.lagasse@oracle.com
450*13013Sglenn.lagasse@oracle.com printf("%s%s%s\t%s\t%s%s%s\t%s\n",
451*13013Sglenn.lagasse@oracle.com cur_be->be_node_name,
452*13013Sglenn.lagasse@oracle.com name_len < 8 ? "\t\t" : "\t",
453*13013Sglenn.lagasse@oracle.com cur_be->be_active ? "yes" : "no",
454*13013Sglenn.lagasse@oracle.com cur_be->be_active_on_boot ? "yes" : "no",
455*13013Sglenn.lagasse@oracle.com cur_be->be_root_ds,
456*13013Sglenn.lagasse@oracle.com ds_len < 8 ? "\t\t\t" :
457*13013Sglenn.lagasse@oracle.com (ds_len < 16 ? "\t\t" : "\t"),
458*13013Sglenn.lagasse@oracle.com cur_be->be_policy_type,
459*13013Sglenn.lagasse@oracle.com cur_be->be_uuid_str ? cur_be->be_uuid_str : "-");
460*13013Sglenn.lagasse@oracle.com if (snaps) {
461*13013Sglenn.lagasse@oracle.com be_snapshot_list_t *snapshots = NULL;
462*13013Sglenn.lagasse@oracle.com printf("Snapshot Name\n");
463*13013Sglenn.lagasse@oracle.com printf("--------------\n");
464*13013Sglenn.lagasse@oracle.com for (snapshots = cur_be->be_node_snapshots;
465*13013Sglenn.lagasse@oracle.com snapshots != NULL; snapshots =
466*13013Sglenn.lagasse@oracle.com snapshots->be_next_snapshot) {
467*13013Sglenn.lagasse@oracle.com printf("%s\n",
468*13013Sglenn.lagasse@oracle.com snapshots->be_snapshot_name);
469*13013Sglenn.lagasse@oracle.com }
470*13013Sglenn.lagasse@oracle.com }
471*13013Sglenn.lagasse@oracle.com }
472*13013Sglenn.lagasse@oracle.com }
473*13013Sglenn.lagasse@oracle.com
474*13013Sglenn.lagasse@oracle.com be_free_list(be_nodes);
475*13013Sglenn.lagasse@oracle.com return (err);
476*13013Sglenn.lagasse@oracle.com }
477*13013Sglenn.lagasse@oracle.com
478*13013Sglenn.lagasse@oracle.com static int
be_do_rename(int argc,char ** argv)479*13013Sglenn.lagasse@oracle.com be_do_rename(int argc, char **argv)
480*13013Sglenn.lagasse@oracle.com {
481*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
482*13013Sglenn.lagasse@oracle.com char *obe_name;
483*13013Sglenn.lagasse@oracle.com char *nbe_name;
484*13013Sglenn.lagasse@oracle.com
485*13013Sglenn.lagasse@oracle.com if (argc < 1 || argc > 2) {
486*13013Sglenn.lagasse@oracle.com usage();
487*13013Sglenn.lagasse@oracle.com return (1);
488*13013Sglenn.lagasse@oracle.com }
489*13013Sglenn.lagasse@oracle.com
490*13013Sglenn.lagasse@oracle.com obe_name = argv[0];
491*13013Sglenn.lagasse@oracle.com nbe_name = argv[1];
492*13013Sglenn.lagasse@oracle.com
493*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
494*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
495*13013Sglenn.lagasse@oracle.com return (1);
496*13013Sglenn.lagasse@oracle.com }
497*13013Sglenn.lagasse@oracle.com
498*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
499*13013Sglenn.lagasse@oracle.com != 0) {
500*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
501*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
502*13013Sglenn.lagasse@oracle.com return (1);
503*13013Sglenn.lagasse@oracle.com }
504*13013Sglenn.lagasse@oracle.com
505*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_NEW_BE_NAME, nbe_name)
506*13013Sglenn.lagasse@oracle.com != 0) {
507*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
508*13013Sglenn.lagasse@oracle.com "BE_ATTR_NEW_BE_NAME (%s).\n", nbe_name);
509*13013Sglenn.lagasse@oracle.com return (1);
510*13013Sglenn.lagasse@oracle.com }
511*13013Sglenn.lagasse@oracle.com
512*13013Sglenn.lagasse@oracle.com return (be_rename(be_attrs));
513*13013Sglenn.lagasse@oracle.com
514*13013Sglenn.lagasse@oracle.com }
515*13013Sglenn.lagasse@oracle.com
516*13013Sglenn.lagasse@oracle.com static int
be_do_create_snapshot(int argc,char ** argv)517*13013Sglenn.lagasse@oracle.com be_do_create_snapshot(int argc, char **argv)
518*13013Sglenn.lagasse@oracle.com {
519*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
520*13013Sglenn.lagasse@oracle.com char *obe_name = NULL;
521*13013Sglenn.lagasse@oracle.com char *snap_name = NULL;
522*13013Sglenn.lagasse@oracle.com char *policy = NULL;
523*13013Sglenn.lagasse@oracle.com int c;
524*13013Sglenn.lagasse@oracle.com int ret = BE_SUCCESS;
525*13013Sglenn.lagasse@oracle.com
526*13013Sglenn.lagasse@oracle.com while ((c = getopt(argc, argv, "p:")) != -1) {
527*13013Sglenn.lagasse@oracle.com switch (c) {
528*13013Sglenn.lagasse@oracle.com case 'p':
529*13013Sglenn.lagasse@oracle.com policy = optarg;
530*13013Sglenn.lagasse@oracle.com break;
531*13013Sglenn.lagasse@oracle.com default:
532*13013Sglenn.lagasse@oracle.com usage();
533*13013Sglenn.lagasse@oracle.com return (1);
534*13013Sglenn.lagasse@oracle.com }
535*13013Sglenn.lagasse@oracle.com }
536*13013Sglenn.lagasse@oracle.com
537*13013Sglenn.lagasse@oracle.com argc -= optind;
538*13013Sglenn.lagasse@oracle.com argv += optind;
539*13013Sglenn.lagasse@oracle.com
540*13013Sglenn.lagasse@oracle.com if (argc < 1 || argc > 2) {
541*13013Sglenn.lagasse@oracle.com usage();
542*13013Sglenn.lagasse@oracle.com return (1);
543*13013Sglenn.lagasse@oracle.com }
544*13013Sglenn.lagasse@oracle.com
545*13013Sglenn.lagasse@oracle.com obe_name = argv[0];
546*13013Sglenn.lagasse@oracle.com
547*13013Sglenn.lagasse@oracle.com if (argc > 1) {
548*13013Sglenn.lagasse@oracle.com /* Snapshot name provided */
549*13013Sglenn.lagasse@oracle.com snap_name = argv[1];
550*13013Sglenn.lagasse@oracle.com }
551*13013Sglenn.lagasse@oracle.com
552*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
553*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
554*13013Sglenn.lagasse@oracle.com return (1);
555*13013Sglenn.lagasse@oracle.com }
556*13013Sglenn.lagasse@oracle.com
557*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
558*13013Sglenn.lagasse@oracle.com != 0) {
559*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
560*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
561*13013Sglenn.lagasse@oracle.com return (1);
562*13013Sglenn.lagasse@oracle.com }
563*13013Sglenn.lagasse@oracle.com
564*13013Sglenn.lagasse@oracle.com if (policy) {
565*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_POLICY, policy) != 0) {
566*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
567*13013Sglenn.lagasse@oracle.com "BE_ATTR_POLICY (%s).\n", policy);
568*13013Sglenn.lagasse@oracle.com return (1);
569*13013Sglenn.lagasse@oracle.com }
570*13013Sglenn.lagasse@oracle.com }
571*13013Sglenn.lagasse@oracle.com
572*13013Sglenn.lagasse@oracle.com if (snap_name) {
573*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_SNAP_NAME, snap_name)
574*13013Sglenn.lagasse@oracle.com != 0) {
575*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
576*13013Sglenn.lagasse@oracle.com "BE_ATTR_SNAP_NAME (%s).\n", snap_name);
577*13013Sglenn.lagasse@oracle.com return (1);
578*13013Sglenn.lagasse@oracle.com }
579*13013Sglenn.lagasse@oracle.com }
580*13013Sglenn.lagasse@oracle.com
581*13013Sglenn.lagasse@oracle.com ret = be_create_snapshot(be_attrs);
582*13013Sglenn.lagasse@oracle.com
583*13013Sglenn.lagasse@oracle.com if (!snap_name && ret == BE_SUCCESS) {
584*13013Sglenn.lagasse@oracle.com /*
585*13013Sglenn.lagasse@oracle.com * We requested an auto named snapshot; find out
586*13013Sglenn.lagasse@oracle.com * the snapshot name that was created for us.
587*13013Sglenn.lagasse@oracle.com */
588*13013Sglenn.lagasse@oracle.com if (nvlist_lookup_string(be_attrs, BE_ATTR_SNAP_NAME,
589*13013Sglenn.lagasse@oracle.com &snap_name) != 0) {
590*13013Sglenn.lagasse@oracle.com printf("failed to get BE_ATTR_SNAP_NAME attribute\n");
591*13013Sglenn.lagasse@oracle.com ret = 1;
592*13013Sglenn.lagasse@oracle.com } else {
593*13013Sglenn.lagasse@oracle.com printf("Auto named snapshot: %s\n", snap_name);
594*13013Sglenn.lagasse@oracle.com }
595*13013Sglenn.lagasse@oracle.com }
596*13013Sglenn.lagasse@oracle.com
597*13013Sglenn.lagasse@oracle.com return (ret);
598*13013Sglenn.lagasse@oracle.com }
599*13013Sglenn.lagasse@oracle.com
600*13013Sglenn.lagasse@oracle.com static int
be_do_destroy_snapshot(int argc,char ** argv)601*13013Sglenn.lagasse@oracle.com be_do_destroy_snapshot(int argc, char **argv)
602*13013Sglenn.lagasse@oracle.com {
603*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
604*13013Sglenn.lagasse@oracle.com char *obe_name;
605*13013Sglenn.lagasse@oracle.com char *snap_name;
606*13013Sglenn.lagasse@oracle.com
607*13013Sglenn.lagasse@oracle.com if (argc != 2) {
608*13013Sglenn.lagasse@oracle.com usage();
609*13013Sglenn.lagasse@oracle.com return (1);
610*13013Sglenn.lagasse@oracle.com }
611*13013Sglenn.lagasse@oracle.com
612*13013Sglenn.lagasse@oracle.com obe_name = argv[0];
613*13013Sglenn.lagasse@oracle.com snap_name = argv[1];
614*13013Sglenn.lagasse@oracle.com
615*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
616*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
617*13013Sglenn.lagasse@oracle.com return (1);
618*13013Sglenn.lagasse@oracle.com }
619*13013Sglenn.lagasse@oracle.com
620*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
621*13013Sglenn.lagasse@oracle.com != 0) {
622*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
623*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
624*13013Sglenn.lagasse@oracle.com return (1);
625*13013Sglenn.lagasse@oracle.com }
626*13013Sglenn.lagasse@oracle.com
627*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_SNAP_NAME, snap_name)
628*13013Sglenn.lagasse@oracle.com != 0) {
629*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
630*13013Sglenn.lagasse@oracle.com "BE_ATTR_SNAP_NAME (%s).\n", snap_name);
631*13013Sglenn.lagasse@oracle.com return (1);
632*13013Sglenn.lagasse@oracle.com }
633*13013Sglenn.lagasse@oracle.com
634*13013Sglenn.lagasse@oracle.com return (be_destroy_snapshot(be_attrs));
635*13013Sglenn.lagasse@oracle.com }
636*13013Sglenn.lagasse@oracle.com
637*13013Sglenn.lagasse@oracle.com static int
be_do_rollback(int argc,char ** argv)638*13013Sglenn.lagasse@oracle.com be_do_rollback(int argc, char **argv)
639*13013Sglenn.lagasse@oracle.com {
640*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
641*13013Sglenn.lagasse@oracle.com char *obe_name;
642*13013Sglenn.lagasse@oracle.com char *snap_name;
643*13013Sglenn.lagasse@oracle.com
644*13013Sglenn.lagasse@oracle.com if (argc < 1 || argc > 2) {
645*13013Sglenn.lagasse@oracle.com usage();
646*13013Sglenn.lagasse@oracle.com return (1);
647*13013Sglenn.lagasse@oracle.com }
648*13013Sglenn.lagasse@oracle.com
649*13013Sglenn.lagasse@oracle.com obe_name = argv[0];
650*13013Sglenn.lagasse@oracle.com snap_name = argv[1];
651*13013Sglenn.lagasse@oracle.com
652*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
653*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
654*13013Sglenn.lagasse@oracle.com return (1);
655*13013Sglenn.lagasse@oracle.com }
656*13013Sglenn.lagasse@oracle.com
657*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
658*13013Sglenn.lagasse@oracle.com != 0) {
659*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
660*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
661*13013Sglenn.lagasse@oracle.com return (1);
662*13013Sglenn.lagasse@oracle.com }
663*13013Sglenn.lagasse@oracle.com
664*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_SNAP_NAME, snap_name)
665*13013Sglenn.lagasse@oracle.com != 0) {
666*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
667*13013Sglenn.lagasse@oracle.com "BE_ATTR_SNAP_NAME (%s).\n", snap_name);
668*13013Sglenn.lagasse@oracle.com return (1);
669*13013Sglenn.lagasse@oracle.com }
670*13013Sglenn.lagasse@oracle.com
671*13013Sglenn.lagasse@oracle.com return (be_rollback(be_attrs));
672*13013Sglenn.lagasse@oracle.com }
673*13013Sglenn.lagasse@oracle.com
674*13013Sglenn.lagasse@oracle.com static int
be_do_activate(int argc,char ** argv)675*13013Sglenn.lagasse@oracle.com be_do_activate(int argc, char **argv)
676*13013Sglenn.lagasse@oracle.com {
677*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
678*13013Sglenn.lagasse@oracle.com char *obe_name;
679*13013Sglenn.lagasse@oracle.com
680*13013Sglenn.lagasse@oracle.com if (argc < 1 || argc > 2) {
681*13013Sglenn.lagasse@oracle.com usage();
682*13013Sglenn.lagasse@oracle.com return (1);
683*13013Sglenn.lagasse@oracle.com }
684*13013Sglenn.lagasse@oracle.com
685*13013Sglenn.lagasse@oracle.com obe_name = argv[0];
686*13013Sglenn.lagasse@oracle.com
687*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
688*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
689*13013Sglenn.lagasse@oracle.com return (1);
690*13013Sglenn.lagasse@oracle.com }
691*13013Sglenn.lagasse@oracle.com
692*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
693*13013Sglenn.lagasse@oracle.com != 0) {
694*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
695*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
696*13013Sglenn.lagasse@oracle.com return (1);
697*13013Sglenn.lagasse@oracle.com }
698*13013Sglenn.lagasse@oracle.com
699*13013Sglenn.lagasse@oracle.com return (be_activate(be_attrs));
700*13013Sglenn.lagasse@oracle.com }
701*13013Sglenn.lagasse@oracle.com
702*13013Sglenn.lagasse@oracle.com static int
be_do_mount(int argc,char ** argv)703*13013Sglenn.lagasse@oracle.com be_do_mount(int argc, char **argv)
704*13013Sglenn.lagasse@oracle.com {
705*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
706*13013Sglenn.lagasse@oracle.com int c;
707*13013Sglenn.lagasse@oracle.com boolean_t shared_fs = B_FALSE;
708*13013Sglenn.lagasse@oracle.com int mount_flags = 0;
709*13013Sglenn.lagasse@oracle.com char *obe_name;
710*13013Sglenn.lagasse@oracle.com char *mountpoint;
711*13013Sglenn.lagasse@oracle.com
712*13013Sglenn.lagasse@oracle.com while ((c = getopt(argc, argv, "s:")) != -1) {
713*13013Sglenn.lagasse@oracle.com switch (c) {
714*13013Sglenn.lagasse@oracle.com case 's':
715*13013Sglenn.lagasse@oracle.com shared_fs = B_TRUE;
716*13013Sglenn.lagasse@oracle.com
717*13013Sglenn.lagasse@oracle.com mount_flags |= BE_MOUNT_FLAG_SHARED_FS;
718*13013Sglenn.lagasse@oracle.com
719*13013Sglenn.lagasse@oracle.com if (strcmp(optarg, "rw") == 0) {
720*13013Sglenn.lagasse@oracle.com mount_flags |= BE_MOUNT_FLAG_SHARED_RW;
721*13013Sglenn.lagasse@oracle.com } else if (strcmp(optarg, "ro") != 0) {
722*13013Sglenn.lagasse@oracle.com printf("The -s flag requires an argument "
723*13013Sglenn.lagasse@oracle.com "[ rw | ro ]\n");
724*13013Sglenn.lagasse@oracle.com usage();
725*13013Sglenn.lagasse@oracle.com return (1);
726*13013Sglenn.lagasse@oracle.com }
727*13013Sglenn.lagasse@oracle.com
728*13013Sglenn.lagasse@oracle.com break;
729*13013Sglenn.lagasse@oracle.com default:
730*13013Sglenn.lagasse@oracle.com usage();
731*13013Sglenn.lagasse@oracle.com return (1);
732*13013Sglenn.lagasse@oracle.com }
733*13013Sglenn.lagasse@oracle.com }
734*13013Sglenn.lagasse@oracle.com
735*13013Sglenn.lagasse@oracle.com argc -= optind;
736*13013Sglenn.lagasse@oracle.com argv += optind;
737*13013Sglenn.lagasse@oracle.com
738*13013Sglenn.lagasse@oracle.com if (argc < 1 || argc > 2) {
739*13013Sglenn.lagasse@oracle.com usage();
740*13013Sglenn.lagasse@oracle.com return (1);
741*13013Sglenn.lagasse@oracle.com }
742*13013Sglenn.lagasse@oracle.com
743*13013Sglenn.lagasse@oracle.com obe_name = argv[0];
744*13013Sglenn.lagasse@oracle.com
745*13013Sglenn.lagasse@oracle.com if (argc == 2) {
746*13013Sglenn.lagasse@oracle.com mountpoint = argv[1];
747*13013Sglenn.lagasse@oracle.com } else {
748*13013Sglenn.lagasse@oracle.com /*
749*13013Sglenn.lagasse@oracle.com * XXX - Need to generate a random mountpoint here;
750*13013Sglenn.lagasse@oracle.com * right now we're just exitting if one isn't supplied.
751*13013Sglenn.lagasse@oracle.com */
752*13013Sglenn.lagasse@oracle.com usage();
753*13013Sglenn.lagasse@oracle.com return (1);
754*13013Sglenn.lagasse@oracle.com }
755*13013Sglenn.lagasse@oracle.com
756*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
757*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
758*13013Sglenn.lagasse@oracle.com return (1);
759*13013Sglenn.lagasse@oracle.com }
760*13013Sglenn.lagasse@oracle.com
761*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
762*13013Sglenn.lagasse@oracle.com != 0) {
763*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
764*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
765*13013Sglenn.lagasse@oracle.com return (1);
766*13013Sglenn.lagasse@oracle.com }
767*13013Sglenn.lagasse@oracle.com
768*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_MOUNTPOINT, mountpoint)
769*13013Sglenn.lagasse@oracle.com != 0) {
770*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
771*13013Sglenn.lagasse@oracle.com "BE_ATTR_MOUNTPOINT (%s).\n", mountpoint);
772*13013Sglenn.lagasse@oracle.com return (1);
773*13013Sglenn.lagasse@oracle.com }
774*13013Sglenn.lagasse@oracle.com
775*13013Sglenn.lagasse@oracle.com if (shared_fs) {
776*13013Sglenn.lagasse@oracle.com if (nvlist_add_uint16(be_attrs, BE_ATTR_MOUNT_FLAGS,
777*13013Sglenn.lagasse@oracle.com mount_flags) != 0) {
778*13013Sglenn.lagasse@oracle.com printf("nvlist_add_uint16 failed for "
779*13013Sglenn.lagasse@oracle.com "BE_ATTR_MOUNT_FLAGS (%d).\n", mount_flags);
780*13013Sglenn.lagasse@oracle.com return (1);
781*13013Sglenn.lagasse@oracle.com }
782*13013Sglenn.lagasse@oracle.com }
783*13013Sglenn.lagasse@oracle.com
784*13013Sglenn.lagasse@oracle.com return (be_mount(be_attrs));
785*13013Sglenn.lagasse@oracle.com }
786*13013Sglenn.lagasse@oracle.com
787*13013Sglenn.lagasse@oracle.com
788*13013Sglenn.lagasse@oracle.com static int
be_do_unmount(int argc,char ** argv)789*13013Sglenn.lagasse@oracle.com be_do_unmount(int argc, char **argv)
790*13013Sglenn.lagasse@oracle.com {
791*13013Sglenn.lagasse@oracle.com nvlist_t *be_attrs;
792*13013Sglenn.lagasse@oracle.com int c;
793*13013Sglenn.lagasse@oracle.com int unmount_flags = 0;
794*13013Sglenn.lagasse@oracle.com char *obe_name;
795*13013Sglenn.lagasse@oracle.com
796*13013Sglenn.lagasse@oracle.com while ((c = getopt(argc, argv, "f")) != -1) {
797*13013Sglenn.lagasse@oracle.com switch (c) {
798*13013Sglenn.lagasse@oracle.com case 'f':
799*13013Sglenn.lagasse@oracle.com unmount_flags |= BE_UNMOUNT_FLAG_FORCE;
800*13013Sglenn.lagasse@oracle.com break;
801*13013Sglenn.lagasse@oracle.com default:
802*13013Sglenn.lagasse@oracle.com usage();
803*13013Sglenn.lagasse@oracle.com return (1);
804*13013Sglenn.lagasse@oracle.com }
805*13013Sglenn.lagasse@oracle.com }
806*13013Sglenn.lagasse@oracle.com
807*13013Sglenn.lagasse@oracle.com argc -= optind;
808*13013Sglenn.lagasse@oracle.com argv += optind;
809*13013Sglenn.lagasse@oracle.com
810*13013Sglenn.lagasse@oracle.com if (argc != 1) {
811*13013Sglenn.lagasse@oracle.com usage();
812*13013Sglenn.lagasse@oracle.com return (1);
813*13013Sglenn.lagasse@oracle.com }
814*13013Sglenn.lagasse@oracle.com
815*13013Sglenn.lagasse@oracle.com obe_name = argv[0];
816*13013Sglenn.lagasse@oracle.com
817*13013Sglenn.lagasse@oracle.com if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
818*13013Sglenn.lagasse@oracle.com printf("nvlist_alloc failed.\n");
819*13013Sglenn.lagasse@oracle.com return (1);
820*13013Sglenn.lagasse@oracle.com }
821*13013Sglenn.lagasse@oracle.com
822*13013Sglenn.lagasse@oracle.com if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name)
823*13013Sglenn.lagasse@oracle.com != 0) {
824*13013Sglenn.lagasse@oracle.com printf("nvlist_add_string failed for "
825*13013Sglenn.lagasse@oracle.com "BE_ATTR_ORIG_BE_NAME (%s).\n", obe_name);
826*13013Sglenn.lagasse@oracle.com return (1);
827*13013Sglenn.lagasse@oracle.com }
828*13013Sglenn.lagasse@oracle.com
829*13013Sglenn.lagasse@oracle.com if (nvlist_add_uint16(be_attrs, BE_ATTR_UNMOUNT_FLAGS, unmount_flags)
830*13013Sglenn.lagasse@oracle.com != 0) {
831*13013Sglenn.lagasse@oracle.com printf("nvlist_add_uint16 failed for "
832*13013Sglenn.lagasse@oracle.com "BE_ATTR_UNMOUNT_FLAGS\n");
833*13013Sglenn.lagasse@oracle.com return (1);
834*13013Sglenn.lagasse@oracle.com }
835*13013Sglenn.lagasse@oracle.com
836*13013Sglenn.lagasse@oracle.com return (be_unmount(be_attrs));
837*13013Sglenn.lagasse@oracle.com }
838