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