annotate usr/src/uts/common/fs/zfs/zfs_ioctl.c @ 3444:dc160a70a50d

6410433 'zpool status -v' would be more useful with filenames 6504702 zdb -dddv <poolname> chokes on xattrs 6506506 spa_history.c: LE_64(reclen) needs to be cast to uint64_t in case of 32-bit big-endian kernel
author ek110237
date Thu, 18 Jan 2007 14:25:26 -0800
parents 967e0fca6143
children 6b28ebc717aa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
2 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
3 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1356
diff changeset
5 * Common Development and Distribution License (the "License").
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1356
diff changeset
6 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
7 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
10 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
11 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
12 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
18 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
19 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
20 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
21 /*
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
23 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
24 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
26 #pragma ident "%Z%%M% %I% %E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
28 #include <sys/types.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
29 #include <sys/param.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
30 #include <sys/errno.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
31 #include <sys/uio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
32 #include <sys/buf.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
33 #include <sys/modctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
34 #include <sys/open.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
35 #include <sys/file.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
36 #include <sys/kmem.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
37 #include <sys/conf.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
38 #include <sys/cmn_err.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
39 #include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
40 #include <sys/zfs_ioctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
41 #include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
42 #include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
43 #include <sys/vdev.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
44 #include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
45 #include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
46 #include <sys/dsl_dataset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
47 #include <sys/dsl_prop.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
48 #include <sys/ddi.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
49 #include <sys/sunddi.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
50 #include <sys/sunldi.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
51 #include <sys/policy.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
52 #include <sys/zone.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
53 #include <sys/nvpair.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
54 #include <sys/pathname.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
55 #include <sys/mount.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
56 #include <sys/sdt.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
57 #include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
58 #include <sys/zfs_ctldir.h>
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
59 #include <sys/zvol.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
60
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
61 #include "zfs_namecheck.h"
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
62 #include "zfs_prop.h"
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
63
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
64 extern struct modlfs zfs_modlfs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
65
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
66 extern void zfs_init(void);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
67 extern void zfs_fini(void);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
68
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
69 ldi_ident_t zfs_li = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
70 dev_info_t *zfs_dip;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
71
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
72 typedef int zfs_ioc_func_t(zfs_cmd_t *);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
73 typedef int zfs_secpolicy_func_t(const char *, cred_t *);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
74
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
75 typedef struct zfs_ioc_vec {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
76 zfs_ioc_func_t *zvec_func;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
77 zfs_secpolicy_func_t *zvec_secpolicy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
78 enum {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
79 no_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
80 pool_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
81 dataset_name
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
82 } zvec_namecheck;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
83 } zfs_ioc_vec_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
84
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
85 /* _NOTE(PRINTFLIKE(4)) - this is printf-like, but lint is too whiney */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
86 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
87 __dprintf(const char *file, const char *func, int line, const char *fmt, ...)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
88 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
89 const char *newfile;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
90 char buf[256];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
91 va_list adx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
92
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
93 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
94 * Get rid of annoying "../common/" prefix to filename.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
95 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
96 newfile = strrchr(file, '/');
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
97 if (newfile != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
98 newfile = newfile + 1; /* Get rid of leading / */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
99 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
100 newfile = file;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
101 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
102
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
103 va_start(adx, fmt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
104 (void) vsnprintf(buf, sizeof (buf), fmt, adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
105 va_end(adx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
106
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
107 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
108 * To get this data, use the zfs-dprintf probe as so:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
109 * dtrace -q -n 'zfs-dprintf \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
110 * /stringof(arg0) == "dbuf.c"/ \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
111 * {printf("%s: %s", stringof(arg1), stringof(arg3))}'
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
112 * arg0 = file name
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
113 * arg1 = function name
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
114 * arg2 = line number
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
115 * arg3 = message
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
116 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
117 DTRACE_PROBE4(zfs__dprintf,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
118 char *, newfile, char *, func, int, line, char *, buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
119 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
120
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
121 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
122 * Policy for top-level read operations (list pools). Requires no privileges,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
123 * and can be used in the local zone, as there is no associated dataset.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
124 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
125 /* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
126 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
127 zfs_secpolicy_none(const char *unused1, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
128 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
129 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
130 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
131
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
132 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
133 * Policy for dataset read operations (list children, get statistics). Requires
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
134 * no privileges, but must be visible in the local zone.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
135 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
136 /* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
137 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
138 zfs_secpolicy_read(const char *dataset, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
139 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
140 if (INGLOBALZONE(curproc) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
141 zone_dataset_visible(dataset, NULL))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
142 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
143
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
144 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
145 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
146
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
147 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
148 zfs_dozonecheck(const char *dataset, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
149 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
150 uint64_t zoned;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
151 int writable = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
152
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
153 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
154 * The dataset must be visible by this zone -- check this first
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
155 * so they don't see EPERM on something they shouldn't know about.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
156 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
157 if (!INGLOBALZONE(curproc) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
158 !zone_dataset_visible(dataset, &writable))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
159 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
160
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
161 if (dsl_prop_get_integer(dataset, "zoned", &zoned, NULL))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
162 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
163
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
164 if (INGLOBALZONE(curproc)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
165 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
166 * If the fs is zoned, only root can access it from the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
167 * global zone.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
168 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
169 if (secpolicy_zfs(cr) && zoned)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
170 return (EPERM);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
171 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
172 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
173 * If we are in a local zone, the 'zoned' property must be set.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
174 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
175 if (!zoned)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
176 return (EPERM);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
177
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
178 /* must be writable by this zone */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
179 if (!writable)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
180 return (EPERM);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
181 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
182 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
183 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
184
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
185 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
186 * Policy for dataset write operations (create children, set properties, etc).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
187 * Requires SYS_MOUNT privilege, and must be writable in the local zone.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
188 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
189 int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
190 zfs_secpolicy_write(const char *dataset, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
191 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
192 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
193
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
194 if (error = zfs_dozonecheck(dataset, cr))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
195 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
196
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
197 return (secpolicy_zfs(cr));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
198 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
199
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
200 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
201 * Policy for operations that want to write a dataset's parent:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
202 * create, destroy, snapshot, clone, restore.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
203 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
204 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
205 zfs_secpolicy_parent(const char *dataset, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
206 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
207 char parentname[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
208 char *cp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
209
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
210 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
211 * Remove the @bla or /bla from the end of the name to get the parent.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
212 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
213 (void) strncpy(parentname, dataset, sizeof (parentname));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
214 cp = strrchr(parentname, '@');
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
215 if (cp != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
216 cp[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
217 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
218 cp = strrchr(parentname, '/');
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
219 if (cp == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
220 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
221 cp[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
222
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
223 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
224
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
225 return (zfs_secpolicy_write(parentname, cr));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
226 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
227
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
228 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
229 * Policy for pool operations - create/destroy pools, add vdevs, etc. Requires
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
230 * SYS_CONFIG privilege, which is not available in a local zone.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
231 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
232 /* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
233 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
234 zfs_secpolicy_config(const char *unused, cred_t *cr)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
235 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
236 if (secpolicy_sys_config(cr, B_FALSE) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
237 return (EPERM);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
239 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
240 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
241
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
242 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
243 * Policy for fault injection. Requires all privileges.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
244 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
245 /* ARGSUSED */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
246 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
247 zfs_secpolicy_inject(const char *unused, cred_t *cr)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
248 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
249 return (secpolicy_zinject(cr));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
250 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
251
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
252 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
253 * Returns the nvlist as specified by the user in the zfs_cmd_t.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
254 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
255 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
256 get_nvlist(zfs_cmd_t *zc, nvlist_t **nvp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
257 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
258 char *packed;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
259 size_t size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
260 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
261 nvlist_t *config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
262
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
263 /*
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
264 * Read in and unpack the user-supplied nvlist.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
265 */
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
266 if ((size = zc->zc_nvlist_src_size) == 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
267 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
268
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
269 packed = kmem_alloc(size, KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
270
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
271 if ((error = xcopyin((void *)(uintptr_t)zc->zc_nvlist_src, packed,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
272 size)) != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
273 kmem_free(packed, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
274 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
275 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
276
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
277 if ((error = nvlist_unpack(packed, size, &config, 0)) != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
278 kmem_free(packed, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
279 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
280 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
281
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
282 kmem_free(packed, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
283
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
284 *nvp = config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
285 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
286 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
287
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
288 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
289 put_nvlist(zfs_cmd_t *zc, nvlist_t *nvl)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
290 {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
291 char *packed = NULL;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
292 size_t size;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
293 int error;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
294
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
295 VERIFY(nvlist_size(nvl, &size, NV_ENCODE_NATIVE) == 0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
296
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
297 if (size > zc->zc_nvlist_dst_size) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
298 error = ENOMEM;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
299 } else {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
300 VERIFY(nvlist_pack(nvl, &packed, &size, NV_ENCODE_NATIVE,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
301 KM_SLEEP) == 0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
302 error = xcopyout(packed, (void *)(uintptr_t)zc->zc_nvlist_dst,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
303 size);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
304 kmem_free(packed, size);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
305 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
306
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
307 zc->zc_nvlist_dst_size = size;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
308 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
309 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
310
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
311 static int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
312 zfs_ioc_pool_create(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
313 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
314 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
315 nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
316
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
317 if ((error = get_nvlist(zc, &config)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
318 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
319
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
320 error = spa_create(zc->zc_name, config, zc->zc_value[0] == '\0' ?
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
321 NULL : zc->zc_value);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
322
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
323 nvlist_free(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
324
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
325 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
326 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
327
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
328 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
329 zfs_ioc_pool_destroy(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
330 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
331 return (spa_destroy(zc->zc_name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
332 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
333
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
334 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
335 zfs_ioc_pool_import(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
336 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
337 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
338 nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
339 uint64_t guid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
340
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
341 if ((error = get_nvlist(zc, &config)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
342 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
343
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
344 if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &guid) != 0 ||
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
345 guid != zc->zc_guid)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
346 error = EINVAL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
347 else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
348 error = spa_import(zc->zc_name, config,
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
349 zc->zc_value[0] == '\0' ? NULL : zc->zc_value);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
350
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
351 nvlist_free(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
352
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
353 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
354 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
355
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
356 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
357 zfs_ioc_pool_export(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
358 {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1760
diff changeset
359 return (spa_export(zc->zc_name, NULL));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
360 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
361
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
362 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
363 zfs_ioc_pool_configs(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
364 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
365 nvlist_t *configs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
366 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
367
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
368 if ((configs = spa_all_configs(&zc->zc_cookie)) == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
369 return (EEXIST);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
370
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
371 error = put_nvlist(zc, configs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
372
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
373 nvlist_free(configs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
374
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
375 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
376 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
377
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
378 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
379 zfs_ioc_pool_stats(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
380 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
381 nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
382 int error;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
383 int ret = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
384
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
385 error = spa_get_stats(zc->zc_name, &config, zc->zc_value,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
386 sizeof (zc->zc_value));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
387
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
388 if (config != NULL) {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
389 ret = put_nvlist(zc, config);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
390 nvlist_free(config);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
391
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
392 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
393 * The config may be present even if 'error' is non-zero.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
394 * In this case we return success, and preserve the real errno
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
395 * in 'zc_cookie'.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
396 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
397 zc->zc_cookie = error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
398 } else {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
399 ret = error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
400 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
401
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
402 return (ret);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
403 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
404
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
405 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
406 * Try to import the given pool, returning pool stats as appropriate so that
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
407 * user land knows which devices are available and overall pool health.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
408 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
409 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
410 zfs_ioc_pool_tryimport(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
411 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
412 nvlist_t *tryconfig, *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
413 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
414
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
415 if ((error = get_nvlist(zc, &tryconfig)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
416 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
417
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
418 config = spa_tryimport(tryconfig);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
419
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
420 nvlist_free(tryconfig);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
421
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
422 if (config == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
423 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
424
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
425 error = put_nvlist(zc, config);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
426 nvlist_free(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
427
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
428 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
429 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
430
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
431 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
432 zfs_ioc_pool_scrub(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
433 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
434 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
435 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
436
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
437 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
438 return (error);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
439
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
440 error = spa_scrub(spa, zc->zc_cookie, B_FALSE);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
441
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
442 spa_close(spa, FTAG);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
443
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
444 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
445 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
446
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
447 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
448 zfs_ioc_pool_freeze(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
449 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
450 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
451 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
452
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
453 error = spa_open(zc->zc_name, &spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
454 if (error == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
455 spa_freeze(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
456 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
457 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
458 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
459 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
460
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
461 static int
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
462 zfs_ioc_pool_upgrade(zfs_cmd_t *zc)
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
463 {
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
464 spa_t *spa;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
465 int error;
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
466
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
467 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
468 return (error);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
469
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
470 spa_upgrade(spa);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
471
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
472 spa_close(spa, FTAG);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
473
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
474 return (error);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
475 }
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
476
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
477 static int
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
478 zfs_ioc_pool_get_history(zfs_cmd_t *zc)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
479 {
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
480 spa_t *spa;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
481 char *hist_buf;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
482 uint64_t size;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
483 int error;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
484
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
485 if ((size = zc->zc_history_len) == 0)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
486 return (EINVAL);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
487
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
488 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
489 return (error);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
490
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
491 hist_buf = kmem_alloc(size, KM_SLEEP);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
492 if ((error = spa_history_get(spa, &zc->zc_history_offset,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
493 &zc->zc_history_len, hist_buf)) == 0) {
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
494 error = xcopyout(hist_buf, (char *)(uintptr_t)zc->zc_history,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
495 zc->zc_history_len);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
496 }
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
497
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
498 spa_close(spa, FTAG);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
499 kmem_free(hist_buf, size);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
500 return (error);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
501 }
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
502
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
503 static int
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
504 zfs_ioc_pool_log_history(zfs_cmd_t *zc)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
505 {
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
506 spa_t *spa;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
507 char *history_str = NULL;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
508 size_t size;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
509 int error;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
510
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
511 size = zc->zc_history_len;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
512 if (size == 0 || size > HIS_MAX_RECORD_LEN)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
513 return (EINVAL);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
514
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
515 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
516 return (error);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
517
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
518 /* add one for the NULL delimiter */
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
519 size++;
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
520 history_str = kmem_alloc(size, KM_SLEEP);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
521 if ((error = xcopyin((void *)(uintptr_t)zc->zc_history, history_str,
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
522 size)) != 0) {
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
523 spa_close(spa, FTAG);
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
524 kmem_free(history_str, size);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
525 return (error);
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
526 }
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
527 history_str[size - 1] = '\0';
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
528
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
529 error = spa_history_log(spa, history_str, zc->zc_history_offset);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
530
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
531 spa_close(spa, FTAG);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
532 kmem_free(history_str, size);
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
533
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
534 return (error);
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
535 }
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
536
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
537 static int
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
538 zfs_ioc_dsobj_to_dsname(zfs_cmd_t *zc)
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
539 {
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
540 spa_t *spa;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
541 dsl_pool_t *dp;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
542 dsl_dataset_t *ds = NULL;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
543 int error;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
544
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
545 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
546 return (error);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
547 dp = spa_get_dsl(spa);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
548 rw_enter(&dp->dp_config_rwlock, RW_READER);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
549 if ((error = dsl_dataset_open_obj(dp, zc->zc_obj,
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
550 NULL, DS_MODE_NONE, FTAG, &ds)) != 0) {
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
551 rw_exit(&dp->dp_config_rwlock);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
552 spa_close(spa, FTAG);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
553 return (error);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
554 }
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
555 dsl_dataset_name(ds, zc->zc_value);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
556 dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
557 rw_exit(&dp->dp_config_rwlock);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
558 spa_close(spa, FTAG);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
559
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
560 return (0);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
561 }
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
562
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
563 static int
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
564 zfs_ioc_obj_to_path(zfs_cmd_t *zc)
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
565 {
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
566 objset_t *osp;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
567 int error;
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
568
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
569 if ((error = dmu_objset_open(zc->zc_name, DMU_OST_ZFS,
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
570 DS_MODE_NONE | DS_MODE_READONLY, &osp)) != 0)
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
571 return (error);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
572
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
573 error = zfs_obj_to_path(osp, zc->zc_obj, zc->zc_value,
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
574 sizeof (zc->zc_value));
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
575 dmu_objset_close(osp);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
576
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
577 return (error);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
578 }
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
579
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
580 static int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
581 zfs_ioc_vdev_add(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
582 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
583 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
584 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
585 nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
586
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
587 error = spa_open(zc->zc_name, &spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
588 if (error != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
589 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
590
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
591 if ((error = get_nvlist(zc, &config)) == 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
592 error = spa_vdev_add(spa, config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
593 nvlist_free(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
594 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
595
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
596 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
597 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
598 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
599
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
600 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
601 zfs_ioc_vdev_remove(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
602 {
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
603 spa_t *spa;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
604 int error;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
605
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
606 error = spa_open(zc->zc_name, &spa, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
607 if (error != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
608 return (error);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
609 error = spa_vdev_remove(spa, zc->zc_guid, B_FALSE);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
610 spa_close(spa, FTAG);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
611 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
612 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
613
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
614 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
615 zfs_ioc_vdev_online(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
616 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
617 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
618 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
619
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
620 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
621 return (error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
622 error = vdev_online(spa, zc->zc_guid);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
623 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
624 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
625 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
626
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
627 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
628 zfs_ioc_vdev_offline(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
629 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
630 spa_t *spa;
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1356
diff changeset
631 int istmp = zc->zc_cookie;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
632 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
633
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
634 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
635 return (error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
636 error = vdev_offline(spa, zc->zc_guid, istmp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
637 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
638 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
639 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
640
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
641 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
642 zfs_ioc_vdev_attach(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
643 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
644 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
645 int replacing = zc->zc_cookie;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
646 nvlist_t *config;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
647 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
648
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
649 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
650 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
651
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
652 if ((error = get_nvlist(zc, &config)) == 0) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
653 error = spa_vdev_attach(spa, zc->zc_guid, config, replacing);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
654 nvlist_free(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
655 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
656
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
657 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
658 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
659 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
660
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
661 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
662 zfs_ioc_vdev_detach(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
663 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
664 spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
665 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
666
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
667 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
668 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
669
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
670 error = spa_vdev_detach(spa, zc->zc_guid, B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
671
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
672 spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
673 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
674 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
675
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
676 static int
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
677 zfs_ioc_vdev_setpath(zfs_cmd_t *zc)
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
678 {
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
679 spa_t *spa;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
680 char *path = zc->zc_value;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
681 uint64_t guid = zc->zc_guid;
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
682 int error;
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
683
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
684 error = spa_open(zc->zc_name, &spa, FTAG);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
685 if (error != 0)
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
686 return (error);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
687
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
688 error = spa_vdev_setpath(spa, guid, path);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
689 spa_close(spa, FTAG);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
690 return (error);
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
691 }
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
692
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
693 static int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
694 zfs_ioc_objset_stats(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
695 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
696 objset_t *os = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
697 int error;
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 1354
diff changeset
698 nvlist_t *nv;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
699
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
700 retry:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
701 error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
702 DS_MODE_STANDARD | DS_MODE_READONLY, &os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
703 if (error != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
704 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
705 * This is ugly: dmu_objset_open() can return EBUSY if
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
706 * the objset is held exclusively. Fortunately this hold is
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
707 * only for a short while, so we retry here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
708 * This avoids user code having to handle EBUSY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
709 * for example for a "zfs list".
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
710 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
711 if (error == EBUSY) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
712 delay(1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
713 goto retry;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
714 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
715 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
716 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
717
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
718 dmu_objset_fast_stat(os, &zc->zc_objset_stats);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
719
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2717
diff changeset
720 if (zc->zc_nvlist_dst != 0 &&
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 1354
diff changeset
721 (error = dsl_prop_get_all(os, &nv)) == 0) {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
722 dmu_objset_stats(os, nv);
3087
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
723 /*
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
724 * NB: zvol_get_stats() will read the objset contents,
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
725 * which we aren't supposed to do with a
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
726 * DS_MODE_STANDARD open, because it could be
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
727 * inconsistent. So this is a bit of a workaround...
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
728 */
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
729 if (!zc->zc_objset_stats.dds_inconsistent &&
62df4acfd5cb 6468748 assertion failure in dnode_sync
ahrens
parents: 2926
diff changeset
730 dmu_objset_type(os) == DMU_OST_ZVOL)
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
731 VERIFY(zvol_get_stats(os, nv) == 0);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
732 error = put_nvlist(zc, nv);
1356
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 1354
diff changeset
733 nvlist_free(nv);
e021b5e4aa0e 6377671 zfs mount -a shouldn't bother checking snapshots
eschrock
parents: 1354
diff changeset
734 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
735
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
736 spa_altroot(dmu_objset_spa(os), zc->zc_value, sizeof (zc->zc_value));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
737
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
738 dmu_objset_close(os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
739 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
740 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
741
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
742 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
743 zfs_ioc_dataset_list_next(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
744 {
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
745 objset_t *os;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
746 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
747 char *p;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
748
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
749 retry:
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
750 error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
751 DS_MODE_STANDARD | DS_MODE_READONLY, &os);
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
752 if (error != 0) {
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
753 /*
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
754 * This is ugly: dmu_objset_open() can return EBUSY if
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
755 * the objset is held exclusively. Fortunately this hold is
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
756 * only for a short while, so we retry here.
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
757 * This avoids user code having to handle EBUSY,
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
758 * for example for a "zfs list".
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
759 */
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
760 if (error == EBUSY) {
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
761 delay(1);
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
762 goto retry;
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
763 }
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
764 if (error == ENOENT)
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
765 error = ESRCH;
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
766 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
767 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
768
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
769 p = strrchr(zc->zc_name, '/');
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
770 if (p == NULL || p[1] != '\0')
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
771 (void) strlcat(zc->zc_name, "/", sizeof (zc->zc_name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
772 p = zc->zc_name + strlen(zc->zc_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
773
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
774 do {
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
775 error = dmu_dir_list_next(os,
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
776 sizeof (zc->zc_name) - (p - zc->zc_name), p,
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
777 NULL, &zc->zc_cookie);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
778 if (error == ENOENT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
779 error = ESRCH;
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
780 } while (error == 0 && !INGLOBALZONE(curproc) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
781 !zone_dataset_visible(zc->zc_name, NULL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
782
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
783 /*
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
784 * If it's a hidden dataset (ie. with a '$' in its name), don't
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
785 * try to get stats for it. Userland will skip over it.
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
786 */
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
787 if (error == 0 && strchr(zc->zc_name, '$') == NULL)
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
788 error = zfs_ioc_objset_stats(zc); /* fill in the stats */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
789
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
790 dmu_objset_close(os);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
791 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
792 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
793
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
794 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
795 zfs_ioc_snapshot_list_next(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
796 {
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
797 objset_t *os;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
798 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
799
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
800 retry:
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
801 error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
802 DS_MODE_STANDARD | DS_MODE_READONLY, &os);
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
803 if (error != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
804 /*
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
805 * This is ugly: dmu_objset_open() can return EBUSY if
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
806 * the objset is held exclusively. Fortunately this hold is
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
807 * only for a short while, so we retry here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
808 * This avoids user code having to handle EBUSY,
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
809 * for example for a "zfs list".
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
810 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
811 if (error == EBUSY) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
812 delay(1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
813 goto retry;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
814 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
815 if (error == ENOENT)
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
816 error = ESRCH;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
817 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
818 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
819
1003
ce99098d6a9b 6350417 long name will cause rename a dataset panic
lling
parents: 885
diff changeset
820 /*
ce99098d6a9b 6350417 long name will cause rename a dataset panic
lling
parents: 885
diff changeset
821 * A dataset name of maximum length cannot have any snapshots,
ce99098d6a9b 6350417 long name will cause rename a dataset panic
lling
parents: 885
diff changeset
822 * so exit immediately.
ce99098d6a9b 6350417 long name will cause rename a dataset panic
lling
parents: 885
diff changeset
823 */
ce99098d6a9b 6350417 long name will cause rename a dataset panic
lling
parents: 885
diff changeset
824 if (strlcat(zc->zc_name, "@", sizeof (zc->zc_name)) >= MAXNAMELEN) {
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
825 dmu_objset_close(os);
1003
ce99098d6a9b 6350417 long name will cause rename a dataset panic
lling
parents: 885
diff changeset
826 return (ESRCH);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
827 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
828
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
829 error = dmu_snapshot_list_next(os,
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
830 sizeof (zc->zc_name) - strlen(zc->zc_name),
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
831 zc->zc_name + strlen(zc->zc_name), NULL, &zc->zc_cookie);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
832 if (error == ENOENT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
833 error = ESRCH;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
834
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
835 if (error == 0)
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
836 error = zfs_ioc_objset_stats(zc); /* fill in the stats */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
837
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 849
diff changeset
838 dmu_objset_close(os);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
839 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
840 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
841
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
842 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
843 zfs_set_prop_nvlist(const char *name, dev_t dev, cred_t *cr, nvlist_t *nvl)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
844 {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
845 nvpair_t *elem;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
846 int error;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
847 const char *propname;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
848 zfs_prop_t prop;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
849 uint64_t intval;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
850 char *strval;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
851
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
852 elem = NULL;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
853 while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
854 propname = nvpair_name(elem);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
855
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
856 if ((prop = zfs_name_to_prop(propname)) ==
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
857 ZFS_PROP_INVAL) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
858 /*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
859 * If this is a user-defined property, it must be a
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
860 * string, and there is no further validation to do.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
861 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
862 if (!zfs_prop_user(propname) ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
863 nvpair_type(elem) != DATA_TYPE_STRING)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
864 return (EINVAL);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
865
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
866 VERIFY(nvpair_value_string(elem, &strval) == 0);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
867 error = dsl_prop_set(name, propname, 1,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
868 strlen(strval) + 1, strval);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
869 if (error == 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
870 continue;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
871 else
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
872 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
873 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
874
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
875 /*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
876 * Check permissions for special properties.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
877 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
878 switch (prop) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
879 case ZFS_PROP_ZONED:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
880 /*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
881 * Disallow setting of 'zoned' from within a local zone.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
882 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
883 if (!INGLOBALZONE(curproc))
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
884 return (EPERM);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
885 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
886
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
887 case ZFS_PROP_QUOTA:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
888 if (error = zfs_dozonecheck(name, cr))
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
889 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
890
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
891 if (!INGLOBALZONE(curproc)) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
892 uint64_t zoned;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
893 char setpoint[MAXNAMELEN];
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
894 int dslen;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
895 /*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
896 * Unprivileged users are allowed to modify the
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
897 * quota on things *under* (ie. contained by)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
898 * the thing they own.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
899 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
900 if (dsl_prop_get_integer(name, "zoned", &zoned,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
901 setpoint))
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
902 return (EPERM);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
903 if (!zoned) /* this shouldn't happen */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
904 return (EPERM);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
905 dslen = strlen(name);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
906 if (dslen <= strlen(setpoint))
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
907 return (EPERM);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
908 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
909 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
910
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
911 switch (prop) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
912 case ZFS_PROP_QUOTA:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
913 if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
914 (error = dsl_dir_set_quota(name,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
915 intval)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
916 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
917 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
918
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
919 case ZFS_PROP_RESERVATION:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
920 if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
921 (error = dsl_dir_set_reservation(name,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
922 intval)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
923 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
924 break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
925
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
926 case ZFS_PROP_VOLSIZE:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
927 if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
928 (error = zvol_set_volsize(name, dev,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
929 intval)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
930 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
931 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
932
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
933 case ZFS_PROP_VOLBLOCKSIZE:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
934 if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
935 (error = zvol_set_volblocksize(name,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
936 intval)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
937 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
938 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
939
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
940 default:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
941 if (nvpair_type(elem) == DATA_TYPE_STRING) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
942 if (zfs_prop_get_type(prop) !=
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
943 prop_type_string)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
944 return (EINVAL);
2717
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
945 VERIFY(nvpair_value_string(elem, &strval) == 0);
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
946 if ((error = dsl_prop_set(name,
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
947 nvpair_name(elem), 1, strlen(strval) + 1,
2717
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
948 strval)) != 0)
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
949 return (error);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
950 } else if (nvpair_type(elem) == DATA_TYPE_UINT64) {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
951 const char *unused;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
952
2717
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
953 VERIFY(nvpair_value_uint64(elem, &intval) == 0);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
954
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
955 switch (zfs_prop_get_type(prop)) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
956 case prop_type_number:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
957 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
958 case prop_type_boolean:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
959 if (intval > 1)
2717
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
960 return (EINVAL);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
961 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
962 case prop_type_string:
2717
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
963 return (EINVAL);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
964 case prop_type_index:
2717
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
965 if (zfs_prop_index_to_string(prop,
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
966 intval, &unused) != 0)
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
967 return (EINVAL);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
968 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
969 default:
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
970 cmn_err(CE_PANIC, "unknown property "
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
971 "type");
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
972 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
973 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
974
2717
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
975 if ((error = dsl_prop_set(name, propname,
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
976 8, 1, &intval)) != 0)
ed589a32259d 6469385 zfs_set_prop_nvlist range checking is busted
eschrock
parents: 2676
diff changeset
977 return (error);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
978 } else {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
979 return (EINVAL);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
980 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
981 break;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
982 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
983 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
984
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
985 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
986 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
987
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
988 static int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
989 zfs_ioc_set_prop(zfs_cmd_t *zc)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
990 {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
991 nvlist_t *nvl;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
992 int error;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
993 zfs_prop_t prop;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
994
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
995 /*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
996 * If zc_value is set, then this is an attempt to inherit a value.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
997 * Otherwise, zc_nvlist refers to a list of properties to set.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
998 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
999 if (zc->zc_value[0] != '\0') {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1000 if (!zfs_prop_user(zc->zc_value) &&
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1001 ((prop = zfs_name_to_prop(zc->zc_value)) ==
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1002 ZFS_PROP_INVAL ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1003 !zfs_prop_inheritable(prop)))
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1004 return (EINVAL);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1005
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1006 return (dsl_prop_set(zc->zc_name, zc->zc_value, 0, 0, NULL));
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1007 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1008
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1009 if ((error = get_nvlist(zc, &nvl)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1010 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1011
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1012 error = zfs_set_prop_nvlist(zc->zc_name, zc->zc_dev,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1013 (cred_t *)(uintptr_t)zc->zc_cred, nvl);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1014 nvlist_free(nvl);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1015 return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1016 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1017
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1018 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1019 zfs_ioc_create_minor(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1020 {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1021 return (zvol_create_minor(zc->zc_name, zc->zc_dev));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1022 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1023
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1024 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1025 zfs_ioc_remove_minor(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1026 {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1027 return (zvol_remove_minor(zc->zc_name));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1028 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1029
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1030 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1031 * Search the vfs list for a specified resource. Returns a pointer to it
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1032 * or NULL if no suitable entry is found. The caller of this routine
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1033 * is responsible for releasing the returned vfs pointer.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1034 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1035 static vfs_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1036 zfs_get_vfs(const char *resource)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1037 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1038 struct vfs *vfsp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1039 struct vfs *vfs_found = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1040
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1041 vfs_list_read_lock();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1042 vfsp = rootvfs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1043 do {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1044 if (strcmp(refstr_value(vfsp->vfs_resource), resource) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1045 VFS_HOLD(vfsp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1046 vfs_found = vfsp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1047 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1048 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1049 vfsp = vfsp->vfs_next;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1050 } while (vfsp != rootvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1051 vfs_list_unlock();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1052 return (vfs_found);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1053 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1054
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1055 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1056 zfs_create_cb(objset_t *os, void *arg, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1057 {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1058 zfs_create_data_t *zc = arg;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1059 zfs_create_fs(os, (cred_t *)(uintptr_t)zc->zc_cred, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1060 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1061
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1062 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1063 zfs_ioc_create(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1064 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1065 objset_t *clone;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1066 int error = 0;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1067 zfs_create_data_t cbdata = { 0 };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1068 void (*cbfunc)(objset_t *os, void *arg, dmu_tx_t *tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1069 dmu_objset_type_t type = zc->zc_objset_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1070
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1071 switch (type) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1072
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1073 case DMU_OST_ZFS:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1074 cbfunc = zfs_create_cb;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1075 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1076
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1077 case DMU_OST_ZVOL:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1078 cbfunc = zvol_create_cb;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1079 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1080
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1081 default:
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1082 cbfunc = NULL;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1083 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1084 if (strchr(zc->zc_name, '@'))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1085 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1086
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1087 if (zc->zc_nvlist_src != NULL &&
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1088 (error = get_nvlist(zc, &cbdata.zc_props)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1089 return (error);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1090
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1091 cbdata.zc_cred = (cred_t *)(uintptr_t)zc->zc_cred;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1092 cbdata.zc_dev = (dev_t)zc->zc_dev;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1093
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1094 if (zc->zc_value[0] != '\0') {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1095 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1096 * We're creating a clone of an existing snapshot.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1097 */
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1098 zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1099 if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1100 nvlist_free(cbdata.zc_props);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1101 return (EINVAL);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1102 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1103
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1104 error = dmu_objset_open(zc->zc_value, type,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1105 DS_MODE_STANDARD | DS_MODE_READONLY, &clone);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1106 if (error) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1107 nvlist_free(cbdata.zc_props);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1108 return (error);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1109 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1110 error = dmu_objset_create(zc->zc_name, type, clone, NULL, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1111 dmu_objset_close(clone);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1112 } else {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1113 if (cbfunc == NULL) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1114 nvlist_free(cbdata.zc_props);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1115 return (EINVAL);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1116 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1117
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1118 if (type == DMU_OST_ZVOL) {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1119 uint64_t volsize, volblocksize;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1120
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1121 if (cbdata.zc_props == NULL ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1122 nvlist_lookup_uint64(cbdata.zc_props,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1123 zfs_prop_to_name(ZFS_PROP_VOLSIZE),
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1124 &volsize) != 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1125 nvlist_free(cbdata.zc_props);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1126 return (EINVAL);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1127 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1128
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1129 if ((error = nvlist_lookup_uint64(cbdata.zc_props,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1130 zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE),
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1131 &volblocksize)) != 0 && error != ENOENT) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1132 nvlist_free(cbdata.zc_props);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1133 return (EINVAL);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1134 }
1133
335d069294d1 6357470 vdev_raidz.c has unused RAIDZ_SINGLE define, code
eschrock
parents: 1003
diff changeset
1135
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1136 if (error != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1137 volblocksize = zfs_prop_default_numeric(
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1138 ZFS_PROP_VOLBLOCKSIZE);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1139
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1140 if ((error = zvol_check_volblocksize(
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1141 volblocksize)) != 0 ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1142 (error = zvol_check_volsize(volsize,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1143 volblocksize)) != 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1144 nvlist_free(cbdata.zc_props);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1145 return (error);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1146 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1147 }
1133
335d069294d1 6357470 vdev_raidz.c has unused RAIDZ_SINGLE define, code
eschrock
parents: 1003
diff changeset
1148
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1149 error = dmu_objset_create(zc->zc_name, type, NULL, cbfunc,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1150 &cbdata);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1151 }
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1152
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1153 /*
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1154 * It would be nice to do this atomically.
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1155 */
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1156 if (error == 0) {
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1157 if ((error = zfs_set_prop_nvlist(zc->zc_name,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1158 zc->zc_dev, (cred_t *)(uintptr_t)zc->zc_cred,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1159 cbdata.zc_props)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1160 (void) dmu_objset_destroy(zc->zc_name);
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1161 }
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1162
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1163 nvlist_free(cbdata.zc_props);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1164 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1165 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1166
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1167 static int
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1168 zfs_ioc_snapshot(zfs_cmd_t *zc)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1169 {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1170 if (snapshot_namecheck(zc->zc_value, NULL, NULL) != 0)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1171 return (EINVAL);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1172 return (dmu_objset_snapshot(zc->zc_name,
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1173 zc->zc_value, zc->zc_cookie));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1174 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1175
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1176 static int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1177 zfs_unmount_snap(char *name, void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1178 {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1179 char *snapname = arg;
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1180 char *cp;
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1181 vfs_t *vfsp = NULL;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1182
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1183 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1184 * Snapshots (which are under .zfs control) must be unmounted
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1185 * before they can be destroyed.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1186 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1187
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1188 if (snapname) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1189 (void) strcat(name, "@");
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1190 (void) strcat(name, snapname);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1191 vfsp = zfs_get_vfs(name);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1192 cp = strchr(name, '@');
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1193 *cp = '\0';
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1194 } else if (strchr(name, '@')) {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1195 vfsp = zfs_get_vfs(name);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1196 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1197
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1198 if (vfsp) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1199 /*
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1200 * Always force the unmount for snapshots.
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1201 */
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1202 int flag = MS_FORCE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1203 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1204
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1205 if ((err = vn_vfswlock(vfsp->vfs_vnodecovered)) != 0) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1206 VFS_RELE(vfsp);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1207 return (err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1208 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1209 VFS_RELE(vfsp);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1210 if ((err = dounmount(vfsp, flag, kcred)) != 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1211 return (err);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1212 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1213 return (0);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1214 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1215
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1216 static int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1217 zfs_ioc_destroy_snaps(zfs_cmd_t *zc)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1218 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1219 int err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1220
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1221 if (snapshot_namecheck(zc->zc_value, NULL, NULL) != 0)
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1222 return (EINVAL);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1223 err = dmu_objset_find(zc->zc_name,
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1224 zfs_unmount_snap, zc->zc_value, DS_FIND_CHILDREN);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1225 if (err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1226 return (err);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1227 return (dmu_snapshots_destroy(zc->zc_name, zc->zc_value));
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1228 }
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1229
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1230 static int
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1231 zfs_ioc_destroy(zfs_cmd_t *zc)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1232 {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1233 if (strchr(zc->zc_name, '@') && zc->zc_objset_type == DMU_OST_ZFS) {
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1234 int err = zfs_unmount_snap(zc->zc_name, NULL);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1235 if (err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1236 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1237 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1239 return (dmu_objset_destroy(zc->zc_name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1240 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1241
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1242 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1243 zfs_ioc_rollback(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1244 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1245 return (dmu_objset_rollback(zc->zc_name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1246 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1247
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1248 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1249 zfs_ioc_rename(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1250 {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1251 zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1252 if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1253 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1254
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1255 if (strchr(zc->zc_name, '@') != NULL &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1256 zc->zc_objset_type == DMU_OST_ZFS) {
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1257 int err = zfs_unmount_snap(zc->zc_name, NULL);
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1258 if (err)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1259 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1260 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1261
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1262 return (dmu_objset_rename(zc->zc_name, zc->zc_value));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1263 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1264
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1265 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1266 zfs_ioc_recvbackup(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1267 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1268 file_t *fp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1269 int error, fd;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1270 offset_t new_off;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1271
3265
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3087
diff changeset
1272 if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3087
diff changeset
1273 strchr(zc->zc_value, '@') == NULL)
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3087
diff changeset
1274 return (EINVAL);
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3087
diff changeset
1275
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1276 fd = zc->zc_cookie;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1277 fp = getf(fd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1278 if (fp == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1279 return (EBADF);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1280 error = dmu_recvbackup(zc->zc_value, &zc->zc_begin_record,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1281 &zc->zc_cookie, (boolean_t)zc->zc_guid, fp->f_vnode,
2665
7b208a92357b PSARC 2006/479 zfs receive -F
nd150628
parents: 2417
diff changeset
1282 fp->f_offset);
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1283
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1284 new_off = fp->f_offset + zc->zc_cookie;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1285 if (VOP_SEEK(fp->f_vnode, fp->f_offset, &new_off) == 0)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1286 fp->f_offset = new_off;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1287
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1288 releasef(fd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1289 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1290 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1291
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1292 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1293 zfs_ioc_sendbackup(zfs_cmd_t *zc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1294 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1295 objset_t *fromsnap = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1296 objset_t *tosnap;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1297 file_t *fp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1298 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1299
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1300 error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1301 DS_MODE_STANDARD | DS_MODE_READONLY, &tosnap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1302 if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1303 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1304
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1305 if (zc->zc_value[0] != '\0') {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1306 char buf[MAXPATHLEN];
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1307 char *cp;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1308
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1309 (void) strncpy(buf, zc->zc_name, sizeof (buf));
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1310 cp = strchr(buf, '@');
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1311 if (cp)
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1312 *(cp+1) = 0;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1313 (void) strncat(buf, zc->zc_value, sizeof (buf));
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
1314 error = dmu_objset_open(buf, DMU_OST_ANY,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1315 DS_MODE_STANDARD | DS_MODE_READONLY, &fromsnap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1316 if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1317 dmu_objset_close(tosnap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1318 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1319 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1320 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1321
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1322 fp = getf(zc->zc_cookie);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1323 if (fp == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1324 dmu_objset_close(tosnap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1325 if (fromsnap)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1326 dmu_objset_close(fromsnap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1327 return (EBADF);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1328 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1329
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1330 error = dmu_sendbackup(tosnap, fromsnap, fp->f_vnode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1331
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1332 releasef(zc->zc_cookie);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1333 if (fromsnap)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1334 dmu_objset_close(fromsnap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1335 dmu_objset_close(tosnap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1336 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1337 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1338
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1339 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1340 zfs_ioc_inject_fault(zfs_cmd_t *zc)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1341 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1342 int id, error;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1343
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1344 error = zio_inject_fault(zc->zc_name, (int)zc->zc_guid, &id,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1345 &zc->zc_inject_record);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1346
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1347 if (error == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1348 zc->zc_guid = (uint64_t)id;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1349
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1350 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1351 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1352
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1353 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1354 zfs_ioc_clear_fault(zfs_cmd_t *zc)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1355 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1356 return (zio_clear_fault((int)zc->zc_guid));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1357 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1358
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1359 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1360 zfs_ioc_inject_list_next(zfs_cmd_t *zc)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1361 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1362 int id = (int)zc->zc_guid;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1363 int error;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1364
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1365 error = zio_inject_list_next(&id, zc->zc_name, sizeof (zc->zc_name),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1366 &zc->zc_inject_record);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1367
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1368 zc->zc_guid = id;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1369
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1370 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1371 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1372
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1373 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1374 zfs_ioc_error_log(zfs_cmd_t *zc)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1375 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1376 spa_t *spa;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1377 int error;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1378 size_t count = (size_t)zc->zc_nvlist_dst_size;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1379
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1380 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1381 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1382
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1383 error = spa_get_errlog(spa, (void *)(uintptr_t)zc->zc_nvlist_dst,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1384 &count);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1385 if (error == 0)
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1386 zc->zc_nvlist_dst_size = count;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1387 else
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1388 zc->zc_nvlist_dst_size = spa_get_errlog_size(spa);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1389
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1390 spa_close(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1391
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1392 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1393 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1394
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1395 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1396 zfs_ioc_clear(zfs_cmd_t *zc)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1397 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1398 spa_t *spa;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1399 vdev_t *vd;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1400 int error;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1401
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1402 if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1403 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1404
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1405 spa_config_enter(spa, RW_WRITER, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1406
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1407 if (zc->zc_guid == 0) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1408 vd = NULL;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1409 } else if ((vd = spa_lookup_by_guid(spa, zc->zc_guid)) == NULL) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1410 spa_config_exit(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1411 spa_close(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1412 return (ENODEV);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1413 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1414
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1415 vdev_clear(spa, vd);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1416
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1417 spa_config_exit(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1418
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1419 spa_close(spa, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1420
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1421 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1422 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1423
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1424 static int
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
1425 zfs_ioc_promote(zfs_cmd_t *zc)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
1426 {
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1427 char *cp;
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1428
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1429 /*
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1430 * We don't need to unmount *all* the origin fs's snapshots, but
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1431 * it's easier.
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1432 */
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1433 cp = strchr(zc->zc_value, '@');
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1434 if (cp)
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1435 *cp = '\0';
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1436 (void) dmu_objset_find(zc->zc_value,
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
1437 zfs_unmount_snap, NULL, DS_FIND_SNAPSHOTS);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
1438 return (dsl_dataset_promote(zc->zc_name));
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
1439 }
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
1440
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1441 static zfs_ioc_vec_t zfs_ioc_vec[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1442 { zfs_ioc_pool_create, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1443 { zfs_ioc_pool_destroy, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1444 { zfs_ioc_pool_import, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1445 { zfs_ioc_pool_export, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1446 { zfs_ioc_pool_configs, zfs_secpolicy_none, no_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1447 { zfs_ioc_pool_stats, zfs_secpolicy_read, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1448 { zfs_ioc_pool_tryimport, zfs_secpolicy_config, no_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1449 { zfs_ioc_pool_scrub, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1450 { zfs_ioc_pool_freeze, zfs_secpolicy_config, no_name },
1760
e1ad2821c30d PSARC 2006/206 zpool upgrade
eschrock
parents: 1544
diff changeset
1451 { zfs_ioc_pool_upgrade, zfs_secpolicy_config, pool_name },
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
1452 { zfs_ioc_pool_get_history, zfs_secpolicy_config, pool_name },
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
1453 { zfs_ioc_pool_log_history, zfs_secpolicy_config, pool_name },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1454 { zfs_ioc_vdev_add, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1455 { zfs_ioc_vdev_remove, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1456 { zfs_ioc_vdev_online, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1457 { zfs_ioc_vdev_offline, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1458 { zfs_ioc_vdev_attach, zfs_secpolicy_config, pool_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1459 { zfs_ioc_vdev_detach, zfs_secpolicy_config, pool_name },
1354
81359ee1ee63 6362672 import gets confused about overlapping slices
eschrock
parents: 1133
diff changeset
1460 { zfs_ioc_vdev_setpath, zfs_secpolicy_config, pool_name },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1461 { zfs_ioc_objset_stats, zfs_secpolicy_read, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1462 { zfs_ioc_dataset_list_next, zfs_secpolicy_read, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1463 { zfs_ioc_snapshot_list_next, zfs_secpolicy_read, dataset_name },
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1464 { zfs_ioc_set_prop, zfs_secpolicy_write, dataset_name },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1465 { zfs_ioc_create_minor, zfs_secpolicy_config, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1466 { zfs_ioc_remove_minor, zfs_secpolicy_config, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1467 { zfs_ioc_create, zfs_secpolicy_parent, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1468 { zfs_ioc_destroy, zfs_secpolicy_parent, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1469 { zfs_ioc_rollback, zfs_secpolicy_write, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1470 { zfs_ioc_rename, zfs_secpolicy_write, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1471 { zfs_ioc_recvbackup, zfs_secpolicy_write, dataset_name },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1472 { zfs_ioc_sendbackup, zfs_secpolicy_write, dataset_name },
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1473 { zfs_ioc_inject_fault, zfs_secpolicy_inject, no_name },
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1474 { zfs_ioc_clear_fault, zfs_secpolicy_inject, no_name },
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1475 { zfs_ioc_inject_list_next, zfs_secpolicy_inject, no_name },
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1476 { zfs_ioc_error_log, zfs_secpolicy_inject, pool_name },
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1477 { zfs_ioc_clear, zfs_secpolicy_config, pool_name },
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1478 { zfs_ioc_promote, zfs_secpolicy_write, dataset_name },
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1479 { zfs_ioc_destroy_snaps, zfs_secpolicy_write, dataset_name },
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
1480 { zfs_ioc_snapshot, zfs_secpolicy_write, dataset_name },
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
1481 { zfs_ioc_dsobj_to_dsname, zfs_secpolicy_config, pool_name },
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3265
diff changeset
1482 { zfs_ioc_obj_to_path, zfs_secpolicy_config, no_name }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1483 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1484
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1485 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1486 zfsdev_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr, int *rvalp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1487 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1488 zfs_cmd_t *zc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1489 uint_t vec;
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1490 int error, rc;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1491
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1492 if (getminor(dev) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1493 return (zvol_ioctl(dev, cmd, arg, flag, cr, rvalp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1494
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1495 vec = cmd - ZFS_IOC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1496
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1497 if (vec >= sizeof (zfs_ioc_vec) / sizeof (zfs_ioc_vec[0]))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1498 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1499
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1500 zc = kmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1501
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1502 error = xcopyin((void *)arg, zc, sizeof (zfs_cmd_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1503
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1504 if (error == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1505 zc->zc_cred = (uintptr_t)cr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1506 zc->zc_dev = dev;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1507 error = zfs_ioc_vec[vec].zvec_secpolicy(zc->zc_name, cr);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1508 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1509
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1510 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1511 * Ensure that all pool/dataset names are valid before we pass down to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1512 * the lower layers.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1513 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1514 if (error == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1515 zc->zc_name[sizeof (zc->zc_name) - 1] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1516 switch (zfs_ioc_vec[vec].zvec_namecheck) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1517 case pool_name:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1518 if (pool_namecheck(zc->zc_name, NULL, NULL) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1519 error = EINVAL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1520 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1521
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1522 case dataset_name:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1523 if (dataset_namecheck(zc->zc_name, NULL, NULL) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1524 error = EINVAL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1525 break;
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2717
diff changeset
1526
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2717
diff changeset
1527 case no_name:
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2717
diff changeset
1528 break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1529 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1530 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1531
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1532 if (error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1533 error = zfs_ioc_vec[vec].zvec_func(zc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1534
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1535 rc = xcopyout(zc, (void *)arg, sizeof (zfs_cmd_t));
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1536 if (error == 0)
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
1537 error = rc;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1538
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1539 kmem_free(zc, sizeof (zfs_cmd_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1540 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1541 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1542
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1543 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1544 zfs_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1545 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1546 if (cmd != DDI_ATTACH)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1547 return (DDI_FAILURE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1548
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1549 if (ddi_create_minor_node(dip, "zfs", S_IFCHR, 0,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1550 DDI_PSEUDO, 0) == DDI_FAILURE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1551 return (DDI_FAILURE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1552
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1553 zfs_dip = dip;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1554
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1555 ddi_report_dev(dip);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1556
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1557 return (DDI_SUCCESS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1558 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1559
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1560 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1561 zfs_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1562 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1563 if (spa_busy() || zfs_busy() || zvol_busy())
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1564 return (DDI_FAILURE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1565
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1566 if (cmd != DDI_DETACH)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1567 return (DDI_FAILURE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1568
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1569 zfs_dip = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1570
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1571 ddi_prop_remove_all(dip);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1572 ddi_remove_minor_node(dip, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1573
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1574 return (DDI_SUCCESS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1575 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1576
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1577 /*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1578 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1579 zfs_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1580 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1581 switch (infocmd) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1582 case DDI_INFO_DEVT2DEVINFO:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1583 *result = zfs_dip;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1584 return (DDI_SUCCESS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1585
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1586 case DDI_INFO_DEVT2INSTANCE:
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1587 *result = (void *)0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1588 return (DDI_SUCCESS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1589 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1590
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1591 return (DDI_FAILURE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1592 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1593
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1594 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1595 * OK, so this is a little weird.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1596 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1597 * /dev/zfs is the control node, i.e. minor 0.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1598 * /dev/zvol/[r]dsk/pool/dataset are the zvols, minor > 0.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1599 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1600 * /dev/zfs has basically nothing to do except serve up ioctls,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1601 * so most of the standard driver entry points are in zvol.c.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1602 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1603 static struct cb_ops zfs_cb_ops = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1604 zvol_open, /* open */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1605 zvol_close, /* close */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1606 zvol_strategy, /* strategy */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1607 nodev, /* print */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1608 nodev, /* dump */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1609 zvol_read, /* read */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1610 zvol_write, /* write */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1611 zfsdev_ioctl, /* ioctl */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1612 nodev, /* devmap */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1613 nodev, /* mmap */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1614 nodev, /* segmap */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1615 nochpoll, /* poll */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1616 ddi_prop_op, /* prop_op */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1617 NULL, /* streamtab */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1618 D_NEW | D_MP | D_64BIT, /* Driver compatibility flag */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1619 CB_REV, /* version */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1620 zvol_aread, /* async read */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1621 zvol_awrite, /* async write */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1622 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1623
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1624 static struct dev_ops zfs_dev_ops = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1625 DEVO_REV, /* version */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1626 0, /* refcnt */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1627 zfs_info, /* info */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1628 nulldev, /* identify */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1629 nulldev, /* probe */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1630 zfs_attach, /* attach */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1631 zfs_detach, /* detach */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1632 nodev, /* reset */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1633 &zfs_cb_ops, /* driver operations */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1634 NULL /* no bus operations */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1635 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1636
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1637 static struct modldrv zfs_modldrv = {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1638 &mod_driverops, "ZFS storage pool version " ZFS_VERSION_STRING,
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
1639 &zfs_dev_ops
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1640 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1641
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1642 static struct modlinkage modlinkage = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1643 MODREV_1,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1644 (void *)&zfs_modlfs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1645 (void *)&zfs_modldrv,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1646 NULL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1647 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1648
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1649 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1650 _init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1651 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1652 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1653
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1654 spa_init(FREAD | FWRITE);
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1655 zfs_init();
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1656 zvol_init();
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1657
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1658 if ((error = mod_install(&modlinkage)) != 0) {
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1659 zvol_fini();
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1660 zfs_fini();
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1661 spa_fini();
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1662 return (error);
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1663 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1664
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1665 error = ldi_ident_from_mod(&modlinkage, &zfs_li);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1666 ASSERT(error == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1667
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1668 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1669 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1670
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1671 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1672 _fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1673 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1674 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1675
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
1676 if (spa_busy() || zfs_busy() || zvol_busy() || zio_injection_enabled)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1677 return (EBUSY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1678
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1679 if ((error = mod_remove(&modlinkage)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1680 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1681
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1682 zvol_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1683 zfs_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1684 spa_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1685
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1686 ldi_ident_release(zfs_li);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1687 zfs_li = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1688
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1689 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1690 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1691
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1692 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1693 _info(struct modinfo *modinfop)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1694 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1695 return (mod_info(&modlinkage, modinfop));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1696 }