annotate usr/src/lib/libbe/common/be_mount.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 a64c8d17c8f4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13025
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2 * CDDL HEADER START
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
3 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
5 * Common Development and Distribution License (the "License").
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
6 * You may not use this file except in compliance with the License.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
7 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
10 * See the License for the specific language governing permissions
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
11 * and limitations under the License.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
12 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
18 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
19 * CDDL HEADER END
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
20 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
21
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
22 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
23 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
24 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
25
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
26 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
27 * System includes
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
28 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
29 #include <assert.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
30 #include <errno.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
31 #include <libintl.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
32 #include <libnvpair.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
33 #include <libzfs.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
34 #include <stdio.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
35 #include <stdlib.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
36 #include <string.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
37 #include <sys/mntent.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
38 #include <sys/mnttab.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
39 #include <sys/mount.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
40 #include <sys/stat.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
41 #include <sys/types.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
42 #include <sys/vfstab.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
43 #include <sys/zone.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
44 #include <sys/mkdev.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
45 #include <unistd.h>
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 #include <libbe.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
48 #include <libbe_priv.h>
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
49
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
50 #define BE_TMP_MNTPNT "/tmp/.be.XXXXXX"
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 typedef struct dir_data {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
53 char *dir;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
54 char *ds;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
55 } dir_data_t;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
56
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
57 /* Private function prototypes */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
58 static int be_mount_callback(zfs_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
59 static int be_unmount_callback(zfs_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
60 static int be_get_legacy_fs_callback(zfs_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
61 static int fix_mountpoint(zfs_handle_t *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
62 static int fix_mountpoint_callback(zfs_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
63 static int get_mountpoint_from_vfstab(char *, const char *, char *, size_t,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
64 boolean_t);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
65 static int loopback_mount_shared_fs(zfs_handle_t *, be_mount_data_t *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
66 static int loopback_mount_zonepath(const char *, be_mount_data_t *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
67 static int iter_shared_fs_callback(zfs_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
68 static int zpool_shared_fs_callback(zpool_handle_t *, void *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
69 static int unmount_shared_fs(be_unmount_data_t *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
70 static int add_to_fs_list(be_fs_list_data_t *, const char *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
71 static int be_mount_root(zfs_handle_t *, char *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
72 static int be_unmount_root(zfs_handle_t *, be_unmount_data_t *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
73 static int be_mount_zones(zfs_handle_t *, be_mount_data_t *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
74 static int be_unmount_zones(be_unmount_data_t *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
75 static int be_mount_one_zone(zfs_handle_t *, be_mount_data_t *, char *, char *,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
76 char *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
77 static int be_unmount_one_zone(be_unmount_data_t *, char *, char *, char *);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
78 static int be_get_ds_from_dir_callback(zfs_handle_t *, void *);
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
81 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
82 /* Public Functions */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
83 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
84
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
85 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
86 * Function: be_mount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
87 * Description: Mounts a BE and its subordinate datasets at a given mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
88 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
89 * 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
90 * The following attributes are used by this function:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
91 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
92 * BE_ATTR_ORIG_BE_NAME *required
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
93 * BE_ATTR_MOUNTPOINT *required
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
94 * BE_ATTR_MOUNT_FLAGS *optional
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
95 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
96 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
97 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
98 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
99 * Public
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 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
102 be_mount(nvlist_t *be_attrs)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
103 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
104 char *be_name = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
105 char *mountpoint = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
106 uint16_t flags = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
107 int ret = BE_SUCCESS;
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 /* Initialize libzfs handle */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
110 if (!be_zfs_init())
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
111 return (BE_ERR_INIT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
112
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
113 /* Get original BE name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
114 if (nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME, &be_name)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
115 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
116 be_print_err(gettext("be_mount: failed to lookup "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
117 "BE_ATTR_ORIG_BE_NAME attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
118 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
119 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
120
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
121 /* Validate original BE name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
122 if (!be_valid_be_name(be_name)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
123 be_print_err(gettext("be_mount: invalid BE name %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
124 be_name);
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 /* Get mountpoint */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
129 if (nvlist_lookup_string(be_attrs, BE_ATTR_MOUNTPOINT, &mountpoint)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
130 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
131 be_print_err(gettext("be_mount: failed to lookup "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
132 "BE_ATTR_MOUNTPOINT attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
133 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
134 }
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 /* Get flags */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
137 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
138 BE_ATTR_MOUNT_FLAGS, DATA_TYPE_UINT16, &flags, NULL) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
139 be_print_err(gettext("be_mount: failed to lookup "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
140 "BE_ATTR_MOUNT_FLAGS attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
141 return (BE_ERR_INVAL);
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
144 ret = _be_mount(be_name, &mountpoint, flags);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
145
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
146 be_zfs_fini();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
147
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
148 return (ret);
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 * Function: be_unmount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
153 * Description: Unmounts a BE and its subordinate datasets.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
154 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
155 * 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
156 * The following attributes are used by this function:
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 * BE_ATTR_ORIG_BE_NAME *required
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
159 * BE_ATTR_UNMOUNT_FLAGS *optional
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
160 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
161 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
162 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
163 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
164 * Public
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
165 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
166 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
167 be_unmount(nvlist_t *be_attrs)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
168 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
169 char *be_name = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
170 uint16_t flags = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
171 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
172
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
173 /* Initialize libzfs handle */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
174 if (!be_zfs_init())
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
175 return (BE_ERR_INIT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
176
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
177 /* Get original BE name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
178 if (nvlist_lookup_string(be_attrs, BE_ATTR_ORIG_BE_NAME, &be_name)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
179 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
180 be_print_err(gettext("be_unmount: failed to lookup "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
181 "BE_ATTR_ORIG_BE_NAME attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
182 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
183 }
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 /* Validate original BE name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
186 if (!be_valid_be_name(be_name)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
187 be_print_err(gettext("be_unmount: invalid BE name %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
188 be_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
189 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
190 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
191
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
192 /* Get unmount flags */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
193 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
194 BE_ATTR_UNMOUNT_FLAGS, DATA_TYPE_UINT16, &flags, NULL) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
195 be_print_err(gettext("be_unmount: failed to loookup "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
196 "BE_ATTR_UNMOUNT_FLAGS attribute\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
197 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
198 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
199
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
200 ret = _be_unmount(be_name, flags);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
201
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
202 be_zfs_fini();
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 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
205 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
206
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
207 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
208 /* Semi-Private Functions */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
209 /* ******************************************************************** */
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 * Function: _be_mount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
213 * Description: Mounts a BE. If the altroot is not provided, this function
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
214 * will generate a temporary mountpoint to mount the BE at. It
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
215 * will return this temporary mountpoint to the caller via the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
216 * altroot reference pointer passed in. This returned value is
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
217 * allocated on heap storage and is the repsonsibility of the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
218 * caller to free.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
219 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
220 * be_name - pointer to name of BE to mount.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
221 * altroot - reference pointer to altroot of where to mount BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
222 * flags - flag indicating special handling for mounting the BE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
223 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
224 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
225 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
226 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
227 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
228 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
229 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
230 _be_mount(char *be_name, char **altroot, int flags)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
231 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
232 be_transaction_data_t bt = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
233 be_mount_data_t md = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
234 zfs_handle_t *zhp;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
235 char obe_root_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
236 char *mp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
237 char *tmp_altroot = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
238 int ret = BE_SUCCESS, err = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
239 uuid_t uu = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
240 boolean_t gen_tmp_altroot = B_FALSE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
241
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
242 if (be_name == NULL || altroot == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
243 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
244
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
245 /* Set be_name as obe_name in bt structure */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
246 bt.obe_name = be_name;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
247
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
248 /* Find which zpool obe_name lives in */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
249 if ((err = 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
250 be_print_err(gettext("be_mount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
251 "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
252 return (BE_ERR_BE_NOENT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
253 } else if (err < 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
254 be_print_err(gettext("be_mount: zpool_iter failed: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
255 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
256 return (zfs_err_to_be_err(g_zfs));
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
259 /* Generate string for obe_name's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
260 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
261 sizeof (obe_root_ds));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
262 bt.obe_root_ds = obe_root_ds;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
263
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
264 /* Get handle to BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
265 if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_FILESYSTEM)) ==
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
266 NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
267 be_print_err(gettext("be_mount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
268 "open BE root dataset (%s): %s\n"), bt.obe_root_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
269 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
270 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
271 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
272
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
273 /* Make sure BE's root dataset isn't already mounted somewhere */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
274 if (zfs_is_mounted(zhp, &mp)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
275 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
276 be_print_err(gettext("be_mount: %s is already mounted "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
277 "at %s\n"), bt.obe_name, mp != NULL ? mp : "");
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
278 free(mp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
279 return (BE_ERR_MOUNTED);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
280 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
281
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
282 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
283 * Fix this BE's mountpoint if its root dataset isn't set to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
284 * either 'legacy' or '/'.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
285 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
286 if ((ret = fix_mountpoint(zhp)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
287 be_print_err(gettext("be_mount: mountpoint check "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
288 "failed for %s\n"), bt.obe_root_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
289 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
290 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
291 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
292
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
293 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
294 * If altroot not provided, create a temporary alternate root
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
295 * to mount on
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
296 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
297 if (*altroot == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
298 if ((ret = be_make_tmp_mountpoint(&tmp_altroot))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
299 != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
300 be_print_err(gettext("be_mount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
301 "make temporary mountpoint\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
302 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
303 return (ret);
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 gen_tmp_altroot = B_TRUE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
306 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
307 tmp_altroot = *altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
308 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
309
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
310 /* Mount the BE's root file system */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
311 if ((ret = be_mount_root(zhp, tmp_altroot)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
312 be_print_err(gettext("be_mount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
313 "mount BE root file system\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
314 if (gen_tmp_altroot)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
315 free(tmp_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
316 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
317 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
318 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
319
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
320 /* Iterate through BE's children filesystems */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
321 if ((err = zfs_iter_filesystems(zhp, be_mount_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
322 tmp_altroot)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
323 be_print_err(gettext("be_mount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
324 "mount BE (%s) on %s\n"), bt.obe_name, tmp_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
325 if (gen_tmp_altroot)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
326 free(tmp_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
327 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
328 return (err);
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 md.altroot = tmp_altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
332 md.shared_fs = flags & BE_MOUNT_FLAG_SHARED_FS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
333 md.shared_rw = flags & BE_MOUNT_FLAG_SHARED_RW;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
334
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 * Mount shared file systems if mount flag says so.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
337 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
338 if (md.shared_fs) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
339 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
340 * Mount all ZFS file systems not under the BE's root dataset
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
341 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
342 (void) zpool_iter(g_zfs, zpool_shared_fs_callback, &md);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
343
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
344 /* TODO: Mount all non-ZFS file systems - Not supported yet */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
345 }
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 * If we're in the global zone and the global zone has a valid uuid,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
349 * mount all supported non-global zones.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
350 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
351 if (getzoneid() == GLOBAL_ZONEID &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
352 !(flags & BE_MOUNT_FLAG_NO_ZONES) &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
353 be_get_uuid(bt.obe_root_ds, &uu) == BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
354 if ((ret = be_mount_zones(zhp, &md)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
355 (void) _be_unmount(bt.obe_name, 0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
356 if (gen_tmp_altroot)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
357 free(tmp_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
358 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
359 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
360 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
361 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
362
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
363 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
364
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
365 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
366 * If a NULL altroot was passed in, pass the generated altroot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
367 * back to the caller in altroot.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
368 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
369 if (gen_tmp_altroot)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
370 *altroot = tmp_altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
371
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
372 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
373 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
374
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
375 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
376 * Function: _be_unmount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
377 * Description: Unmount a BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
378 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
379 * be_name - pointer to name of BE to unmount.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
380 * flags - flags for unmounting the BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
381 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
382 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
383 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
384 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
385 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
386 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
387 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
388 _be_unmount(char *be_name, int flags)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
389 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
390 be_transaction_data_t bt = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
391 be_unmount_data_t ud = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
392 zfs_handle_t *zhp;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
393 uuid_t uu = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
394 char obe_root_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
395 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
396 char *mp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
397 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
398 int zret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
399
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
400 if (be_name == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
401 return (BE_ERR_INVAL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
402
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
403 /* Set be_name as obe_name in bt structure */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
404 bt.obe_name = be_name;
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 /* Find which zpool obe_name lives in */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
407 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
408 be_print_err(gettext("be_unmount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
409 "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
410 return (BE_ERR_BE_NOENT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
411 } else if (zret < 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
412 be_print_err(gettext("be_unmount: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
413 "zpool_iter failed: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
414 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
415 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
416 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
417 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
418
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
419 /* Generate string for obe_name's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
420 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
421 sizeof (obe_root_ds));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
422 bt.obe_root_ds = obe_root_ds;
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 /* Get handle to BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
425 if ((zhp = zfs_open(g_zfs, bt.obe_root_ds, ZFS_TYPE_FILESYSTEM)) ==
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
426 NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
427 be_print_err(gettext("be_unmount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
428 "open BE root dataset (%s): %s\n"), bt.obe_root_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
429 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
430 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
431 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
432 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
433
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
434 /* Make sure BE's root dataset is mounted somewhere */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
435 if (!zfs_is_mounted(zhp, &mp)) {
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 be_print_err(gettext("be_unmount: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
438 "(%s) not mounted\n"), bt.obe_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
439
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
440 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
441 * BE is not mounted, fix this BE's mountpoint if its root
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
442 * dataset isn't set to either 'legacy' or '/'.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
443 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
444 if ((ret = fix_mountpoint(zhp)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
445 be_print_err(gettext("be_unmount: mountpoint check "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
446 "failed for %s\n"), bt.obe_root_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
447 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
448 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
449 }
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 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
452 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
453 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
454
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
455 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
456 * If we didn't get a mountpoint from the zfs_is_mounted call,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
457 * try and get it from its property.
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 if (mp == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
460 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
461 sizeof (mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
462 be_print_err(gettext("be_unmount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
463 "get mountpoint of (%s)\n"), bt.obe_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
464 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
465 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
466 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
467 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
468 (void) strlcpy(mountpoint, mp, sizeof (mountpoint));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
469 free(mp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
470 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
471
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
472 /* If BE mounted as current root, fail */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
473 if (strcmp(mountpoint, "/") == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
474 be_print_err(gettext("be_unmount: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
475 "cannot unmount currently running BE\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
476 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
477 return (BE_ERR_UMOUNT_CURR_BE);
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
480 ud.altroot = mountpoint;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
481 ud.force = flags & BE_UNMOUNT_FLAG_FORCE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
482
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
483 /* Unmount all supported non-global zones if we're in the global zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
484 if (getzoneid() == GLOBAL_ZONEID &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
485 be_get_uuid(bt.obe_root_ds, &uu) == BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
486 if ((ret = be_unmount_zones(&ud)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
487 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
488 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
489 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
490 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
491
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
492 /* TODO: Unmount all non-ZFS file systems - Not supported yet */
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 /* Unmount all ZFS file systems not under the BE root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
495 if ((ret = unmount_shared_fs(&ud)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
496 be_print_err(gettext("be_unmount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
497 "unmount shared file systems\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
498 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
499 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
500 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
501
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
502 /* Unmount all children datasets under the BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
503 if ((zret = zfs_iter_filesystems(zhp, be_unmount_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
504 &ud)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
505 be_print_err(gettext("be_unmount: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
506 "unmount BE (%s)\n"), bt.obe_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
507 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
508 return (zret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
509 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
510
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
511 /* Unmount this BE's root filesystem */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
512 if ((ret = be_unmount_root(zhp, &ud)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
513 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
514 return (ret);
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 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
518
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
519 return (BE_SUCCESS);
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
522 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
523 * Function: be_mount_zone_root
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
524 * Description: Mounts the zone root dataset for a zone.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
525 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
526 * zfs - zfs_handle_t pointer to zone root dataset
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
527 * md - be_mount_data_t pointer to data for zone to be mounted
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
528 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
529 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
530 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
531 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
532 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
533 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
534 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
535 be_mount_zone_root(zfs_handle_t *zhp, be_mount_data_t *md)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
536 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
537 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
538 int err = 0;
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 /* Get mountpoint property of dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
541 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
542 sizeof (mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
543 be_print_err(gettext("be_mount_zone_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
544 "get mountpoint property for %s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
545 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
546 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
547 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
548
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
549 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
550 * Make sure zone's root dataset is set to 'legacy'. This is
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
551 * currently a requirement in this implementation of zones
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
552 * support.
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 if (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
555 be_print_err(gettext("be_mount_zone_root: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
556 "zone root dataset mountpoint is not 'legacy'\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
557 return (BE_ERR_ZONE_ROOT_NOT_LEGACY);
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
560 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
561 * Legacy mount the zone root dataset.
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 * As a workaround for 6176743, we mount the zone's root with the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
564 * MS_OVERLAY option in case an alternate BE is mounted, and we're
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
565 * mounting the root for the zone from the current BE here. When an
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
566 * alternate BE is mounted, it ties up the zone's zoneroot directory
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
567 * for the current BE since the zone's zonepath is loopback mounted
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
568 * from the current BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
569 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
570 * TODO: The MS_OVERLAY option needs to be removed when 6176743
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
571 * is fixed.
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 if (mount(zfs_get_name(zhp), md->altroot, MS_OVERLAY, MNTTYPE_ZFS,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
574 NULL, 0, NULL, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
575 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
576 be_print_err(gettext("be_mount_zone_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
577 "legacy mount zone root dataset (%s) at %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
578 zfs_get_name(zhp), md->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
579 return (errno_to_be_err(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
580 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
581
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
582 return (BE_SUCCESS);
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
585 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
586 * Function: be_unmount_zone_root
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
587 * Description: Unmounts the zone root dataset for a zone.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
588 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
589 * zhp - zfs_handle_t pointer to zone root dataset
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
590 * ud - be_unmount_data_t pointer to data for zone to be unmounted
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
591 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
592 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
593 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
594 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
595 * Semi-private (library wise use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
596 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
597 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
598 be_unmount_zone_root(zfs_handle_t *zhp, be_unmount_data_t *ud)
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 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
601
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
602 /* Unmount the dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
603 if (zfs_unmount(zhp, NULL, ud->force ? MS_FORCE : 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
604 be_print_err(gettext("be_unmount_zone_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
605 "unmount zone root dataset %s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
606 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
607 return (zfs_err_to_be_err(g_zfs));
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 /* Get the current mountpoint property for the zone root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
611 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
612 sizeof (mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
613 be_print_err(gettext("be_unmount_zone_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
614 "get mountpoint property for zone root dataset (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
615 zfs_get_name(zhp), libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
616 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
617 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
618
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
619 /* If mountpoint not already set to 'legacy', set it to 'legacy' */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
620 if (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
621 if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
622 ZFS_MOUNTPOINT_LEGACY) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
623 be_print_err(gettext("be_unmount_zone_root: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
624 "failed to set mountpoint of zone root dataset "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
625 "%s to 'legacy': %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
626 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
627 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
628 }
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
631 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
632 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
633
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
634 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
635 * Function: be_get_legacy_fs
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
636 * Description: This function iterates through all non-shared file systems
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
637 * of a BE and finds the ones with a legacy mountpoint. For
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
638 * those file systems, it reads the BE's vfstab to get the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
639 * mountpoint. If found, it adds that file system to the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
640 * be_fs_list_data_t passed in.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
641 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
642 * This function can be used to gather legacy mounted file systems
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
643 * for both global BEs and non-global zone BEs. To get data for
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
644 * a non-global zone BE, the zoneroot_ds and zoneroot parameters
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
645 * will be specified, otherwise they should be set to NULL.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
646 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
647 * be_name - global BE name from which to get legacy file
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
648 * system list.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
649 * be_root_ds - root dataset of global BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
650 * zoneroot_ds - root dataset of zone.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
651 * zoneroot - zoneroot path of zone.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
652 * fld - be_fs_list_data_t pointer.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
653 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
654 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
655 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
656 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
657 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
658 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
659 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
660 be_get_legacy_fs(char *be_name, char *be_root_ds, char *zoneroot_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
661 char *zoneroot, be_fs_list_data_t *fld)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
662 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
663 zfs_handle_t *zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
664 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
665 boolean_t mounted_here = B_FALSE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
666 boolean_t zone_mounted_here = B_FALSE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
667 int ret = BE_SUCCESS, err = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
668
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
669 if (be_name == NULL || be_root_ds == NULL || fld == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
670 return (BE_ERR_INVAL);
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 /* Get handle to BE's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
673 if ((zhp = zfs_open(g_zfs, be_root_ds, ZFS_TYPE_FILESYSTEM))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
674 == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
675 be_print_err(gettext("be_get_legacy_fs: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
676 "open BE root dataset (%s): %s\n"), be_root_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
677 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
678 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
679 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
680 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
681
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
682 /* If BE is not already mounted, mount it. */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
683 if (!zfs_is_mounted(zhp, &fld->altroot)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
684 if ((ret = _be_mount(be_name, &fld->altroot,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
685 zoneroot_ds ? BE_MOUNT_FLAG_NULL :
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
686 BE_MOUNT_FLAG_NO_ZONES)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
687 be_print_err(gettext("be_get_legacy_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
688 "failed to mount BE %s\n"), be_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
689 goto cleanup;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
690 }
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 mounted_here = B_TRUE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
693 } else if (fld->altroot == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
694 be_print_err(gettext("be_get_legacy_fs: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
695 "get altroot of mounted BE %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
696 be_name, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
697 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
698 goto cleanup;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
699 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
700
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 * If a zone root dataset was passed in, we're wanting to get
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
703 * legacy mounted file systems for that zone, not the global
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
704 * BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
705 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
706 if (zoneroot_ds != NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
707 be_mount_data_t zone_md = { 0 };
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 /* Close off handle to global BE's root dataset */
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
712 /* Get handle to zone's root dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
713 if ((zhp = zfs_open(g_zfs, zoneroot_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
714 ZFS_TYPE_FILESYSTEM)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
715 be_print_err(gettext("be_get_legacy_fs: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
716 "open zone BE root dataset (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
717 zoneroot_ds, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
718 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
719 goto cleanup;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
720 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
721
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
722 /* Make sure the zone we're looking for is mounted */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
723 if (!zfs_is_mounted(zhp, &zone_md.altroot)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
724 char zone_altroot[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
725
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
726 /* Generate alternate root path for zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
727 (void) snprintf(zone_altroot, sizeof (zone_altroot),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
728 "%s%s", fld->altroot, zoneroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
729 if ((zone_md.altroot = strdup(zone_altroot)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
730 be_print_err(gettext("be_get_legacy_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
731 "memory allocation failed\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
732 ret = BE_ERR_NOMEM;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
733 goto cleanup;
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
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
736 if ((ret = be_mount_zone_root(zhp, &zone_md))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
737 != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
738 be_print_err(gettext("be_get_legacy_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
739 "failed to mount zone root %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
740 zoneroot_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
741 free(zone_md.altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
742 zone_md.altroot = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
743 goto cleanup;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
744 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
745 zone_mounted_here = B_TRUE;
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 free(fld->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
749 fld->altroot = zone_md.altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
750 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
751
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
752 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
753 * If the root dataset is in the vfstab with a mountpoint of "/",
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
754 * add it to the list
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
755 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
756 if (get_mountpoint_from_vfstab(fld->altroot, zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
757 mountpoint, sizeof (mountpoint), B_FALSE) == BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
758 if (strcmp(mountpoint, "/") == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
759 if (add_to_fs_list(fld, zfs_get_name(zhp))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
760 != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
761 be_print_err(gettext("be_get_legacy_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
762 "failed to add %s to fs list\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
763 zfs_get_name(zhp));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
764 ret = BE_ERR_INVAL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
765 goto cleanup;
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 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
768 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
769
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
770 /* Iterate subordinate file systems looking for legacy mounts */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
771 if ((ret = zfs_iter_filesystems(zhp, be_get_legacy_fs_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
772 fld)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
773 be_print_err(gettext("be_get_legacy_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
774 "failed to iterate %s to get legacy mounts\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
775 zfs_get_name(zhp));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
776 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
777
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
778 cleanup:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
779 /* If we mounted the zone BE, unmount it */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
780 if (zone_mounted_here) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
781 be_unmount_data_t zone_ud = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
782
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
783 zone_ud.altroot = fld->altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
784 zone_ud.force = B_TRUE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
785 if ((err = be_unmount_zone_root(zhp, &zone_ud)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
786 be_print_err(gettext("be_get_legacy_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
787 "failed to unmount zone root %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
788 zoneroot_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
789 if (ret == BE_SUCCESS)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
790 ret = err;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
791 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
792 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
793
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
794 /* If we mounted this BE, unmount it */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
795 if (mounted_here) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
796 if ((err = _be_unmount(be_name, 0)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
797 be_print_err(gettext("be_get_legacy_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
798 "failed to unmount %s\n"), be_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
799 if (ret == BE_SUCCESS)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
800 ret = err;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
801 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
802 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
803
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
804 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
805
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
806 free(fld->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
807 fld->altroot = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
808
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
809 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
810 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
811
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
812 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
813 * Function: be_free_fs_list
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
814 * Description: Function used to free the members of a be_fs_list_data_t
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
815 * structure.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
816 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
817 * fld - be_fs_list_data_t pointer to free.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
818 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
819 * None
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
820 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
821 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
822 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
823 void
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
824 be_free_fs_list(be_fs_list_data_t *fld)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
825 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
826 int i;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
827
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
828 if (fld == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
829 return;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
830
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
831 free(fld->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
832
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
833 if (fld->fs_list == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
834 return;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
835
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
836 for (i = 0; i < fld->fs_num; i++)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
837 free(fld->fs_list[i]);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
838
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
839 free(fld->fs_list);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
840 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
841
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
842 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
843 * Function: be_get_ds_from_dir(char *dir)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
844 * Description: Given a directory path, find the underlying dataset mounted
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
845 * at that directory path if there is one. The returned name
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
846 * is allocated in heap storage, so the caller is responsible
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
847 * for freeing it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
848 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
849 * dir - char pointer of directory to find.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
850 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
851 * NULL - if directory is not mounted from a dataset.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
852 * name of dataset mounted at dir.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
853 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
854 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
855 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
856 char *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
857 be_get_ds_from_dir(char *dir)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
858 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
859 dir_data_t dd = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
860 char resolved_dir[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
861
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
862 /* Make sure length of dir is within the max length */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
863 if (dir == NULL || strlen(dir) >= MAXPATHLEN)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
864 return (NULL);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
865
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
866 /* Resolve dir in case its lofs mounted */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
867 (void) strlcpy(resolved_dir, dir, sizeof (resolved_dir));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
868 z_resolve_lofs(resolved_dir, sizeof (resolved_dir));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
869
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
870 dd.dir = resolved_dir;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
871
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
872 (void) zfs_iter_root(g_zfs, be_get_ds_from_dir_callback, &dd);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
873
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
874 return (dd.ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
875 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
876
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
877 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
878 * Function: be_make_tmp_mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
879 * Description: This function generates a random temporary mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
880 * and creates that mountpoint directory. It returns the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
881 * mountpoint in heap storage, so the caller is responsible
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
882 * for freeing it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
883 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
884 * tmp_mp - reference to pointer of where to store generated
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
885 * temporary mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
886 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
887 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
888 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
889 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
890 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
891 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
892 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
893 be_make_tmp_mountpoint(char **tmp_mp)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
894 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
895 int err = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
896
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
897 if ((*tmp_mp = (char *)calloc(1, sizeof (BE_TMP_MNTPNT) + 1)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
898 be_print_err(gettext("be_make_tmp_mountpoint: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
899 "malloc failed\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
900 return (BE_ERR_NOMEM);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
901 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
902 (void) strlcpy(*tmp_mp, BE_TMP_MNTPNT, sizeof (BE_TMP_MNTPNT) + 1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
903 if (mkdtemp(*tmp_mp) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
904 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
905 be_print_err(gettext("be_make_tmp_mountpoint: mkdtemp() failed "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
906 "for %s: %s\n"), *tmp_mp, strerror(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
907 free(*tmp_mp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
908 *tmp_mp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
909 return (errno_to_be_err(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
910 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
911
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
912 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
913 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
914
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
915 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
916 * Function: be_mount_pool
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
917 * Description: This function determines if the pool's datase is mounted
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
918 * and if not it is used to mount the pool's dataset. The
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
919 * function returns the current mountpoint if we are able
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
920 * to mount the dataset.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
921 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
922 * zhp - handle to the pool's dataset
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
923 * tmp_mntpnt - The temporary mountpoint that the pool's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
924 * dataset is mounted on. This is set only
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
925 * if the attempt to mount the dataset at it's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
926 * set mountpoint fails, and we've used a
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
927 * temporary mount point for this dataset. It
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
928 * is expected that the caller will free this
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
929 * memory.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
930 * orig_mntpnt - The original mountpoint for the pool. If a
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
931 * temporary mount point was needed this will
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
932 * be used to reset the mountpoint property to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
933 * it's original mountpoint. It is expected that
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
934 * the caller will free this memory.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
935 * pool_mounted - This flag indicates that the pool was mounted
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
936 * in this function.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
937 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
938 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
939 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
940 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
941 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
942 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
943 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
944 be_mount_pool(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
945 zfs_handle_t *zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
946 char **tmp_mntpnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
947 char **orig_mntpnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
948 boolean_t *pool_mounted)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
949 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
950
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
951 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
952 int ret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
953
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
954 *tmp_mntpnt = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
955 *orig_mntpnt = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
956 *pool_mounted = B_FALSE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
957
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
958 if (!zfs_is_mounted(zhp, NULL)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
959 if (zfs_mount(zhp, NULL, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
960 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
961 sizeof (mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
962 be_print_err(gettext("be_mount_pool: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
963 "get mountpoint of (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
964 zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
965 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
966 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
967 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
968 if ((*orig_mntpnt = strdup(mountpoint)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
969 be_print_err(gettext("be_mount_pool: memory "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
970 "allocation failed\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
971 return (BE_ERR_NOMEM);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
972 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
973 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
974 * attempt to mount on a temp mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
975 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
976 if ((ret = be_make_tmp_mountpoint(tmp_mntpnt))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
977 != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
978 be_print_err(gettext("be_mount_pool: failed "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
979 "to make temporary mountpoint\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
980 free(*orig_mntpnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
981 *orig_mntpnt = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
982 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
983 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
984
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
985 if (zfs_prop_set(zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
986 zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
987 *tmp_mntpnt) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
988 be_print_err(gettext("be_mount_pool: failed "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
989 "to set mountpoint of pool dataset %s to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
990 "%s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
991 *orig_mntpnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
992 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
993 free(*tmp_mntpnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
994 free(*orig_mntpnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
995 *orig_mntpnt = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
996 *tmp_mntpnt = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
997 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
998 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
999
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1000 if (zfs_mount(zhp, NULL, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1001 be_print_err(gettext("be_mount_pool: failed "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1002 "to mount dataset %s at %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1003 zfs_get_name(zhp), *tmp_mntpnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1004 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1005 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1006 if (zfs_prop_set(zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1007 zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1008 mountpoint) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1009 be_print_err(gettext("be_mount_pool: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1010 "failed to set mountpoint of pool "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1011 "dataset %s to %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1012 zfs_get_name(zhp), *tmp_mntpnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1013 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1014 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1015 free(*tmp_mntpnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1016 free(*orig_mntpnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1017 *orig_mntpnt = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1018 *tmp_mntpnt = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1019 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1020 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1021 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1022 *pool_mounted = B_TRUE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1023 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1024
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1025 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1026 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1027
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1028 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1029 * Function: be_unmount_pool
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1030 * Description: This function is used to unmount the pool's dataset if we
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1031 * mounted it previously using be_mount_pool().
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1032 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1033 * zhp - handle to the pool's dataset
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1034 * tmp_mntpnt - If a temprary mount point was used this will
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1035 * be set. Since this was created in be_mount_pool
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1036 * we will need to clean it up here.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1037 * orig_mntpnt - The original mountpoint for the pool. This is
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1038 * used to set the dataset mountpoint property
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1039 * back to it's original value in the case where a
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1040 * temporary mountpoint was used.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1041 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1042 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1043 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1044 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1045 * Semi-private (library wide use only)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1046 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1047 int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1048 be_unmount_pool(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1049 zfs_handle_t *zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1050 char *tmp_mntpnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1051 char *orig_mntpnt)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1052 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1053 if (zfs_unmount(zhp, NULL, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1054 be_print_err(gettext("be_unmount_pool: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1055 "unmount pool (%s): %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1056 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1057 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1058 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1059 if (orig_mntpnt != NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1060 if (tmp_mntpnt != NULL &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1061 strcmp(orig_mntpnt, tmp_mntpnt) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1062 (void) rmdir(tmp_mntpnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1063 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1064 if (zfs_prop_set(zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1065 zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1066 orig_mntpnt) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1067 be_print_err(gettext("be_unmount_pool: failed "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1068 "to set the mountpoint for dataset (%s) to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1069 "%s: %s\n"), zfs_get_name(zhp), orig_mntpnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1070 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1071 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1072 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1073 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1074
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1075 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1076 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1077
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1078 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1079 /* Private Functions */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1080 /* ******************************************************************** */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1081
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1082 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1083 * Function: be_mount_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1084 * Description: Callback function used to iterate through all of a BE's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1085 * subordinate file systems and to mount them accordingly.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1086 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1087 * zhp - zfs_handle_t pointer to current file system being
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1088 * processed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1089 * data - pointer to the altroot of where to mount BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1090 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1091 * 0 - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1092 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1093 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1094 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1095 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1096 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1097 be_mount_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1098 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1099 zprop_source_t sourcetype;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1100 const char *fs_name = zfs_get_name(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1101 char source[ZFS_MAXNAMELEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1102 char *altroot = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1103 char zhp_mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1104 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1105 int ret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1106
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1107 /* Get dataset's mountpoint and source values */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1108 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, zhp_mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1109 sizeof (zhp_mountpoint), &sourcetype, source, sizeof (source),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1110 B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1111 be_print_err(gettext("be_mount_callback: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1112 "get mountpoint and sourcetype for %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1113 fs_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1114 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1115 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1116 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1117
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1118 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1119 * Set this filesystem's 'canmount' property to 'noauto' just incase
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1120 * it's been set 'on'. We do this so that when we change its
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1121 * mountpoint zfs won't immediately try to mount it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1122 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1123 if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_CANMOUNT), "noauto")) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1124 be_print_err(gettext("be_mount_callback: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1125 "set canmount to 'noauto' (%s)\n"), fs_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1126 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1127 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1128 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1129
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1130 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1131 * If the mountpoint is none, there's nothing to do, goto next.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1132 * If the mountpoint is legacy, legacy mount it with mount(2).
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1133 * If the mountpoint is inherited, its mountpoint should
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1134 * already be set. If it's not, then explicitly fix-up
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1135 * the mountpoint now by appending its explicitly set
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1136 * mountpoint value to the BE mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1137 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1138 if (strcmp(zhp_mountpoint, ZFS_MOUNTPOINT_NONE) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1139 goto next;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1140 } else if (strcmp(zhp_mountpoint, ZFS_MOUNTPOINT_LEGACY) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1141 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1142 * If the mountpoint is set to 'legacy', we need to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1143 * dig into this BE's vfstab to figure out where to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1144 * mount it, and just mount it via mount(2).
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1145 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1146 if (get_mountpoint_from_vfstab(altroot, fs_name,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1147 mountpoint, sizeof (mountpoint), B_TRUE) == BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1148
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1149 /* Legacy mount the file system */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1150 if (mount(fs_name, mountpoint, MS_DATA,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1151 MNTTYPE_ZFS, NULL, 0, NULL, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1152 be_print_err(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1153 gettext("be_mount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1154 "failed to mount %s on %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1155 fs_name, mountpoint);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1156 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1157 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1158 be_print_err(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1159 gettext("be_mount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1160 "no entry for %s in vfstab, "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1161 "skipping ...\n"), fs_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1162 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1163
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1164 goto next;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1165
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1166 } else if (sourcetype & ZPROP_SRC_INHERITED) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1167 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1168 * If the mountpoint is inherited, its parent should have
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1169 * already been processed so its current mountpoint value
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1170 * is what its mountpoint ought to be.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1171 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1172 (void) strlcpy(mountpoint, zhp_mountpoint, sizeof (mountpoint));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1173 } else if (sourcetype & ZPROP_SRC_LOCAL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1174 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1175 * Else process dataset with explicitly set mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1176 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1177 (void) snprintf(mountpoint, sizeof (mountpoint),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1178 "%s%s", altroot, zhp_mountpoint);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1179
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1180 /* Set the new mountpoint for the dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1181 if (zfs_prop_set(zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1182 zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1183 mountpoint)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1184 be_print_err(gettext("be_mount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1185 "failed to set mountpoint for %s to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1186 "%s\n"), fs_name, mountpoint);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1187 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1188 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1189 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1190 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1191 be_print_err(gettext("be_mount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1192 "mountpoint sourcetype of %s is %d, skipping ...\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1193 fs_name, sourcetype);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1194
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1195 goto next;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1196 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1197
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1198 /* Mount this filesystem */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1199 if (zfs_mount(zhp, NULL, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1200 be_print_err(gettext("be_mount_callback: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1201 "mount dataset %s at %s: %s\n"), fs_name, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1202 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1203 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1204 * Set this filesystem's 'mountpoint' property back to what
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1205 * it was
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1206 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1207 if (sourcetype & ZPROP_SRC_LOCAL &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1208 strcmp(zhp_mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1209 (void) zfs_prop_set(zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1210 zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1211 zhp_mountpoint);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1212 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1213
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1214 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1215 return (BE_ERR_MOUNT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1216 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1217
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1218 next:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1219 /* Iterate through this dataset's children and mount them */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1220 if ((ret = zfs_iter_filesystems(zhp, be_mount_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1221 altroot)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1222 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1223 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1224 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1225
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1226
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1227 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1228 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1229 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1230
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1231 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1232 * Function: be_unmount_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1233 * Description: Callback function used to iterate through all of a BE's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1234 * subordinate file systems and to unmount them.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1235 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1236 * zhp - zfs_handle_t pointer to current file system being
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1237 * processed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1238 * data - pointer to the mountpoint of where BE is mounted.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1239 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1240 * 0 - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1241 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1242 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1243 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1244 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1245 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1246 be_unmount_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1247 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1248 be_unmount_data_t *ud = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1249 zprop_source_t sourcetype;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1250 const char *fs_name = zfs_get_name(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1251 char source[ZFS_MAXNAMELEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1252 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1253 char *zhp_mountpoint;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1254 int ret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1255
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1256 /* Iterate down this dataset's children first */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1257 if (zfs_iter_filesystems(zhp, be_unmount_callback, ud)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1258 ret = BE_ERR_UMOUNT;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1259 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1260 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1261
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1262 /* Is dataset even mounted ? */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1263 if (!zfs_is_mounted(zhp, NULL))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1264 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1265
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1266 /* Unmount this file system */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1267 if (zfs_unmount(zhp, NULL, ud->force ? MS_FORCE : 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1268 be_print_err(gettext("be_unmount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1269 "failed to unmount %s: %s\n"), fs_name,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1270 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1271 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1272 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1273 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1274
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1275 /* Get dataset's current mountpoint and source value */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1276 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1277 sizeof (mountpoint), &sourcetype, source, sizeof (source),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1278 B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1279 be_print_err(gettext("be_unmount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1280 "failed to get mountpoint and sourcetype for %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1281 fs_name, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1282 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1283 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1284 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1285
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1286 if (sourcetype & ZPROP_SRC_INHERITED) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1287 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1288 * If the mountpoint is inherited we don't need to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1289 * do anything. When its parent gets processed
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1290 * its mountpoint will be set accordingly.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1291 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1292 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1293 } else if (sourcetype & ZPROP_SRC_LOCAL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1294
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1295 if (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1296 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1297 * If the mountpoint is set to 'legacy', its already
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1298 * been unmounted (from above call to zfs_unmount), and
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1299 * we don't need to do anything else with it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1300 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1301 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1302
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1303 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1304 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1305 * Else process dataset with explicitly set mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1306 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1307
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1308 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1309 * Get this dataset's mountpoint relative to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1310 * the BE's mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1311 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1312 if ((strncmp(mountpoint, ud->altroot,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1313 strlen(ud->altroot)) == 0) &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1314 (mountpoint[strlen(ud->altroot)] == '/')) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1315
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1316 zhp_mountpoint = mountpoint +
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1317 strlen(ud->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1318
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1319 /* Set this dataset's mountpoint value */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1320 if (zfs_prop_set(zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1321 zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1322 zhp_mountpoint)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1323 be_print_err(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1324 gettext("be_unmount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1325 "failed to set mountpoint for "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1326 "%s to %s: %s\n"), fs_name,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1327 zhp_mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1328 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1329 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1330 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1331 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1332 be_print_err(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1333 gettext("be_unmount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1334 "%s not mounted under BE's altroot %s, "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1335 "skipping ...\n"), fs_name, ud->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1336 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1337 * fs_name is mounted but not under the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1338 * root for this BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1339 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1340 ret = BE_ERR_INVALMOUNTPOINT;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1341 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1342 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1343 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1344 be_print_err(gettext("be_unmount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1345 "mountpoint sourcetype of %s is %d, skipping ...\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1346 fs_name, sourcetype);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1347 ret = BE_ERR_ZFS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1348 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1349
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1350 done:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1351 /* Set this filesystem's 'canmount' property to 'noauto' */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1352 if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_CANMOUNT), "noauto")) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1353 be_print_err(gettext("be_unmount_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1354 "failed to set canmount to 'noauto' (%s)\n"), fs_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1355 if (ret == 0)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1356 ret = BE_ERR_ZFS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1357 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1358
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1359 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1360 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1361 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1362
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1363 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1364 * Function: be_get_legacy_fs_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1365 * Description: The callback function is used to iterate through all
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1366 * non-shared file systems of a BE, finding ones that have
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1367 * a legacy mountpoint and an entry in the BE's vfstab.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1368 * It adds these file systems to the callback data.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1369 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1370 * zhp - zfs_handle_t pointer to current file system being
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1371 * processed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1372 * data - be_fs_list_data_t pointer
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1373 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1374 * 0 - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1375 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1376 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1377 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1378 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1379 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1380 be_get_legacy_fs_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1381 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1382 be_fs_list_data_t *fld = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1383 const char *fs_name = zfs_get_name(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1384 char zhp_mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1385 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1386 int ret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1387
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1388 /* Get this dataset's mountpoint property */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1389 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, zhp_mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1390 sizeof (zhp_mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1391 be_print_err(gettext("be_get_legacy_fs_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1392 "failed to get mountpoint for %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1393 fs_name, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1394 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1395 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1396 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1397 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1398
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1399 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1400 * If mountpoint is legacy, try to get its mountpoint from this BE's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1401 * vfstab. If it exists in the vfstab, add this file system to the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1402 * callback data.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1403 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1404 if (strcmp(zhp_mountpoint, ZFS_MOUNTPOINT_LEGACY) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1405 if (get_mountpoint_from_vfstab(fld->altroot, fs_name,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1406 mountpoint, sizeof (mountpoint), B_FALSE) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1407 be_print_err(gettext("be_get_legacy_fs_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1408 "no entry for %s in vfstab, "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1409 "skipping ...\n"), fs_name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1410
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1411 goto next;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1412 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1413
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1414 /* Record file system into the callback data. */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1415 if (add_to_fs_list(fld, zfs_get_name(zhp)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1416 be_print_err(gettext("be_get_legacy_fs_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1417 "failed to add %s to fs list\n"), mountpoint);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1418 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1419 return (BE_ERR_NOMEM);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1420 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1421 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1422
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1423 next:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1424 /* Iterate through this dataset's children file systems */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1425 if ((ret = zfs_iter_filesystems(zhp, be_get_legacy_fs_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1426 fld)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1427 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1428 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1429 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1430 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1431 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1432 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1433
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1434 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1435 * Function: add_to_fs_list
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1436 * Description: Function used to add a file system to the fs_list array in
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1437 * a be_fs_list_data_t structure.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1438 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1439 * fld - be_fs_list_data_t pointer
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1440 * fs - file system to add
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1441 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1442 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1443 * 1 - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1444 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1445 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1446 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1447 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1448 add_to_fs_list(be_fs_list_data_t *fld, const char *fs)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1449 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1450 if (fld == NULL || fs == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1451 return (1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1452
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1453 if ((fld->fs_list = (char **)realloc(fld->fs_list,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1454 sizeof (char *)*(fld->fs_num + 1))) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1455 be_print_err(gettext("add_to_fs_list: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1456 "memory allocation failed\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1457 return (1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1458 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1459
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1460 if ((fld->fs_list[fld->fs_num++] = strdup(fs)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1461 be_print_err(gettext("add_to_fs_list: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1462 "memory allocation failed\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1463 return (1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1464 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1465
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1466 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1467 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1468
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1469 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1470 * Function: zpool_shared_fs_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1471 * Description: Callback function used to iterate through all existing pools
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1472 * to find and mount all shared filesystems. This function
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1473 * processes the pool's "pool data" dataset, then uses
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1474 * iter_shared_fs_callback to iterate through the pool's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1475 * datasets.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1476 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1477 * zlp - zpool_handle_t pointer to the current pool being
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1478 * looked at.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1479 * data - be_mount_data_t pointer
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1480 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1481 * 0 - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1482 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1483 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1484 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1485 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1486 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1487 zpool_shared_fs_callback(zpool_handle_t *zlp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1488 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1489 be_mount_data_t *md = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1490 zfs_handle_t *zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1491 const char *zpool = zpool_get_name(zlp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1492 int ret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1493
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1494 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1495 * Get handle to pool's "pool data" dataset
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1496 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1497 if ((zhp = zfs_open(g_zfs, zpool, ZFS_TYPE_FILESYSTEM)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1498 be_print_err(gettext("zpool_shared_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1499 "failed to open pool dataset %s: %s\n"), zpool,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1500 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1501 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1502 zpool_close(zlp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1503 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1504 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1505
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1506 /* Process this pool's "pool data" dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1507 (void) loopback_mount_shared_fs(zhp, md);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1508
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1509 /* Interate through this pool's children */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1510 (void) zfs_iter_filesystems(zhp, iter_shared_fs_callback, md);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1511
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1512 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1513 zpool_close(zlp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1514
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1515 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1516 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1517
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1518 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1519 * Function: iter_shared_fs_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1520 * Description: Callback function used to iterate through a pool's datasets
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1521 * to find and mount all shared filesystems. It makes sure to
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1522 * find the BE container dataset of the pool, if it exists, and
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1523 * does not process and iterate down that path.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1524 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1525 * Note - This function iterates linearly down the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1526 * hierarchical dataset paths and mounts things as it goes
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1527 * along. It does not make sure that something deeper down
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1528 * a dataset path has an interim mountpoint for something
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1529 * processed earlier.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1530 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1531 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1532 * zhp - zfs_handle_t pointer to the current dataset being
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1533 * processed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1534 * data - be_mount_data_t pointer
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1535 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1536 * 0 - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1537 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1538 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1539 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1540 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1541 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1542 iter_shared_fs_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1543 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1544 be_mount_data_t *md = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1545 const char *name = zfs_get_name(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1546 char container_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1547 char tmp_name[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1548 char *pool;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1549
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1550 /* Get the pool's name */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1551 (void) strlcpy(tmp_name, name, sizeof (tmp_name));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1552 pool = strtok(tmp_name, "/");
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1553
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1554 if (pool) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1555 /* Get the name of this pool's container dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1556 be_make_container_ds(pool, container_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1557 sizeof (container_ds));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1558
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1559 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1560 * If what we're processing is this pool's BE container
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1561 * dataset, skip it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1562 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1563 if (strcmp(name, container_ds) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1564 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1565 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1566 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1567 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1568 /* Getting the pool name failed, return error */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1569 be_print_err(gettext("iter_shared_fs_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1570 "failed to get pool name from %s\n"), name);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1571 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1572 return (BE_ERR_POOL_NOENT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1573 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1574
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1575 /* Mount this shared filesystem */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1576 (void) loopback_mount_shared_fs(zhp, md);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1577
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1578 /* Iterate this dataset's children file systems */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1579 (void) zfs_iter_filesystems(zhp, iter_shared_fs_callback, md);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1580 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1581
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1582 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1583 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1584
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1585 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1586 * Function: loopback_mount_shared_fs
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1587 * Description: This function loopback mounts a file system into the altroot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1588 * area of the BE being mounted. Since these are shared file
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1589 * systems, they are expected to be already mounted for the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1590 * current BE, and this function just loopback mounts them into
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1591 * the BE mountpoint. If they are not mounted for the current
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1592 * live system, they are skipped and not mounted into the BE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1593 * we're mounting.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1594 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1595 * zhp - zfs_handle_t pointer to the dataset to loopback mount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1596 * md - be_mount_data_t pointer
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1597 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1598 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1599 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1600 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1601 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1602 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1603 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1604 loopback_mount_shared_fs(zfs_handle_t *zhp, be_mount_data_t *md)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1605 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1606 char zhp_mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1607 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1608 char *mp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1609 char optstr[MAX_MNTOPT_STR];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1610 int mflag = MS_OPTIONSTR;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1611 int err;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1612
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1613 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1614 * Check if file system is currently mounted and not delegated
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1615 * to a non-global zone (if we're in the global zone)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1616 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1617 if (zfs_is_mounted(zhp, &mp) && (getzoneid() != GLOBAL_ZONEID ||
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1618 !zfs_prop_get_int(zhp, ZFS_PROP_ZONED))) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1619 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1620 * If we didn't get a mountpoint from the zfs_is_mounted call,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1621 * get it from the mountpoint property.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1622 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1623 if (mp == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1624 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1625 zhp_mountpoint, sizeof (zhp_mountpoint), NULL,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1626 NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1627 be_print_err(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1628 gettext("loopback_mount_shared_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1629 "failed to get mountpoint property\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1630 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1631 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1632 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1633 (void) strlcpy(zhp_mountpoint, mp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1634 sizeof (zhp_mountpoint));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1635 free(mp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1636 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1637
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1638 (void) snprintf(mountpoint, sizeof (mountpoint), "%s%s",
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1639 md->altroot, zhp_mountpoint);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1640
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1641 /* Mount it read-only if read-write was not requested */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1642 if (!md->shared_rw) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1643 mflag |= MS_RDONLY;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1644 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1645
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1646 /* Add the "nosub" option to the mount options string */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1647 (void) strlcpy(optstr, MNTOPT_NOSUB, sizeof (optstr));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1648
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1649 /* Loopback mount this dataset at the altroot */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1650 if (mount(zhp_mountpoint, mountpoint, mflag, MNTTYPE_LOFS,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1651 NULL, 0, optstr, sizeof (optstr)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1652 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1653 be_print_err(gettext("loopback_mount_shared_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1654 "failed to loopback mount %s at %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1655 zhp_mountpoint, mountpoint, strerror(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1656 return (BE_ERR_MOUNT);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1657 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1658 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1659
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1660 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1661 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1662
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1663 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1664 * Function: loopback_mount_zonepath
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1665 * Description: This function loopback mounts a zonepath into the altroot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1666 * area of the BE being mounted. Since these are shared file
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1667 * systems, they are expected to be already mounted for the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1668 * current BE, and this function just loopback mounts them into
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1669 * the BE mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1670 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1671 * zonepath - pointer to zone path in the current BE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1672 * md - be_mount_data_t pointer
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1673 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1674 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1675 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1676 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1677 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1678 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1679 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1680 loopback_mount_zonepath(const char *zonepath, be_mount_data_t *md)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1681 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1682 FILE *fp = (FILE *)NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1683 struct stat st;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1684 char *p;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1685 char *p1;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1686 char *parent_dir;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1687 struct extmnttab extmtab;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1688 dev_t dev = NODEV;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1689 char *parentmnt;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1690 char alt_parentmnt[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1691 struct mnttab mntref;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1692 char altzonepath[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1693 char optstr[MAX_MNTOPT_STR];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1694 int mflag = MS_OPTIONSTR;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1695 int ret;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1696 int err;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1697
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1698 fp = fopen(MNTTAB, "r");
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1699 if (fp == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1700 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1701 be_print_err(gettext("loopback_mount_zonepath: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1702 "failed to open /etc/mnttab\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1703 return (errno_to_be_err(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1704 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1705
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1706 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1707 * before attempting the loopback mount of zonepath under altroot,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1708 * we need to make sure that all intermediate file systems in the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1709 * zone path are also mounted under altroot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1710 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1711
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1712 /* get the parent directory for zonepath */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1713 p = strrchr(zonepath, '/');
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1714 if (p != NULL && p != zonepath) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1715 if ((parent_dir = (char *)calloc(sizeof (char),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1716 p - zonepath + 1)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1717 ret = BE_ERR_NOMEM;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1718 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1719 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1720 (void) strlcpy(parent_dir, zonepath, p - zonepath + 1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1721 if (stat(parent_dir, &st) < 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1722 ret = errno_to_be_err(errno);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1723 be_print_err(gettext("loopback_mount_zonepath: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1724 "failed to stat %s"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1725 parent_dir);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1726 free(parent_dir);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1727 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1728 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1729 free(parent_dir);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1730
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1731 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1732 * After the above stat call, st.st_dev contains ID of the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1733 * device over which parent dir resides.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1734 * Now, search mnttab and find mount point of parent dir device.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1735 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1736
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1737 resetmnttab(fp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1738 while (getextmntent(fp, &extmtab, sizeof (extmtab)) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1739 dev = makedev(extmtab.mnt_major, extmtab.mnt_minor);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1740 if (st.st_dev == dev && strcmp(extmtab.mnt_fstype,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1741 MNTTYPE_ZFS) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1742 p1 = strchr(extmtab.mnt_special, '/');
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1743 if (p1 == NULL || strncmp(p1 + 1,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1744 BE_CONTAINER_DS_NAME, 4) != 0 ||
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1745 (*(p1 + 5) != '/' && *(p1 + 5) != '\0')) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1746 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1747 * if parent dir is in a shared file
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1748 * system, check whether it is already
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1749 * loopback mounted under altroot or
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1750 * not. It would have been mounted
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1751 * already under altroot if it is in
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1752 * a non-shared filesystem.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1753 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1754 parentmnt = strdup(extmtab.mnt_mountp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1755 (void) snprintf(alt_parentmnt,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1756 sizeof (alt_parentmnt), "%s%s",
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1757 md->altroot, parentmnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1758 mntref.mnt_mountp = alt_parentmnt;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1759 mntref.mnt_special = parentmnt;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1760 mntref.mnt_fstype = MNTTYPE_LOFS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1761 mntref.mnt_mntopts = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1762 mntref.mnt_time = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1763 resetmnttab(fp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1764 if (getmntany(fp, (struct mnttab *)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1765 &extmtab, &mntref) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1766 ret = loopback_mount_zonepath(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1767 parentmnt, md);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1768 if (ret != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1769 free(parentmnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1770 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1771 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1772 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1773 free(parentmnt);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1774 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1775 break;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1776 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1777 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1778 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1779
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1780
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1781 if (!md->shared_rw) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1782 mflag |= MS_RDONLY;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1783 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1784
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1785 (void) snprintf(altzonepath, sizeof (altzonepath), "%s%s",
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1786 md->altroot, zonepath);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1787
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1788 /* Add the "nosub" option to the mount options string */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1789 (void) strlcpy(optstr, MNTOPT_NOSUB, sizeof (optstr));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1790
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1791 /* Loopback mount this dataset at the altroot */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1792 if (mount(zonepath, altzonepath, mflag, MNTTYPE_LOFS,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1793 NULL, 0, optstr, sizeof (optstr)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1794 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1795 be_print_err(gettext("loopback_mount_zonepath: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1796 "failed to loopback mount %s at %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1797 zonepath, altzonepath, strerror(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1798 ret = BE_ERR_MOUNT;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1799 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1800 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1801 ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1802
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1803 done :
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1804 (void) fclose(fp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1805 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1806 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1807
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1808 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1809 * Function: unmount_shared_fs
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1810 * Description: This function iterates through the mnttab and finds all
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1811 * loopback mount entries that reside within the altroot of
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1812 * where the BE is mounted, and unmounts it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1813 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1814 * ud - be_unmount_data_t pointer
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1815 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1816 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1817 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1818 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1819 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1820 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1821 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1822 unmount_shared_fs(be_unmount_data_t *ud)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1823 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1824 FILE *fp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1825 struct mnttab *table = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1826 struct mnttab ent;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1827 struct mnttab *entp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1828 size_t size = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1829 int read_chunk = 32;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1830 int i;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1831 int altroot_len;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1832 int err = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1833
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1834 errno = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1835
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1836 /* Read in the mnttab into a table */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1837 if ((fp = fopen(MNTTAB, "r")) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1838 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1839 be_print_err(gettext("unmount_shared_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1840 "failed to open mnttab\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1841 return (errno_to_be_err(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1842 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1843
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1844 while (getmntent(fp, &ent) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1845 if (size % read_chunk == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1846 table = (struct mnttab *)realloc(table,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1847 (size + read_chunk) * sizeof (ent));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1848 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1849 entp = &table[size++];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1850
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1851 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1852 * Copy over the current mnttab entry into our table,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1853 * copying only the fields that we care about.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1854 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1855 (void) memset(entp, 0, sizeof (*entp));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1856 if ((entp->mnt_mountp = strdup(ent.mnt_mountp)) == NULL ||
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1857 (entp->mnt_fstype = strdup(ent.mnt_fstype)) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1858 be_print_err(gettext("unmount_shared_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1859 "memory allocation failed\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1860 return (BE_ERR_NOMEM);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1861 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1862 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1863 (void) fclose(fp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1864
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1865 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1866 * Process the mnttab entries in reverse order, looking for
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1867 * loopback mount entries mounted under our altroot.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1868 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1869 altroot_len = strlen(ud->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1870 for (i = size; i > 0; i--) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1871 entp = &table[i - 1];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1872
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1873 /* If not of type lofs, skip */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1874 if (strcmp(entp->mnt_fstype, MNTTYPE_LOFS) != 0)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1875 continue;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1876
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1877 /* If inside the altroot, unmount it */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1878 if (strncmp(entp->mnt_mountp, ud->altroot, altroot_len) == 0 &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1879 entp->mnt_mountp[altroot_len] == '/') {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1880 if (umount(entp->mnt_mountp) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1881 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1882 if (err == EBUSY) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1883 (void) sleep(1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1884 err = errno = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1885 if (umount(entp->mnt_mountp) != 0)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1886 err = errno;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1887 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1888 if (err != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1889 be_print_err(gettext(
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1890 "unmount_shared_fs: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1891 "failed to unmount shared file "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1892 "system %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1893 entp->mnt_mountp, strerror(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1894 return (errno_to_be_err(err));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1895 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1896 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1897 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1898 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1899
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1900 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1901 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1902
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1903 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1904 * Function: get_mountpoint_from_vfstab
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1905 * Description: This function digs into the vfstab in the given altroot,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1906 * and searches for an entry for the fs passed in. If found,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1907 * it returns the mountpoint of that fs in the mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1908 * buffer passed in. If the get_alt_mountpoint flag is set,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1909 * it returns the mountpoint with the altroot prepended.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1910 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1911 * altroot - pointer to the alternate root location
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1912 * fs - pointer to the file system name to look for in the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1913 * vfstab in altroot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1914 * mountpoint - pointer to buffer of where the mountpoint of
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1915 * fs will be returned.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1916 * size_mp - size of mountpoint argument
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1917 * get_alt_mountpoint - flag to indicate whether or not the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1918 * mountpoint should be populated with the altroot
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1919 * prepended.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1920 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1921 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1922 * 1 - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1923 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1924 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1925 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1926 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1927 get_mountpoint_from_vfstab(char *altroot, const char *fs, char *mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1928 size_t size_mp, boolean_t get_alt_mountpoint)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1929 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1930 struct vfstab vp;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1931 FILE *fp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1932 char alt_vfstab[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1933
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1934 /* Generate path to alternate root vfstab */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1935 (void) snprintf(alt_vfstab, sizeof (alt_vfstab), "%s/etc/vfstab",
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1936 altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1937
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1938 /* Open alternate root vfstab */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1939 if ((fp = fopen(alt_vfstab, "r")) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1940 be_print_err(gettext("get_mountpoint_from_vfstab: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1941 "failed to open vfstab (%s)\n"), alt_vfstab);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1942 return (1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1943 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1944
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1945 if (getvfsspec(fp, &vp, (char *)fs) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1946 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1947 * Found entry for fs, grab its mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1948 * If the flag to prepend the altroot into the mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1949 * is set, prepend it. Otherwise, just return the mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1950 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1951 if (get_alt_mountpoint) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1952 (void) snprintf(mountpoint, size_mp, "%s%s", altroot,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1953 vp.vfs_mountp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1954 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1955 (void) strlcpy(mountpoint, vp.vfs_mountp, size_mp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1956 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1957 } else {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1958 (void) fclose(fp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1959 return (1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1960 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1961
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1962 (void) fclose(fp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1963
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1964 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1965 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1966
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1967 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1968 * Function: fix_mountpoint_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1969 * Description: This callback function is used to iterate through a BE's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1970 * children filesystems to check if its mountpoint is currently
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1971 * set to be mounted at some specified altroot. If so, fix it by
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1972 * removing altroot from the beginning of its mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1973 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1974 * Note - There's no way to tell if a child filesystem's
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1975 * mountpoint isn't broken, and just happens to begin with
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1976 * the altroot we're looking for. In this case, this function
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1977 * will errantly remove the altroot portion from the beginning
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1978 * of this filesystem's mountpoint.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1979 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1980 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1981 * 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
1982 * data - altroot of where BE is to be mounted.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1983 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1984 * 0 - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1985 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1986 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1987 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1988 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1989 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1990 fix_mountpoint_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1991 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1992 zprop_source_t sourcetype;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1993 char source[ZFS_MAXNAMELEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1994 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1995 char *zhp_mountpoint = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1996 char *altroot = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1997 int ret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1998
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
1999 /* Get dataset's mountpoint and source values */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2000 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2001 sizeof (mountpoint), &sourcetype, source, sizeof (source),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2002 B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2003 be_print_err(gettext("fix_mountpoint_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2004 "failed to get mountpoint and sourcetype for %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2005 zfs_get_name(zhp));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2006 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2007 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2008 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2009
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2010 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2011 * If the mountpoint is not inherited and the mountpoint is not
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2012 * 'legacy', this file system potentially needs its mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2013 * fixed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2014 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2015 if (!(sourcetype & ZPROP_SRC_INHERITED) &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2016 strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2017
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2018 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2019 * Check if this file system's current mountpoint is
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2020 * under the altroot we're fixing it against.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2021 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2022 if (strncmp(mountpoint, altroot, strlen(altroot)) == 0 &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2023 mountpoint[strlen(altroot)] == '/') {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2024
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2025 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2026 * Get this dataset's mountpoint relative to the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2027 * altroot.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2028 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2029 zhp_mountpoint = mountpoint + strlen(altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2030
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2031 /* Fix this dataset's mountpoint value */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2032 if (zfs_prop_set(zhp,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2033 zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2034 zhp_mountpoint)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2035 be_print_err(gettext("fix_mountpoint_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2036 "failed to set mountpoint for %s to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2037 "%s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2038 zhp_mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2039 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2040 ret = zfs_err_to_be_err(g_zfs);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2041 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2042 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2043 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2044 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2045 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2046
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2047 /* Iterate through this dataset's children and fix them */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2048 if ((ret = zfs_iter_filesystems(zhp, fix_mountpoint_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2049 altroot)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2050 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2051 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2052 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2053
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2054
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2055 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2056 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2057 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2058
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2059 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2060 * Function: be_mount_root
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2061 * Description: This function mounts the root dataset of a BE at the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2062 * specified altroot.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2063 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2064 * zhp - zfs_handle_t pointer to root dataset of a BE that is
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2065 * to be mounted at altroot.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2066 * altroot - location of where to mount the BE root.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2067 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2068 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2069 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2070 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2071 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2072 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2073 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2074 be_mount_root(zfs_handle_t *zhp, char *altroot)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2075 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2076 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2077
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2078 /* Get mountpoint property of dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2079 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2080 sizeof (mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2081 be_print_err(gettext("be_mount_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2082 "get mountpoint property for %s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2083 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2084 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2085 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2086
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2087 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2088 * Set the canmount property for the BE's root dataset to 'noauto' just
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2089 * in case it's been set to 'on'. We do this so that when we change its
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2090 * mountpoint, zfs won't immediately try to mount it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2091 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2092 if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_CANMOUNT), "noauto")
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2093 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2094 be_print_err(gettext("be_mount_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2095 "set canmount property to 'noauto' (%s): %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2096 zfs_get_name(zhp), libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2097 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2098 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2099
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2100 /* Set mountpoint for BE's root filesystem */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2101 if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT), altroot)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2102 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2103 be_print_err(gettext("be_mount_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2104 "set mountpoint of %s to %s: %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2105 zfs_get_name(zhp), altroot,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2106 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2107 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2108 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2109
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2110 /* Mount the BE's root filesystem */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2111 if (zfs_mount(zhp, NULL, 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2112 be_print_err(gettext("be_mount_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2113 "mount dataset %s at %s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2114 altroot, libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2115 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2116 * Set this BE's root filesystem 'mountpoint' property
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2117 * back to what it was before.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2118 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2119 (void) zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2120 mountpoint);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2121 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2122 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2123
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2124 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2125 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2126
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2127 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2128 * Function: be_unmount_root
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2129 * Description: This function unmounts the root dataset of a BE, but before
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2130 * unmounting, it looks at the BE's vfstab to determine
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2131 * if the root dataset mountpoint should be left as 'legacy'
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2132 * or '/'. If the vfstab contains an entry for this root
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2133 * dataset with a mountpoint of '/', it sets the mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2134 * property to 'legacy'.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2135 *
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2136 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2137 * zhp - zfs_handle_t pointer of the BE root dataset that
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2138 * is currently mounted.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2139 * ud - be_unmount_data_t pointer providing unmount data
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2140 * for the given BE root dataset.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2141 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2142 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2143 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2144 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2145 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2146 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2147 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2148 be_unmount_root(zfs_handle_t *zhp, be_unmount_data_t *ud)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2149 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2150 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2151 boolean_t is_legacy = B_FALSE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2152
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2153 /* See if this is a legacy mounted root */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2154 if (get_mountpoint_from_vfstab(ud->altroot, zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2155 mountpoint, sizeof (mountpoint), B_FALSE) == BE_SUCCESS &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2156 strcmp(mountpoint, "/") == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2157 is_legacy = B_TRUE;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2158 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2159
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2160 /* Unmount the dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2161 if (zfs_unmount(zhp, NULL, ud->force ? MS_FORCE : 0) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2162 be_print_err(gettext("be_unmount_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2163 "unmount BE root dataset %s: %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2164 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2165 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2166 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2167
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2168 /* Set canmount property for this BE's root filesystem to noauto */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2169 if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_CANMOUNT), "noauto")
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2170 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2171 be_print_err(gettext("be_unmount_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2172 "set canmount property for %s to 'noauto': %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2173 zfs_get_name(zhp), libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2174 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2175 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2176
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2177 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2178 * Set mountpoint for BE's root dataset back to '/', or 'legacy'
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2179 * if its a legacy mounted root.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2180 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2181 if (zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2182 is_legacy ? ZFS_MOUNTPOINT_LEGACY : "/") != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2183 be_print_err(gettext("be_unmount_root: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2184 "set mountpoint of %s to %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2185 is_legacy ? ZFS_MOUNTPOINT_LEGACY : "/");
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2186 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2187 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2188
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2189 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2190 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2191
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2192 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2193 * Function: fix_mountpoint
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2194 * Description: This function checks the mountpoint of an unmounted BE to make
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2195 * sure that it is set to either 'legacy' or '/'. If it's not,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2196 * then we're in a situation where an unmounted BE has some random
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2197 * mountpoint set for it. (This could happen if the system was
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2198 * rebooted while an inactive BE was mounted). This function
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2199 * attempts to fix its mountpoints.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2200 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2201 * zhp - zfs_handle_t pointer to root dataset of the BE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2202 * whose mountpoint needs to be checked.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2203 * Return:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2204 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2205 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2206 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2207 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2208 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2209 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2210 fix_mountpoint(zfs_handle_t *zhp)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2211 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2212 be_unmount_data_t ud = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2213 char *altroot = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2214 char mountpoint[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2215 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2216
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2217 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2218 * Record what this BE's root dataset mountpoint property is currently
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2219 * set to.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2220 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2221 if (zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2222 sizeof (mountpoint), NULL, NULL, 0, B_FALSE) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2223 be_print_err(gettext("fix_mountpoint: failed to get "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2224 "mountpoint property of (%s): %s\n"), zfs_get_name(zhp),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2225 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2226 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2227 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2228
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2229 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2230 * If the root dataset mountpoint is set to 'legacy' or '/', we're okay.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2231 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2232 if (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) == 0 ||
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2233 strcmp(mountpoint, "/") == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2234 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2235 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2236
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2237 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2238 * Iterate through this BE's children datasets and fix
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2239 * them if they need fixing.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2240 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2241 if (zfs_iter_filesystems(zhp, fix_mountpoint_callback, mountpoint)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2242 != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2243 return (BE_ERR_ZFS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2244 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2245
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2246 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2247 * The process of mounting and unmounting the root file system
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2248 * will fix its mountpoint to correctly be either 'legacy' or '/'
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2249 * since be_unmount_root will do the right thing by looking at
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2250 * its vfstab.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2251 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2252
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2253 /* Generate temporary altroot to mount the root file system */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2254 if ((ret = be_make_tmp_mountpoint(&altroot)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2255 be_print_err(gettext("fix_mountpoint: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2256 "make temporary mountpoint\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2257 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2258 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2259
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2260 /* Mount and unmount the root. */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2261 if ((ret = be_mount_root(zhp, altroot)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2262 be_print_err(gettext("fix_mountpoint: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2263 "mount BE root file system\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2264 goto cleanup;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2265 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2266 ud.altroot = altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2267 if ((ret = be_unmount_root(zhp, &ud)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2268 be_print_err(gettext("fix_mountpoint: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2269 "unmount BE root file system\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2270 goto cleanup;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2271 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2272
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2273 cleanup:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2274 free(altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2275
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2276 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2277 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2278
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2279 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2280 * Function: be_mount_zones
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2281 * Description: This function finds all supported non-global zones in the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2282 * given global BE and mounts them with respect to where the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2283 * global BE is currently mounted. The global BE datasets
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2284 * (including its shared datasets) are expected to already
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2285 * be mounted.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2286 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2287 * be_zhp - zfs_handle_t pointer to the root dataset of the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2288 * global BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2289 * md - be_mount_data_t pointer to data for global BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2290 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2291 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2292 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2293 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2294 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2295 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2296 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2297 be_mount_zones(zfs_handle_t *be_zhp, be_mount_data_t *md)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2298 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2299 zoneBrandList_t *brands = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2300 zoneList_t zlst = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2301 char *zonename = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2302 char *zonepath = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2303 char *zonepath_ds = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2304 int k;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2305 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2306
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2307 z_set_zone_root(md->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2308
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2309 if ((brands = be_get_supported_brandlist()) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2310 be_print_err(gettext("be_mount_zones: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2311 "no supported brands\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2312 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2313 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2314
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2315 zlst = z_get_nonglobal_zone_list_by_brand(brands);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2316 if (zlst == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2317 z_free_brand_list(brands);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2318 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2319 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2320
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2321 for (k = 0; (zonename = z_zlist_get_zonename(zlst, k)) != NULL; k++) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2322 if (z_zlist_get_current_state(zlst, k) ==
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2323 ZONE_STATE_INSTALLED) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2324 zonepath = z_zlist_get_zonepath(zlst, k);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2325
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2326 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2327 * Get the dataset of this zonepath in current BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2328 * If its not a dataset, skip it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2329 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2330 if ((zonepath_ds = be_get_ds_from_dir(zonepath))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2331 == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2332 continue;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2333
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2334 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2335 * Check if this zone is supported based on
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2336 * the dataset of its zonepath
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2337 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2338 if (!be_zone_supported(zonepath_ds)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2339 free(zonepath_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2340 zonepath_ds = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2341 continue;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2342 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2343
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2344 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2345 * if BE's shared file systems are already mounted,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2346 * zone path dataset would have already been lofs
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2347 * mounted under altroot. Otherwise, we need to do
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2348 * it here.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2349 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2350 if (!md->shared_fs) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2351 ret = loopback_mount_zonepath(zonepath, md);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2352 if (ret != BE_SUCCESS)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2353 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2354 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2355
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2356
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2357 /* Mount this zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2358 ret = be_mount_one_zone(be_zhp, md, zonename,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2359 zonepath, zonepath_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2360
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2361 free(zonepath_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2362 zonepath_ds = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2363
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2364 if (ret != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2365 be_print_err(gettext("be_mount_zones: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2366 "failed to mount zone %s under "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2367 "altroot %s\n"), zonename, md->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2368 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2369 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2370 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2371 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2372
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2373 done:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2374 z_free_brand_list(brands);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2375 z_free_zone_list(zlst);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2376 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2377 * libinstzones caches mnttab and uses cached version for resolving lofs
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2378 * mounts when we call z_resolve_lofs. It creates the cached version
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2379 * when the first call to z_resolve_lofs happens. So, library's cached
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2380 * mnttab doesn't contain entries for lofs mounts created in the above
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2381 * loop. Because of this, subsequent calls to z_resolve_lofs would fail
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2382 * to resolve these lofs mounts. So, here we destroy library's cached
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2383 * mnttab to force its recreation when the next call to z_resolve_lofs
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2384 * happens.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2385 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2386 z_destroyMountTable();
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2387 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2388 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2389
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2390 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2391 * Function: be_unmount_zones
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2392 * Description: This function finds all supported non-global zones in the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2393 * given mounted global BE and unmounts them.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2394 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2395 * ud - unmount_data_t pointer data for the global BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2396 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2397 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2398 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2399 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2400 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2401 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2402 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2403 be_unmount_zones(be_unmount_data_t *ud)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2404 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2405 zoneBrandList_t *brands = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2406 zoneList_t zlst = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2407 char *zonename = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2408 char *zonepath = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2409 char alt_zonepath[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2410 char *zonepath_ds = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2411 int k;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2412 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2413
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2414 z_set_zone_root(ud->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2415
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2416 if ((brands = be_get_supported_brandlist()) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2417 be_print_err(gettext("be_unmount_zones: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2418 "no supported brands\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2419 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2420 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2421
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2422 zlst = z_get_nonglobal_zone_list_by_brand(brands);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2423 if (zlst == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2424 z_free_brand_list(brands);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2425 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2426 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2427
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2428 for (k = 0; (zonename = z_zlist_get_zonename(zlst, k)) != NULL; k++) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2429 if (z_zlist_get_current_state(zlst, k) ==
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2430 ZONE_STATE_INSTALLED) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2431 zonepath = z_zlist_get_zonepath(zlst, k);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2432
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2433 /* Build zone's zonepath wrt the global BE altroot */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2434 (void) snprintf(alt_zonepath, sizeof (alt_zonepath),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2435 "%s%s", ud->altroot, zonepath);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2436
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2437 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2438 * Get the dataset of this zonepath. If its not
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2439 * a dataset, skip it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2440 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2441 if ((zonepath_ds = be_get_ds_from_dir(alt_zonepath))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2442 == NULL)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2443 continue;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2444
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2445 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2446 * Check if this zone is supported based on the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2447 * dataset of its zonepath.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2448 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2449 if (!be_zone_supported(zonepath_ds)) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2450 free(zonepath_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2451 zonepath_ds = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2452 continue;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2453 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2454
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2455 /* Unmount this zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2456 ret = be_unmount_one_zone(ud, zonename, zonepath,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2457 zonepath_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2458
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2459 free(zonepath_ds);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2460 zonepath_ds = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2461
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2462 if (ret != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2463 be_print_err(gettext("be_unmount_zones:"
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2464 " failed to unmount zone %s from "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2465 "altroot %s\n"), zonename, ud->altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2466 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2467 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2468 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2469 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2470
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2471 done:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2472 z_free_brand_list(brands);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2473 z_free_zone_list(zlst);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2474 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2475 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2476
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2477 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2478 * Function: be_mount_one_zone
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2479 * Description: This function is called to mount one zone for a given
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2480 * global BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2481 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2482 * be_zhp - zfs_handle_t pointer to the root dataset of the
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2483 * global BE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2484 * md - be_mount_data_t pointer to data for global BE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2485 * zonename - name of zone to mount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2486 * zonepath - zonepath of zone to mount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2487 * zonepath_ds - dataset for the zonepath
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2488 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2489 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2490 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2491 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2492 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2493 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2494 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2495 be_mount_one_zone(zfs_handle_t *be_zhp, be_mount_data_t *md, char *zonename,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2496 char *zonepath, char *zonepath_ds)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2497 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2498 be_mount_data_t zone_md = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2499 zfs_handle_t *zone_zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2500 char zone_altroot[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2501 char zoneroot[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2502 char zoneroot_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2503 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2504
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2505 /* Find the active zone root dataset for this zone for this BE */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2506 if ((ret = be_find_active_zone_root(be_zhp, zonepath_ds, zoneroot_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2507 sizeof (zoneroot_ds))) == BE_ERR_ZONE_NO_ACTIVE_ROOT) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2508 be_print_err(gettext("be_mount_one_zone: did not "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2509 "find active zone root for zone %s, skipping ...\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2510 zonename);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2511 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2512 } else if (ret != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2513 be_print_err(gettext("be_mount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2514 "find active zone root for zone %s\n"), zonename);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2515 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2516 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2517
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2518 /* Get handle to active zoneroot dataset */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2519 if ((zone_zhp = zfs_open(g_zfs, zoneroot_ds, ZFS_TYPE_FILESYSTEM))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2520 == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2521 be_print_err(gettext("be_mount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2522 "open zone root dataset (%s): %s\n"), zoneroot_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2523 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2524 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2525 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2526
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2527 /* Generate string for zone's altroot path */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2528 be_make_zoneroot(zonepath, zoneroot, sizeof (zoneroot));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2529 (void) strlcpy(zone_altroot, md->altroot, sizeof (zone_altroot));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2530 (void) strlcat(zone_altroot, zoneroot, sizeof (zone_altroot));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2531
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2532 /* Build mount_data for the zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2533 zone_md.altroot = zone_altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2534 zone_md.shared_fs = md->shared_fs;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2535 zone_md.shared_rw = md->shared_rw;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2536
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2537 /* Mount the zone's root file system */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2538 if ((ret = be_mount_zone_root(zone_zhp, &zone_md)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2539 be_print_err(gettext("be_mount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2540 "mount zone root file system at %s\n"), zone_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2541 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2542 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2543
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2544 /* Iterate through zone's children filesystems */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2545 if ((ret = zfs_iter_filesystems(zone_zhp, be_mount_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2546 zone_altroot)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2547 be_print_err(gettext("be_mount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2548 "mount zone subordinate file systems at %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2549 zone_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2550 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2551 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2552
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2553 /* TODO: Mount all shared file systems for this zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2554
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2555 done:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2556 ZFS_CLOSE(zone_zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2557 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2558 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2559
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2560 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2561 * Function: be_unmount_one_zone
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2562 * Description: This function unmount one zone for a give global BE.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2563 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2564 * ud - be_unmount_data_t pointer to data for global BE
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2565 * zonename - name of zone to unmount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2566 * zonepath - zonepath of the zone to unmount
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2567 * zonepath_ds - dataset for the zonepath
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2568 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2569 * BE_SUCCESS - Success
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2570 * be_errno_t - Failure
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2571 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2572 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2573 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2574 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2575 be_unmount_one_zone(be_unmount_data_t *ud, char *zonename, char *zonepath,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2576 char *zonepath_ds)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2577 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2578 be_unmount_data_t zone_ud = { 0 };
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2579 zfs_handle_t *zone_zhp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2580 char zone_altroot[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2581 char zoneroot[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2582 char zoneroot_ds[MAXPATHLEN];
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2583 int ret = BE_SUCCESS;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2584
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2585 /* Generate string for zone's alternate root path */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2586 be_make_zoneroot(zonepath, zoneroot, sizeof (zoneroot));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2587 (void) strlcpy(zone_altroot, ud->altroot, sizeof (zone_altroot));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2588 (void) strlcat(zone_altroot, zoneroot, sizeof (zone_altroot));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2589
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2590 /* Build be_unmount_data for zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2591 zone_ud.altroot = zone_altroot;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2592 zone_ud.force = ud->force;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2593
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2594 /* Find the mounted zone root dataset for this zone for this BE */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2595 if ((ret = be_find_mounted_zone_root(zone_altroot, zonepath_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2596 zoneroot_ds, sizeof (zoneroot_ds))) == BE_ERR_NO_MOUNTED_ZONE) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2597 be_print_err(gettext("be_unmount_one_zone: did not "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2598 "find any zone root mounted for zone %s\n"), zonename);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2599 return (BE_SUCCESS);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2600 } else if (ret != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2601 be_print_err(gettext("be_unmount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2602 "find mounted zone root for zone %s\n"), zonename);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2603 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2604 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2605
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2606 /* Get handle to zoneroot dataset mounted for this BE */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2607 if ((zone_zhp = zfs_open(g_zfs, zoneroot_ds, ZFS_TYPE_FILESYSTEM))
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2608 == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2609 be_print_err(gettext("be_unmount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2610 "open mounted zone root dataset (%s): %s\n"), zoneroot_ds,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2611 libzfs_error_description(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2612 return (zfs_err_to_be_err(g_zfs));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2613 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2614
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2615 /* TODO: Unmount all shared file systems for this zone */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2616
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2617 /* Iterate through zone's children filesystems and unmount them */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2618 if ((ret = zfs_iter_filesystems(zone_zhp, be_unmount_callback,
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2619 &zone_ud)) != 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2620 be_print_err(gettext("be_unmount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2621 "unmount zone subordinate file systems at %s\n"),
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2622 zone_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2623 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2624 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2625
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2626 /* Unmount the zone's root filesystem */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2627 if ((ret = be_unmount_zone_root(zone_zhp, &zone_ud)) != BE_SUCCESS) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2628 be_print_err(gettext("be_unmount_one_zone: failed to "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2629 "unmount zone root file system at %s\n"), zone_altroot);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2630 goto done;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2631 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2632
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2633 done:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2634 ZFS_CLOSE(zone_zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2635 return (ret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2636 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2637
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2638 /*
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2639 * Function: be_get_ds_from_dir_callback
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2640 * Description: This is a callback function used to iterate all datasets
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2641 * to find the one that is currently mounted at the directory
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2642 * being searched for. If matched, the name of the dataset is
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2643 * returned in heap storage, so the caller is responsible for
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2644 * freeing it.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2645 * Parameters:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2646 * zhp - zfs_handle_t pointer to current dataset being processed.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2647 * data - dir_data_t pointer providing name of directory being
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2648 * searched for.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2649 * Returns:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2650 * 1 - This dataset is mounted at directory being searched for.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2651 * 0 - This dataset is not mounted at directory being searched for.
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2652 * Scope:
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2653 * Private
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2654 */
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2655 static int
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2656 be_get_ds_from_dir_callback(zfs_handle_t *zhp, void *data)
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2657 {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2658 dir_data_t *dd = data;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2659 char *mp = NULL;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2660 int zret = 0;
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2661
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2662 if (zfs_get_type(zhp) != ZFS_TYPE_FILESYSTEM) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2663 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2664 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2665 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2666
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2667 if (zfs_is_mounted(zhp, &mp) && mp != NULL &&
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2668 strcmp(mp, dd->dir) == 0) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2669 if ((dd->ds = strdup(zfs_get_name(zhp))) == NULL) {
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2670 be_print_err(gettext("be_get_ds_from_dir_callback: "
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2671 "memory allocation failed\n"));
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2672 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2673 return (0);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2674 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2675 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2676 return (1);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2677 }
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2678
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2679 zret = zfs_iter_filesystems(zhp, be_get_ds_from_dir_callback, dd);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2680
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2681 ZFS_CLOSE(zhp);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2682
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2683 return (zret);
3c7681e3e323 PSARC 2010/059 SNAP BE Management
Glenn Lagasse <glenn.lagasse@oracle.com>
parents:
diff changeset
2684 }