Mercurial > illumos > illumos-gate
annotate usr/src/uts/common/fs/zfs/zfs_vfsops.c @ 13061:bda0decf867b
PSARC 2010/306 Read-only ZFS pools
6720531 ZFS should provide read-only import
author | George Wilson <George.Wilson@Sun.COM> |
---|---|
date | Mon, 09 Aug 2010 12:39:28 -0700 |
parents | 0cc41f673f9d |
children | 79b387e27d99 |
rev | line source |
---|---|
789 | 1 /* |
2 * CDDL HEADER START | |
3 * | |
4 * The contents of this file are subject to the terms of the | |
1484
d330e98f8ed7
6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents:
1298
diff
changeset
|
5 * Common Development and Distribution License (the "License"). |
d330e98f8ed7
6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents:
1298
diff
changeset
|
6 * You may not use this file except in compliance with the License. |
789 | 7 * |
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
9 * or http://www.opensolaris.org/os/licensing. | |
10 * See the License for the specific language governing permissions | |
11 * and limitations under the License. | |
12 * | |
13 * When distributing Covered Code, include this CDDL HEADER in each | |
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
15 * If applicable, add the following below this CDDL HEADER, with the | |
16 * fields enclosed by brackets "[]" replaced with your own identifying | |
17 * information: Portions Copyright [yyyy] [name of copyright owner] | |
18 * | |
19 * CDDL HEADER END | |
20 */ | |
21 /* | |
12070
01261b276236
6940770 panic in sa_find_idx_tab() after receiving into pool when version shouldn't have allowed it
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11935
diff
changeset
|
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
789 | 23 */ |
24 | |
12294
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
25 /* Portions Copyright 2010 Robert Milkowski */ |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
26 |
789 | 27 #include <sys/types.h> |
28 #include <sys/param.h> | |
29 #include <sys/systm.h> | |
30 #include <sys/sysmacros.h> | |
31 #include <sys/kmem.h> | |
32 #include <sys/pathname.h> | |
33 #include <sys/vnode.h> | |
34 #include <sys/vfs.h> | |
3898
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
35 #include <sys/vfs_opreg.h> |
789 | 36 #include <sys/mntent.h> |
37 #include <sys/mount.h> | |
38 #include <sys/cmn_err.h> | |
39 #include "fs/fs_subr.h" | |
40 #include <sys/zfs_znode.h> | |
3461 | 41 #include <sys/zfs_dir.h> |
789 | 42 #include <sys/zil.h> |
43 #include <sys/fs/zfs.h> | |
44 #include <sys/dmu.h> | |
45 #include <sys/dsl_prop.h> | |
3912 | 46 #include <sys/dsl_dataset.h> |
4543 | 47 #include <sys/dsl_deleg.h> |
789 | 48 #include <sys/spa.h> |
49 #include <sys/zap.h> | |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
50 #include <sys/sa.h> |
789 | 51 #include <sys/varargs.h> |
52 #include <sys/policy.h> | |
53 #include <sys/atomic.h> | |
54 #include <sys/mkdev.h> | |
55 #include <sys/modctl.h> | |
4543 | 56 #include <sys/refstr.h> |
789 | 57 #include <sys/zfs_ioctl.h> |
58 #include <sys/zfs_ctldir.h> | |
5331 | 59 #include <sys/zfs_fuid.h> |
1544 | 60 #include <sys/bootconf.h> |
849
8d799fd81a9b
6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents:
789
diff
changeset
|
61 #include <sys/sunddi.h> |
1484
d330e98f8ed7
6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents:
1298
diff
changeset
|
62 #include <sys/dnlc.h> |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
63 #include <sys/dmu_objset.h> |
6423 | 64 #include <sys/spa_boot.h> |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
65 #include <sys/sa.h> |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
66 #include "zfs_comutil.h" |
789 | 67 |
68 int zfsfstype; | |
69 vfsops_t *zfs_vfsops = NULL; | |
849
8d799fd81a9b
6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents:
789
diff
changeset
|
70 static major_t zfs_major; |
789 | 71 static minor_t zfs_minor; |
72 static kmutex_t zfs_dev_mtx; | |
73 | |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
74 extern int sys_shutdown; |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
75 |
789 | 76 static int zfs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr); |
77 static int zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr); | |
1544 | 78 static int zfs_mountroot(vfs_t *vfsp, enum whymountroot); |
789 | 79 static int zfs_root(vfs_t *vfsp, vnode_t **vpp); |
80 static int zfs_statvfs(vfs_t *vfsp, struct statvfs64 *statp); | |
81 static int zfs_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp); | |
82 static void zfs_freevfs(vfs_t *vfsp); | |
83 | |
84 static const fs_operation_def_t zfs_vfsops_template[] = { | |
3898
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
85 VFSNAME_MOUNT, { .vfs_mount = zfs_mount }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
86 VFSNAME_MOUNTROOT, { .vfs_mountroot = zfs_mountroot }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
87 VFSNAME_UNMOUNT, { .vfs_unmount = zfs_umount }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
88 VFSNAME_ROOT, { .vfs_root = zfs_root }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
89 VFSNAME_STATVFS, { .vfs_statvfs = zfs_statvfs }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
90 VFSNAME_SYNC, { .vfs_sync = zfs_sync }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
91 VFSNAME_VGET, { .vfs_vget = zfs_vget }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
92 VFSNAME_FREEVFS, { .vfs_freevfs = zfs_freevfs }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
93 NULL, NULL |
789 | 94 }; |
95 | |
96 static const fs_operation_def_t zfs_vfsops_eio_template[] = { | |
3898
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
97 VFSNAME_FREEVFS, { .vfs_freevfs = zfs_freevfs }, |
c788126f2a20
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents:
3461
diff
changeset
|
98 NULL, NULL |
789 | 99 }; |
100 | |
101 /* | |
102 * We need to keep a count of active fs's. | |
103 * This is necessary to prevent our module | |
104 * from being unloaded after a umount -f | |
105 */ | |
106 static uint32_t zfs_active_fs_count = 0; | |
107 | |
108 static char *noatime_cancel[] = { MNTOPT_ATIME, NULL }; | |
109 static char *atime_cancel[] = { MNTOPT_NOATIME, NULL }; | |
3234 | 110 static char *noxattr_cancel[] = { MNTOPT_XATTR, NULL }; |
111 static char *xattr_cancel[] = { MNTOPT_NOXATTR, NULL }; | |
789 | 112 |
3234 | 113 /* |
4596
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
114 * MO_DEFAULT is not used since the default value is determined |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
115 * by the equivalent property. |
3234 | 116 */ |
789 | 117 static mntopt_t mntopts[] = { |
3234 | 118 { MNTOPT_NOXATTR, noxattr_cancel, NULL, 0, NULL }, |
119 { MNTOPT_XATTR, xattr_cancel, NULL, 0, NULL }, | |
4596
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
120 { MNTOPT_NOATIME, noatime_cancel, NULL, 0, NULL }, |
789 | 121 { MNTOPT_ATIME, atime_cancel, NULL, 0, NULL } |
122 }; | |
123 | |
124 static mntopts_t zfs_mntopts = { | |
125 sizeof (mntopts) / sizeof (mntopt_t), | |
126 mntopts | |
127 }; | |
128 | |
129 /*ARGSUSED*/ | |
130 int | |
131 zfs_sync(vfs_t *vfsp, short flag, cred_t *cr) | |
132 { | |
133 /* | |
134 * Data integrity is job one. We don't want a compromised kernel | |
135 * writing to the storage pool, so we never sync during panic. | |
136 */ | |
137 if (panicstr) | |
138 return (0); | |
139 | |
140 /* | |
141 * SYNC_ATTR is used by fsflush() to force old filesystems like UFS | |
142 * to sync metadata, which they would otherwise cache indefinitely. | |
143 * Semantically, the only requirement is that the sync be initiated. | |
144 * The DMU syncs out txgs frequently, so there's nothing to do. | |
145 */ | |
146 if (flag & SYNC_ATTR) | |
147 return (0); | |
148 | |
149 if (vfsp != NULL) { | |
150 /* | |
151 * Sync a specific filesystem. | |
152 */ | |
153 zfsvfs_t *zfsvfs = vfsp->vfs_data; | |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
154 dsl_pool_t *dp; |
789 | 155 |
156 ZFS_ENTER(zfsvfs); | |
9234
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
157 dp = dmu_objset_pool(zfsvfs->z_os); |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
158 |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
159 /* |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
160 * If the system is shutting down, then skip any |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
161 * filesystems which may exist on a suspended pool. |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
162 */ |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
163 if (sys_shutdown && spa_suspended(dp->dp_spa)) { |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
164 ZFS_EXIT(zfsvfs); |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
165 return (0); |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
166 } |
bffdc4fc05c4
6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents:
9214
diff
changeset
|
167 |
789 | 168 if (zfsvfs->z_log != NULL) |
12699
36aebb51164a
6913010 assertion failed: error||lr->lr_length <= zp->z_blksz, file: ../../common/fs/zfs/zfs_vnops.c
Neil Perrin <Neil.Perrin@Sun.COM>
parents:
12633
diff
changeset
|
169 zil_commit(zfsvfs->z_log, 0); |
12294
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
170 |
789 | 171 ZFS_EXIT(zfsvfs); |
172 } else { | |
173 /* | |
174 * Sync all ZFS filesystems. This is what happens when you | |
175 * run sync(1M). Unlike other filesystems, ZFS honors the | |
176 * request by waiting for all pools to commit all dirty data. | |
177 */ | |
178 spa_sync_allpools(); | |
179 } | |
180 | |
181 return (0); | |
182 } | |
183 | |
1544 | 184 static int |
185 zfs_create_unique_device(dev_t *dev) | |
186 { | |
187 major_t new_major; | |
188 | |
189 do { | |
190 ASSERT3U(zfs_minor, <=, MAXMIN32); | |
191 minor_t start = zfs_minor; | |
192 do { | |
193 mutex_enter(&zfs_dev_mtx); | |
194 if (zfs_minor >= MAXMIN32) { | |
195 /* | |
196 * If we're still using the real major | |
197 * keep out of /dev/zfs and /dev/zvol minor | |
198 * number space. If we're using a getudev()'ed | |
199 * major number, we can use all of its minors. | |
200 */ | |
201 if (zfs_major == ddi_name_to_major(ZFS_DRIVER)) | |
202 zfs_minor = ZFS_MIN_MINOR; | |
203 else | |
204 zfs_minor = 0; | |
205 } else { | |
206 zfs_minor++; | |
207 } | |
208 *dev = makedevice(zfs_major, zfs_minor); | |
209 mutex_exit(&zfs_dev_mtx); | |
210 } while (vfs_devismounted(*dev) && zfs_minor != start); | |
211 if (zfs_minor == start) { | |
212 /* | |
213 * We are using all ~262,000 minor numbers for the | |
214 * current major number. Create a new major number. | |
215 */ | |
216 if ((new_major = getudev()) == (major_t)-1) { | |
217 cmn_err(CE_WARN, | |
218 "zfs_mount: Can't get unique major " | |
219 "device number."); | |
220 return (-1); | |
221 } | |
222 mutex_enter(&zfs_dev_mtx); | |
223 zfs_major = new_major; | |
224 zfs_minor = 0; | |
225 | |
226 mutex_exit(&zfs_dev_mtx); | |
227 } else { | |
228 break; | |
229 } | |
230 /* CONSTANTCONDITION */ | |
231 } while (1); | |
232 | |
233 return (0); | |
234 } | |
235 | |
789 | 236 static void |
237 atime_changed_cb(void *arg, uint64_t newval) | |
238 { | |
239 zfsvfs_t *zfsvfs = arg; | |
240 | |
241 if (newval == TRUE) { | |
242 zfsvfs->z_atime = TRUE; | |
243 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME); | |
244 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_ATIME, NULL, 0); | |
245 } else { | |
246 zfsvfs->z_atime = FALSE; | |
247 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_ATIME); | |
248 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME, NULL, 0); | |
249 } | |
250 } | |
251 | |
252 static void | |
3234 | 253 xattr_changed_cb(void *arg, uint64_t newval) |
254 { | |
255 zfsvfs_t *zfsvfs = arg; | |
256 | |
257 if (newval == TRUE) { | |
258 /* XXX locking on vfs_flag? */ | |
259 zfsvfs->z_vfs->vfs_flag |= VFS_XATTR; | |
260 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR); | |
261 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_XATTR, NULL, 0); | |
262 } else { | |
263 /* XXX locking on vfs_flag? */ | |
264 zfsvfs->z_vfs->vfs_flag &= ~VFS_XATTR; | |
265 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_XATTR); | |
266 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR, NULL, 0); | |
267 } | |
268 } | |
269 | |
270 static void | |
789 | 271 blksz_changed_cb(void *arg, uint64_t newval) |
272 { | |
273 zfsvfs_t *zfsvfs = arg; | |
274 | |
275 if (newval < SPA_MINBLOCKSIZE || | |
276 newval > SPA_MAXBLOCKSIZE || !ISP2(newval)) | |
277 newval = SPA_MAXBLOCKSIZE; | |
278 | |
279 zfsvfs->z_max_blksz = newval; | |
280 zfsvfs->z_vfs->vfs_bsize = newval; | |
281 } | |
282 | |
283 static void | |
284 readonly_changed_cb(void *arg, uint64_t newval) | |
285 { | |
286 zfsvfs_t *zfsvfs = arg; | |
287 | |
288 if (newval) { | |
289 /* XXX locking on vfs_flag? */ | |
290 zfsvfs->z_vfs->vfs_flag |= VFS_RDONLY; | |
291 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RW); | |
292 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RO, NULL, 0); | |
293 } else { | |
294 /* XXX locking on vfs_flag? */ | |
295 zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY; | |
296 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RO); | |
297 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RW, NULL, 0); | |
298 } | |
299 } | |
300 | |
301 static void | |
302 devices_changed_cb(void *arg, uint64_t newval) | |
303 { | |
304 zfsvfs_t *zfsvfs = arg; | |
305 | |
306 if (newval == FALSE) { | |
307 zfsvfs->z_vfs->vfs_flag |= VFS_NODEVICES; | |
308 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_DEVICES); | |
309 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NODEVICES, NULL, 0); | |
310 } else { | |
311 zfsvfs->z_vfs->vfs_flag &= ~VFS_NODEVICES; | |
312 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NODEVICES); | |
313 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_DEVICES, NULL, 0); | |
314 } | |
315 } | |
316 | |
317 static void | |
318 setuid_changed_cb(void *arg, uint64_t newval) | |
319 { | |
320 zfsvfs_t *zfsvfs = arg; | |
321 | |
322 if (newval == FALSE) { | |
323 zfsvfs->z_vfs->vfs_flag |= VFS_NOSETUID; | |
324 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_SETUID); | |
325 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID, NULL, 0); | |
326 } else { | |
327 zfsvfs->z_vfs->vfs_flag &= ~VFS_NOSETUID; | |
328 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID); | |
329 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_SETUID, NULL, 0); | |
330 } | |
331 } | |
332 | |
333 static void | |
334 exec_changed_cb(void *arg, uint64_t newval) | |
335 { | |
336 zfsvfs_t *zfsvfs = arg; | |
337 | |
338 if (newval == FALSE) { | |
339 zfsvfs->z_vfs->vfs_flag |= VFS_NOEXEC; | |
340 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_EXEC); | |
341 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC, NULL, 0); | |
342 } else { | |
343 zfsvfs->z_vfs->vfs_flag &= ~VFS_NOEXEC; | |
344 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC); | |
345 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_EXEC, NULL, 0); | |
346 } | |
347 } | |
348 | |
5331 | 349 /* |
350 * The nbmand mount option can be changed at mount time. | |
351 * We can't allow it to be toggled on live file systems or incorrect | |
352 * behavior may be seen from cifs clients | |
353 * | |
354 * This property isn't registered via dsl_prop_register(), but this callback | |
355 * will be called when a file system is first mounted | |
356 */ | |
357 static void | |
358 nbmand_changed_cb(void *arg, uint64_t newval) | |
359 { | |
360 zfsvfs_t *zfsvfs = arg; | |
361 if (newval == FALSE) { | |
362 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NBMAND); | |
363 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NONBMAND, NULL, 0); | |
364 } else { | |
365 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NONBMAND); | |
366 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NBMAND, NULL, 0); | |
367 } | |
368 } | |
369 | |
789 | 370 static void |
371 snapdir_changed_cb(void *arg, uint64_t newval) | |
372 { | |
373 zfsvfs_t *zfsvfs = arg; | |
374 | |
375 zfsvfs->z_show_ctldir = newval; | |
376 } | |
377 | |
378 static void | |
5331 | 379 vscan_changed_cb(void *arg, uint64_t newval) |
380 { | |
381 zfsvfs_t *zfsvfs = arg; | |
382 | |
383 zfsvfs->z_vscan = newval; | |
384 } | |
385 | |
386 static void | |
789 | 387 acl_inherit_changed_cb(void *arg, uint64_t newval) |
388 { | |
389 zfsvfs_t *zfsvfs = arg; | |
390 | |
391 zfsvfs->z_acl_inherit = newval; | |
392 } | |
393 | |
1544 | 394 static int |
395 zfs_register_callbacks(vfs_t *vfsp) | |
396 { | |
397 struct dsl_dataset *ds = NULL; | |
398 objset_t *os = NULL; | |
399 zfsvfs_t *zfsvfs = NULL; | |
5331 | 400 uint64_t nbmand; |
401 int readonly, do_readonly = B_FALSE; | |
402 int setuid, do_setuid = B_FALSE; | |
403 int exec, do_exec = B_FALSE; | |
404 int devices, do_devices = B_FALSE; | |
405 int xattr, do_xattr = B_FALSE; | |
406 int atime, do_atime = B_FALSE; | |
1544 | 407 int error = 0; |
408 | |
409 ASSERT(vfsp); | |
410 zfsvfs = vfsp->vfs_data; | |
411 ASSERT(zfsvfs); | |
412 os = zfsvfs->z_os; | |
413 | |
414 /* | |
415 * The act of registering our callbacks will destroy any mount | |
416 * options we may have. In order to enable temporary overrides | |
3234 | 417 * of mount options, we stash away the current values and |
1544 | 418 * restore them after we register the callbacks. |
419 */ | |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
420 if (vfs_optionisset(vfsp, MNTOPT_RO, NULL) || |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
421 !spa_writeable(dmu_objset_spa(os))) { |
1544 | 422 readonly = B_TRUE; |
423 do_readonly = B_TRUE; | |
424 } else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL)) { | |
425 readonly = B_FALSE; | |
426 do_readonly = B_TRUE; | |
427 } | |
428 if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) { | |
429 devices = B_FALSE; | |
430 setuid = B_FALSE; | |
431 do_devices = B_TRUE; | |
432 do_setuid = B_TRUE; | |
433 } else { | |
434 if (vfs_optionisset(vfsp, MNTOPT_NODEVICES, NULL)) { | |
435 devices = B_FALSE; | |
436 do_devices = B_TRUE; | |
3912 | 437 } else if (vfs_optionisset(vfsp, MNTOPT_DEVICES, NULL)) { |
1544 | 438 devices = B_TRUE; |
439 do_devices = B_TRUE; | |
440 } | |
441 | |
442 if (vfs_optionisset(vfsp, MNTOPT_NOSETUID, NULL)) { | |
443 setuid = B_FALSE; | |
444 do_setuid = B_TRUE; | |
445 } else if (vfs_optionisset(vfsp, MNTOPT_SETUID, NULL)) { | |
446 setuid = B_TRUE; | |
447 do_setuid = B_TRUE; | |
448 } | |
449 } | |
450 if (vfs_optionisset(vfsp, MNTOPT_NOEXEC, NULL)) { | |
451 exec = B_FALSE; | |
452 do_exec = B_TRUE; | |
453 } else if (vfs_optionisset(vfsp, MNTOPT_EXEC, NULL)) { | |
454 exec = B_TRUE; | |
455 do_exec = B_TRUE; | |
456 } | |
3234 | 457 if (vfs_optionisset(vfsp, MNTOPT_NOXATTR, NULL)) { |
458 xattr = B_FALSE; | |
459 do_xattr = B_TRUE; | |
460 } else if (vfs_optionisset(vfsp, MNTOPT_XATTR, NULL)) { | |
461 xattr = B_TRUE; | |
462 do_xattr = B_TRUE; | |
463 } | |
4596
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
464 if (vfs_optionisset(vfsp, MNTOPT_NOATIME, NULL)) { |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
465 atime = B_FALSE; |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
466 do_atime = B_TRUE; |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
467 } else if (vfs_optionisset(vfsp, MNTOPT_ATIME, NULL)) { |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
468 atime = B_TRUE; |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
469 do_atime = B_TRUE; |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
470 } |
1544 | 471 |
472 /* | |
5331 | 473 * nbmand is a special property. It can only be changed at |
474 * mount time. | |
475 * | |
476 * This is weird, but it is documented to only be changeable | |
477 * at mount time. | |
478 */ | |
479 if (vfs_optionisset(vfsp, MNTOPT_NONBMAND, NULL)) { | |
480 nbmand = B_FALSE; | |
481 } else if (vfs_optionisset(vfsp, MNTOPT_NBMAND, NULL)) { | |
482 nbmand = B_TRUE; | |
483 } else { | |
484 char osname[MAXNAMELEN]; | |
485 | |
486 dmu_objset_name(os, osname); | |
487 if (error = dsl_prop_get_integer(osname, "nbmand", &nbmand, | |
7265 | 488 NULL)) { |
489 return (error); | |
490 } | |
5331 | 491 } |
492 | |
493 /* | |
1544 | 494 * Register property callbacks. |
495 * | |
496 * It would probably be fine to just check for i/o error from | |
497 * the first prop_register(), but I guess I like to go | |
498 * overboard... | |
499 */ | |
500 ds = dmu_objset_ds(os); | |
501 error = dsl_prop_register(ds, "atime", atime_changed_cb, zfsvfs); | |
502 error = error ? error : dsl_prop_register(ds, | |
3234 | 503 "xattr", xattr_changed_cb, zfsvfs); |
504 error = error ? error : dsl_prop_register(ds, | |
1544 | 505 "recordsize", blksz_changed_cb, zfsvfs); |
506 error = error ? error : dsl_prop_register(ds, | |
507 "readonly", readonly_changed_cb, zfsvfs); | |
508 error = error ? error : dsl_prop_register(ds, | |
509 "devices", devices_changed_cb, zfsvfs); | |
510 error = error ? error : dsl_prop_register(ds, | |
511 "setuid", setuid_changed_cb, zfsvfs); | |
512 error = error ? error : dsl_prop_register(ds, | |
513 "exec", exec_changed_cb, zfsvfs); | |
514 error = error ? error : dsl_prop_register(ds, | |
515 "snapdir", snapdir_changed_cb, zfsvfs); | |
516 error = error ? error : dsl_prop_register(ds, | |
517 "aclinherit", acl_inherit_changed_cb, zfsvfs); | |
5331 | 518 error = error ? error : dsl_prop_register(ds, |
519 "vscan", vscan_changed_cb, zfsvfs); | |
1544 | 520 if (error) |
521 goto unregister; | |
522 | |
523 /* | |
524 * Invoke our callbacks to restore temporary mount options. | |
525 */ | |
526 if (do_readonly) | |
527 readonly_changed_cb(zfsvfs, readonly); | |
528 if (do_setuid) | |
529 setuid_changed_cb(zfsvfs, setuid); | |
530 if (do_exec) | |
531 exec_changed_cb(zfsvfs, exec); | |
532 if (do_devices) | |
533 devices_changed_cb(zfsvfs, devices); | |
3234 | 534 if (do_xattr) |
535 xattr_changed_cb(zfsvfs, xattr); | |
4596
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
536 if (do_atime) |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
537 atime_changed_cb(zfsvfs, atime); |
1544 | 538 |
5331 | 539 nbmand_changed_cb(zfsvfs, nbmand); |
540 | |
1544 | 541 return (0); |
542 | |
543 unregister: | |
544 /* | |
545 * We may attempt to unregister some callbacks that are not | |
546 * registered, but this is OK; it will simply return ENOMSG, | |
547 * which we will ignore. | |
548 */ | |
549 (void) dsl_prop_unregister(ds, "atime", atime_changed_cb, zfsvfs); | |
3234 | 550 (void) dsl_prop_unregister(ds, "xattr", xattr_changed_cb, zfsvfs); |
1544 | 551 (void) dsl_prop_unregister(ds, "recordsize", blksz_changed_cb, zfsvfs); |
552 (void) dsl_prop_unregister(ds, "readonly", readonly_changed_cb, zfsvfs); | |
553 (void) dsl_prop_unregister(ds, "devices", devices_changed_cb, zfsvfs); | |
554 (void) dsl_prop_unregister(ds, "setuid", setuid_changed_cb, zfsvfs); | |
555 (void) dsl_prop_unregister(ds, "exec", exec_changed_cb, zfsvfs); | |
556 (void) dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb, zfsvfs); | |
557 (void) dsl_prop_unregister(ds, "aclinherit", acl_inherit_changed_cb, | |
558 zfsvfs); | |
5331 | 559 (void) dsl_prop_unregister(ds, "vscan", vscan_changed_cb, zfsvfs); |
1544 | 560 return (error); |
561 | |
562 } | |
563 | |
10407
34e10c4af053
6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10342
diff
changeset
|
564 static int |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
565 zfs_space_delta_cb(dmu_object_type_t bonustype, void *data, |
10407
34e10c4af053
6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10342
diff
changeset
|
566 uint64_t *userp, uint64_t *groupp) |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
567 { |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
568 znode_phys_t *znp = data; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
569 int error = 0; |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
570 |
12178
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
571 /* |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
572 * Is it a valid type of object to track? |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
573 */ |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
574 if (bonustype != DMU_OT_ZNODE && bonustype != DMU_OT_SA) |
10407
34e10c4af053
6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10342
diff
changeset
|
575 return (ENOENT); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
576 |
12178
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
577 /* |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
578 * If we have a NULL data pointer |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
579 * then assume the id's aren't changing and |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
580 * return EEXIST to the dmu to let it know to |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
581 * use the same ids |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
582 */ |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
583 if (data == NULL) |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
584 return (EEXIST); |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
585 |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
586 if (bonustype == DMU_OT_ZNODE) { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
587 *userp = znp->zp_uid; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
588 *groupp = znp->zp_gid; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
589 } else { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
590 int hdrsize; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
591 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
592 ASSERT(bonustype == DMU_OT_SA); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
593 hdrsize = sa_hdrsize(data); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
594 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
595 if (hdrsize != 0) { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
596 *userp = *((uint64_t *)((uintptr_t)data + hdrsize + |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
597 SA_UID_OFFSET)); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
598 *groupp = *((uint64_t *)((uintptr_t)data + hdrsize + |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
599 SA_GID_OFFSET)); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
600 } else { |
12178
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
601 /* |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
602 * This should only happen for newly created |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
603 * files that haven't had the znode data filled |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
604 * in yet. |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
605 */ |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
606 *userp = 0; |
93ec1371f750
6939983 assertion failed: zap_count(os, DMU_USERUSED_OBJECT, &count) != 0||count == 0, in dsl_dataset.c
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
12164
diff
changeset
|
607 *groupp = 0; |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
608 } |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
609 } |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
610 return (error); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
611 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
612 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
613 static void |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
614 fuidstr_to_sid(zfsvfs_t *zfsvfs, const char *fuidstr, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
615 char *domainbuf, int buflen, uid_t *ridp) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
616 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
617 uint64_t fuid; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
618 const char *domain; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
619 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
620 fuid = strtonum(fuidstr, NULL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
621 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
622 domain = zfs_fuid_find_by_idx(zfsvfs, FUID_INDEX(fuid)); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
623 if (domain) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
624 (void) strlcpy(domainbuf, domain, buflen); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
625 else |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
626 domainbuf[0] = '\0'; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
627 *ridp = FUID_RID(fuid); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
628 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
629 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
630 static uint64_t |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
631 zfs_userquota_prop_to_obj(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
632 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
633 switch (type) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
634 case ZFS_PROP_USERUSED: |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
635 return (DMU_USERUSED_OBJECT); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
636 case ZFS_PROP_GROUPUSED: |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
637 return (DMU_GROUPUSED_OBJECT); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
638 case ZFS_PROP_USERQUOTA: |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
639 return (zfsvfs->z_userquota_obj); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
640 case ZFS_PROP_GROUPQUOTA: |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
641 return (zfsvfs->z_groupquota_obj); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
642 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
643 return (0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
644 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
645 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
646 int |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
647 zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
648 uint64_t *cookiep, void *vbuf, uint64_t *bufsizep) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
649 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
650 int error; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
651 zap_cursor_t zc; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
652 zap_attribute_t za; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
653 zfs_useracct_t *buf = vbuf; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
654 uint64_t obj; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
655 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
656 if (!dmu_objset_userspace_present(zfsvfs->z_os)) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
657 return (ENOTSUP); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
658 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
659 obj = zfs_userquota_prop_to_obj(zfsvfs, type); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
660 if (obj == 0) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
661 *bufsizep = 0; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
662 return (0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
663 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
664 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
665 for (zap_cursor_init_serialized(&zc, zfsvfs->z_os, obj, *cookiep); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
666 (error = zap_cursor_retrieve(&zc, &za)) == 0; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
667 zap_cursor_advance(&zc)) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
668 if ((uintptr_t)buf - (uintptr_t)vbuf + sizeof (zfs_useracct_t) > |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
669 *bufsizep) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
670 break; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
671 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
672 fuidstr_to_sid(zfsvfs, za.za_name, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
673 buf->zu_domain, sizeof (buf->zu_domain), &buf->zu_rid); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
674 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
675 buf->zu_space = za.za_first_integer; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
676 buf++; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
677 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
678 if (error == ENOENT) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
679 error = 0; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
680 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
681 ASSERT3U((uintptr_t)buf - (uintptr_t)vbuf, <=, *bufsizep); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
682 *bufsizep = (uintptr_t)buf - (uintptr_t)vbuf; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
683 *cookiep = zap_cursor_serialize(&zc); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
684 zap_cursor_fini(&zc); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
685 return (error); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
686 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
687 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
688 /* |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
689 * buf must be big enough (eg, 32 bytes) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
690 */ |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
691 static int |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
692 id_to_fuidstr(zfsvfs_t *zfsvfs, const char *domain, uid_t rid, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
693 char *buf, boolean_t addok) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
694 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
695 uint64_t fuid; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
696 int domainid = 0; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
697 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
698 if (domain && domain[0]) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
699 domainid = zfs_fuid_find_by_domain(zfsvfs, domain, NULL, addok); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
700 if (domainid == -1) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
701 return (ENOENT); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
702 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
703 fuid = FUID_ENCODE(domainid, rid); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
704 (void) sprintf(buf, "%llx", (longlong_t)fuid); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
705 return (0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
706 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
707 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
708 int |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
709 zfs_userspace_one(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
710 const char *domain, uint64_t rid, uint64_t *valp) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
711 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
712 char buf[32]; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
713 int err; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
714 uint64_t obj; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
715 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
716 *valp = 0; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
717 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
718 if (!dmu_objset_userspace_present(zfsvfs->z_os)) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
719 return (ENOTSUP); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
720 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
721 obj = zfs_userquota_prop_to_obj(zfsvfs, type); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
722 if (obj == 0) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
723 return (0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
724 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
725 err = id_to_fuidstr(zfsvfs, domain, rid, buf, B_FALSE); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
726 if (err) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
727 return (err); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
728 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
729 err = zap_lookup(zfsvfs->z_os, obj, buf, 8, 1, valp); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
730 if (err == ENOENT) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
731 err = 0; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
732 return (err); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
733 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
734 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
735 int |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
736 zfs_set_userquota(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
737 const char *domain, uint64_t rid, uint64_t quota) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
738 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
739 char buf[32]; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
740 int err; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
741 dmu_tx_t *tx; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
742 uint64_t *objp; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
743 boolean_t fuid_dirtied; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
744 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
745 if (type != ZFS_PROP_USERQUOTA && type != ZFS_PROP_GROUPQUOTA) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
746 return (EINVAL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
747 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
748 if (zfsvfs->z_version < ZPL_VERSION_USERSPACE) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
749 return (ENOTSUP); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
750 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
751 objp = (type == ZFS_PROP_USERQUOTA) ? &zfsvfs->z_userquota_obj : |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
752 &zfsvfs->z_groupquota_obj; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
753 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
754 err = id_to_fuidstr(zfsvfs, domain, rid, buf, B_TRUE); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
755 if (err) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
756 return (err); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
757 fuid_dirtied = zfsvfs->z_fuid_dirty; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
758 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
759 tx = dmu_tx_create(zfsvfs->z_os); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
760 dmu_tx_hold_zap(tx, *objp ? *objp : DMU_NEW_OBJECT, B_TRUE, NULL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
761 if (*objp == 0) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
762 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
763 zfs_userquota_prop_prefixes[type]); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
764 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
765 if (fuid_dirtied) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
766 zfs_fuid_txhold(zfsvfs, tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
767 err = dmu_tx_assign(tx, TXG_WAIT); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
768 if (err) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
769 dmu_tx_abort(tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
770 return (err); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
771 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
772 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
773 mutex_enter(&zfsvfs->z_lock); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
774 if (*objp == 0) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
775 *objp = zap_create(zfsvfs->z_os, DMU_OT_USERGROUP_QUOTA, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
776 DMU_OT_NONE, 0, tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
777 VERIFY(0 == zap_add(zfsvfs->z_os, MASTER_NODE_OBJ, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
778 zfs_userquota_prop_prefixes[type], 8, 1, objp, tx)); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
779 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
780 mutex_exit(&zfsvfs->z_lock); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
781 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
782 if (quota == 0) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
783 err = zap_remove(zfsvfs->z_os, *objp, buf, tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
784 if (err == ENOENT) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
785 err = 0; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
786 } else { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
787 err = zap_update(zfsvfs->z_os, *objp, buf, 8, 1, "a, tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
788 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
789 ASSERT(err == 0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
790 if (fuid_dirtied) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
791 zfs_fuid_sync(zfsvfs, tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
792 dmu_tx_commit(tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
793 return (err); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
794 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
795 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
796 boolean_t |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
797 zfs_fuid_overquota(zfsvfs_t *zfsvfs, boolean_t isgroup, uint64_t fuid) |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
798 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
799 char buf[32]; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
800 uint64_t used, quota, usedobj, quotaobj; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
801 int err; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
802 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
803 usedobj = isgroup ? DMU_GROUPUSED_OBJECT : DMU_USERUSED_OBJECT; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
804 quotaobj = isgroup ? zfsvfs->z_groupquota_obj : zfsvfs->z_userquota_obj; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
805 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
806 if (quotaobj == 0 || zfsvfs->z_replay) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
807 return (B_FALSE); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
808 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
809 (void) sprintf(buf, "%llx", (longlong_t)fuid); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
810 err = zap_lookup(zfsvfs->z_os, quotaobj, buf, 8, 1, "a); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
811 if (err != 0) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
812 return (B_FALSE); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
813 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
814 err = zap_lookup(zfsvfs->z_os, usedobj, buf, 8, 1, &used); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
815 if (err != 0) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
816 return (B_FALSE); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
817 return (used >= quota); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
818 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
819 |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
820 boolean_t |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
821 zfs_owner_overquota(zfsvfs_t *zfsvfs, znode_t *zp, boolean_t isgroup) |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
822 { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
823 uint64_t fuid; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
824 uint64_t quotaobj; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
825 uid_t id; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
826 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
827 quotaobj = isgroup ? zfsvfs->z_groupquota_obj : zfsvfs->z_userquota_obj; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
828 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
829 id = isgroup ? zp->z_gid : zp->z_uid; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
830 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
831 if (quotaobj == 0 || zfsvfs->z_replay) |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
832 return (B_FALSE); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
833 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
834 if (IS_EPHEMERAL(id)) { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
835 VERIFY(0 == sa_lookup(zp->z_sa_hdl, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
836 isgroup ? SA_ZPL_GID(zfsvfs) : SA_ZPL_UID(zfsvfs), |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
837 &fuid, sizeof (fuid))); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
838 } else { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
839 fuid = (uint64_t)id; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
840 } |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
841 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
842 return (zfs_fuid_overquota(zfsvfs, isgroup, fuid)); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
843 } |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
844 |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
845 int |
11185
f0c31008e395
6887924 PP_ISKAS needs to be defined in terms of VN_ISKAS for vnodes
Sean McEnroe <Sean.McEnroe@Sun.COM>
parents:
11022
diff
changeset
|
846 zfsvfs_create(const char *osname, zfsvfs_t **zfvp) |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
847 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
848 objset_t *os; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
849 zfsvfs_t *zfsvfs; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
850 uint64_t zval; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
851 int i, error; |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
852 uint64_t sa_obj; |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
853 |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
854 zfsvfs = kmem_zalloc(sizeof (zfsvfs_t), KM_SLEEP); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
855 |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
856 /* |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
857 * We claim to always be readonly so we can open snapshots; |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
858 * other ZPL code will prevent us from writing to snapshots. |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
859 */ |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
860 error = dmu_objset_own(osname, DMU_OST_ZFS, B_TRUE, zfsvfs, &os); |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
861 if (error) { |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
862 kmem_free(zfsvfs, sizeof (zfsvfs_t)); |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
863 return (error); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
864 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
865 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
866 /* |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
867 * Initialize the zfs-specific filesystem structure. |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
868 * Should probably make this a kmem cache, shuffle fields, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
869 * and just bzero up to z_hold_mtx[]. |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
870 */ |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
871 zfsvfs->z_vfs = NULL; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
872 zfsvfs->z_parent = zfsvfs; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
873 zfsvfs->z_max_blksz = SPA_MAXBLOCKSIZE; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
874 zfsvfs->z_show_ctldir = ZFS_SNAPDIR_VISIBLE; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
875 zfsvfs->z_os = os; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
876 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
877 error = zfs_get_zplprop(os, ZFS_PROP_VERSION, &zfsvfs->z_version); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
878 if (error) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
879 goto out; |
12070
01261b276236
6940770 panic in sa_find_idx_tab() after receiving into pool when version shouldn't have allowed it
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11935
diff
changeset
|
880 } else if (zfsvfs->z_version > |
01261b276236
6940770 panic in sa_find_idx_tab() after receiving into pool when version shouldn't have allowed it
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11935
diff
changeset
|
881 zfs_zpl_version_map(spa_version(dmu_objset_spa(os)))) { |
01261b276236
6940770 panic in sa_find_idx_tab() after receiving into pool when version shouldn't have allowed it
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11935
diff
changeset
|
882 (void) printf("Can't mount a version %lld file system " |
01261b276236
6940770 panic in sa_find_idx_tab() after receiving into pool when version shouldn't have allowed it
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11935
diff
changeset
|
883 "on a version %lld pool\n. Pool must be upgraded to mount " |
01261b276236
6940770 panic in sa_find_idx_tab() after receiving into pool when version shouldn't have allowed it
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11935
diff
changeset
|
884 "this file system.", (u_longlong_t)zfsvfs->z_version, |
01261b276236
6940770 panic in sa_find_idx_tab() after receiving into pool when version shouldn't have allowed it
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11935
diff
changeset
|
885 (u_longlong_t)spa_version(dmu_objset_spa(os))); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
886 error = ENOTSUP; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
887 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
888 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
889 if ((error = zfs_get_zplprop(os, ZFS_PROP_NORMALIZE, &zval)) != 0) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
890 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
891 zfsvfs->z_norm = (int)zval; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
892 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
893 if ((error = zfs_get_zplprop(os, ZFS_PROP_UTF8ONLY, &zval)) != 0) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
894 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
895 zfsvfs->z_utf8 = (zval != 0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
896 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
897 if ((error = zfs_get_zplprop(os, ZFS_PROP_CASE, &zval)) != 0) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
898 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
899 zfsvfs->z_case = (uint_t)zval; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
900 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
901 /* |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
902 * Fold case on file systems that are always or sometimes case |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
903 * insensitive. |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
904 */ |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
905 if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE || |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
906 zfsvfs->z_case == ZFS_CASE_MIXED) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
907 zfsvfs->z_norm |= U8_TEXTPREP_TOUPPER; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
908 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
909 zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os); |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
910 zfsvfs->z_use_sa = USE_SA(zfsvfs->z_version, zfsvfs->z_os); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
911 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
912 if (zfsvfs->z_use_sa) { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
913 /* should either have both of these objects or none */ |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
914 error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_SA_ATTRS, 8, 1, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
915 &sa_obj); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
916 if (error) |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
917 return (error); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
918 } else { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
919 /* |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
920 * Pre SA versions file systems should never touch |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
921 * either the attribute registration or layout objects. |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
922 */ |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
923 sa_obj = 0; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
924 } |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
925 |
12493
89ce40422cea
6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents:
12296
diff
changeset
|
926 error = sa_setup(os, sa_obj, zfs_attr_table, ZPL_END, |
89ce40422cea
6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents:
12296
diff
changeset
|
927 &zfsvfs->z_attr_table); |
89ce40422cea
6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents:
12296
diff
changeset
|
928 if (error) |
89ce40422cea
6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents:
12296
diff
changeset
|
929 goto out; |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
930 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
931 if (zfsvfs->z_version >= ZPL_VERSION_SA) |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
932 sa_register_update_callback(os, zfs_sa_upgrade); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
933 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
934 error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_ROOT_OBJ, 8, 1, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
935 &zfsvfs->z_root); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
936 if (error) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
937 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
938 ASSERT(zfsvfs->z_root != 0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
939 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
940 error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_UNLINKED_SET, 8, 1, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
941 &zfsvfs->z_unlinkedobj); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
942 if (error) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
943 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
944 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
945 error = zap_lookup(os, MASTER_NODE_OBJ, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
946 zfs_userquota_prop_prefixes[ZFS_PROP_USERQUOTA], |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
947 8, 1, &zfsvfs->z_userquota_obj); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
948 if (error && error != ENOENT) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
949 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
950 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
951 error = zap_lookup(os, MASTER_NODE_OBJ, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
952 zfs_userquota_prop_prefixes[ZFS_PROP_GROUPQUOTA], |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
953 8, 1, &zfsvfs->z_groupquota_obj); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
954 if (error && error != ENOENT) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
955 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
956 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
957 error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_FUID_TABLES, 8, 1, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
958 &zfsvfs->z_fuid_obj); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
959 if (error && error != ENOENT) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
960 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
961 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
962 error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_SHARES_DIR, 8, 1, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
963 &zfsvfs->z_shares_dir); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
964 if (error && error != ENOENT) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
965 goto out; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
966 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
967 mutex_init(&zfsvfs->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
968 mutex_init(&zfsvfs->z_lock, NULL, MUTEX_DEFAULT, NULL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
969 list_create(&zfsvfs->z_all_znodes, sizeof (znode_t), |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
970 offsetof(znode_t, z_link_node)); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
971 rrw_init(&zfsvfs->z_teardown_lock); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
972 rw_init(&zfsvfs->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
973 rw_init(&zfsvfs->z_fuid_lock, NULL, RW_DEFAULT, NULL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
974 for (i = 0; i != ZFS_OBJ_MTX_SZ; i++) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
975 mutex_init(&zfsvfs->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
976 |
11185
f0c31008e395
6887924 PP_ISKAS needs to be defined in terms of VN_ISKAS for vnodes
Sean McEnroe <Sean.McEnroe@Sun.COM>
parents:
11022
diff
changeset
|
977 *zfvp = zfsvfs; |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
978 return (0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
979 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
980 out: |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
981 dmu_objset_disown(os, zfsvfs); |
11185
f0c31008e395
6887924 PP_ISKAS needs to be defined in terms of VN_ISKAS for vnodes
Sean McEnroe <Sean.McEnroe@Sun.COM>
parents:
11022
diff
changeset
|
982 *zfvp = NULL; |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
983 kmem_free(zfsvfs, sizeof (zfsvfs_t)); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
984 return (error); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
985 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
986 |
1544 | 987 static int |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
988 zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
989 { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
990 int error; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
991 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
992 error = zfs_register_callbacks(zfsvfs->z_vfs); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
993 if (error) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
994 return (error); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
995 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
996 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
997 * Set the objset user_ptr to track its zfsvfs. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
998 */ |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
999 mutex_enter(&zfsvfs->z_os->os_user_ptr_lock); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1000 dmu_objset_set_user(zfsvfs->z_os, zfsvfs); |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1001 mutex_exit(&zfsvfs->z_os->os_user_ptr_lock); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1002 |
9292
e112194b5b73
6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents:
9246
diff
changeset
|
1003 zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data); |
e112194b5b73
6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents:
9246
diff
changeset
|
1004 |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1005 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1006 * If we are not mounting (ie: online recv), then we don't |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1007 * have to worry about replaying the log as we blocked all |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1008 * operations out since we closed the ZIL. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1009 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1010 if (mounting) { |
7638
5505e89fa6c8
6741237 zfs hang in txg_wait_open() on boot
Neil Perrin <Neil.Perrin@Sun.COM>
parents:
7265
diff
changeset
|
1011 boolean_t readonly; |
5505e89fa6c8
6741237 zfs hang in txg_wait_open() on boot
Neil Perrin <Neil.Perrin@Sun.COM>
parents:
7265
diff
changeset
|
1012 |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1013 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1014 * During replay we remove the read only flag to |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1015 * allow replays to succeed. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1016 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1017 readonly = zfsvfs->z_vfs->vfs_flag & VFS_RDONLY; |
8227 | 1018 if (readonly != 0) |
1019 zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY; | |
1020 else | |
1021 zfs_unlinked_drain(zfsvfs); | |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1022 |
12294
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1023 /* |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1024 * Parse and replay the intent log. |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1025 * |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1026 * Because of ziltest, this must be done after |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1027 * zfs_unlinked_drain(). (Further note: ziltest |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1028 * doesn't use readonly mounts, where |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1029 * zfs_unlinked_drain() isn't called.) This is because |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1030 * ziltest causes spa_sync() to think it's committed, |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1031 * but actually it is not, so the intent log contains |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1032 * many txg's worth of changes. |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1033 * |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1034 * In particular, if object N is in the unlinked set in |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1035 * the last txg to actually sync, then it could be |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1036 * actually freed in a later txg and then reallocated |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1037 * in a yet later txg. This would write a "create |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1038 * object N" record to the intent log. Normally, this |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1039 * would be fine because the spa_sync() would have |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1040 * written out the fact that object N is free, before |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1041 * we could write the "create object N" intent log |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1042 * record. |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1043 * |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1044 * But when we are in ziltest mode, we advance the "open |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1045 * txg" without actually spa_sync()-ing the changes to |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1046 * disk. So we would see that object N is still |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1047 * allocated and in the unlinked set, and there is an |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1048 * intent log record saying to allocate it. |
2a74b443e6b1
PSARC/2010/108 zil synchronicity
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12178
diff
changeset
|
1049 */ |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1050 if (spa_writeable(dmu_objset_spa(zfsvfs->z_os))) { |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1051 if (zil_replay_disable) { |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1052 zil_destroy(zfsvfs->z_log, B_FALSE); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1053 } else { |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1054 zfsvfs->z_replay = B_TRUE; |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1055 zil_replay(zfsvfs->z_os, zfsvfs, |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1056 zfs_replay_vector); |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1057 zfsvfs->z_replay = B_FALSE; |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1058 } |
8227 | 1059 } |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1060 zfsvfs->z_vfs->vfs_flag |= readonly; /* restore readonly bit */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1061 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1062 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1063 return (0); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1064 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1065 |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1066 void |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1067 zfsvfs_free(zfsvfs_t *zfsvfs) |
6083
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1068 { |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1069 int i; |
9788
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1070 extern krwlock_t zfsvfs_lock; /* in zfs_znode.c */ |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1071 |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1072 /* |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1073 * This is a barrier to prevent the filesystem from going away in |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1074 * zfs_znode_move() until we can safely ensure that the filesystem is |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1075 * not unmounted. We consider the filesystem valid before the barrier |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1076 * and invalid after the barrier. |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1077 */ |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1078 rw_enter(&zfsvfs_lock, RW_READER); |
f660bc44f2e8
6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
9749
diff
changeset
|
1079 rw_exit(&zfsvfs_lock); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1080 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1081 zfs_fuid_destroy(zfsvfs); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1082 |
6083
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1083 mutex_destroy(&zfsvfs->z_znodes_lock); |
9030
243fd360d81f
6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
8227
diff
changeset
|
1084 mutex_destroy(&zfsvfs->z_lock); |
6083
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1085 list_destroy(&zfsvfs->z_all_znodes); |
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1086 rrw_destroy(&zfsvfs->z_teardown_lock); |
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1087 rw_destroy(&zfsvfs->z_teardown_inactive_lock); |
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1088 rw_destroy(&zfsvfs->z_fuid_lock); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1089 for (i = 0; i != ZFS_OBJ_MTX_SZ; i++) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1090 mutex_destroy(&zfsvfs->z_hold_mtx[i]); |
6083
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1091 kmem_free(zfsvfs, sizeof (zfsvfs_t)); |
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1092 } |
23e77aa611b1
6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents:
5648
diff
changeset
|
1093 |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1094 static void |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1095 zfs_set_fuid_feature(zfsvfs_t *zfsvfs) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1096 { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1097 zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1098 if (zfsvfs->z_use_fuids && zfsvfs->z_vfs) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1099 vfs_set_feature(zfsvfs->z_vfs, VFSFT_XVATTR); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1100 vfs_set_feature(zfsvfs->z_vfs, VFSFT_SYSATTR_VIEWS); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1101 vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACEMASKONACCESS); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1102 vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACLONCREATE); |
9749
105f407a2680
PSARC 2009/246 ZFS support for Access Based Enumeration
Tim Haley <Tim.Haley@Sun.COM>
parents:
9688
diff
changeset
|
1103 vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACCESS_FILTER); |
10793
34709091de6d
6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents:
10685
diff
changeset
|
1104 vfs_set_feature(zfsvfs->z_vfs, VFSFT_REPARSE); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1105 } |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
1106 zfsvfs->z_use_sa = USE_SA(zfsvfs->z_version, zfsvfs->z_os); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1107 } |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1108 |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1109 static int |
7046
361307ae060d
6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents:
6689
diff
changeset
|
1110 zfs_domount(vfs_t *vfsp, char *osname) |
1544 | 1111 { |
1112 dev_t mount_dev; | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1113 uint64_t recordsize, fsid_guid; |
1544 | 1114 int error = 0; |
1115 zfsvfs_t *zfsvfs; | |
1116 | |
1117 ASSERT(vfsp); | |
1118 ASSERT(osname); | |
1119 | |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1120 error = zfsvfs_create(osname, &zfsvfs); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1121 if (error) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1122 return (error); |
1544 | 1123 zfsvfs->z_vfs = vfsp; |
1124 | |
1125 /* Initialize the generic filesystem structure. */ | |
1126 vfsp->vfs_bcount = 0; | |
1127 vfsp->vfs_data = NULL; | |
1128 | |
1129 if (zfs_create_unique_device(&mount_dev) == -1) { | |
1130 error = ENODEV; | |
1131 goto out; | |
1132 } | |
1133 ASSERT(vfs_devismounted(mount_dev) == 0); | |
1134 | |
1135 if (error = dsl_prop_get_integer(osname, "recordsize", &recordsize, | |
1136 NULL)) | |
1137 goto out; | |
1138 | |
1139 vfsp->vfs_dev = mount_dev; | |
1140 vfsp->vfs_fstype = zfsfstype; | |
1141 vfsp->vfs_bsize = recordsize; | |
1142 vfsp->vfs_flag |= VFS_NOTRUNC; | |
1143 vfsp->vfs_data = zfsvfs; | |
1144 | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1145 /* |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1146 * The fsid is 64 bits, composed of an 8-bit fs type, which |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1147 * separates our fsid from any other filesystem types, and a |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1148 * 56-bit objset unique ID. The objset unique ID is unique to |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1149 * all objsets open on this system, provided by unique_create(). |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1150 * The 8-bit fs type must be put in the low bits of fsid[1] |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1151 * because that's where other Solaris filesystems put it. |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1152 */ |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1153 fsid_guid = dmu_objset_fsid_guid(zfsvfs->z_os); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1154 ASSERT((fsid_guid & ~((1ULL<<56)-1)) == 0); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1155 vfsp->vfs_fsid.val[0] = fsid_guid; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1156 vfsp->vfs_fsid.val[1] = ((fsid_guid>>32) << 8) | |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1157 zfsfstype & 0xFF; |
1544 | 1158 |
5331 | 1159 /* |
1160 * Set features for file system. | |
1161 */ | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1162 zfs_set_fuid_feature(zfsvfs); |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1163 if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE) { |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1164 vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS); |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1165 vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE); |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1166 vfs_set_feature(vfsp, VFSFT_NOCASESENSITIVE); |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1167 } else if (zfsvfs->z_case == ZFS_CASE_MIXED) { |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1168 vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS); |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1169 vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE); |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
1170 } |
11539
10d35fc3d7fd
6873106 Need a mechanism to share buffers between fs modules
chunli zhang - Sun Microsystems - Irvine United States <Chunli.Zhang@Sun.COM>
parents:
11185
diff
changeset
|
1171 vfs_set_feature(vfsp, VFSFT_ZEROCOPY_SUPPORTED); |
5331 | 1172 |
1544 | 1173 if (dmu_objset_is_snapshot(zfsvfs->z_os)) { |
5331 | 1174 uint64_t pval; |
3234 | 1175 |
1544 | 1176 atime_changed_cb(zfsvfs, B_FALSE); |
1177 readonly_changed_cb(zfsvfs, B_TRUE); | |
5331 | 1178 if (error = dsl_prop_get_integer(osname, "xattr", &pval, NULL)) |
3234 | 1179 goto out; |
5331 | 1180 xattr_changed_cb(zfsvfs, pval); |
1544 | 1181 zfsvfs->z_issnap = B_TRUE; |
12530
805d6a3f27b5
6957113 accessing a fifo special file in .zfs snapshot dir panics kernel
Mark J Musante <Mark.Musante@Sun.COM>
parents:
12493
diff
changeset
|
1182 zfsvfs->z_os->os_sync = ZFS_SYNC_DISABLED; |
9688
127be1845343
6841321 zfs userspace / zfs get userused@ doesn't work on mounted snapshot
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9396
diff
changeset
|
1183 |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1184 mutex_enter(&zfsvfs->z_os->os_user_ptr_lock); |
9688
127be1845343
6841321 zfs userspace / zfs get userused@ doesn't work on mounted snapshot
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9396
diff
changeset
|
1185 dmu_objset_set_user(zfsvfs->z_os, zfsvfs); |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1186 mutex_exit(&zfsvfs->z_os->os_user_ptr_lock); |
1544 | 1187 } else { |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1188 error = zfsvfs_setup(zfsvfs, B_TRUE); |
1544 | 1189 } |
1190 | |
1191 if (!zfsvfs->z_issnap) | |
1192 zfsctl_create(zfsvfs); | |
1193 out: | |
1194 if (error) { | |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1195 dmu_objset_disown(zfsvfs->z_os, zfsvfs); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
1196 zfsvfs_free(zfsvfs); |
1544 | 1197 } else { |
1198 atomic_add_32(&zfs_active_fs_count, 1); | |
1199 } | |
1200 | |
1201 return (error); | |
1202 } | |
1203 | |
1204 void | |
1205 zfs_unregister_callbacks(zfsvfs_t *zfsvfs) | |
1206 { | |
1207 objset_t *os = zfsvfs->z_os; | |
1208 struct dsl_dataset *ds; | |
1209 | |
1210 /* | |
1211 * Unregister properties. | |
1212 */ | |
1213 if (!dmu_objset_is_snapshot(os)) { | |
1214 ds = dmu_objset_ds(os); | |
1215 VERIFY(dsl_prop_unregister(ds, "atime", atime_changed_cb, | |
1216 zfsvfs) == 0); | |
1217 | |
3234 | 1218 VERIFY(dsl_prop_unregister(ds, "xattr", xattr_changed_cb, |
1219 zfsvfs) == 0); | |
1220 | |
1544 | 1221 VERIFY(dsl_prop_unregister(ds, "recordsize", blksz_changed_cb, |
1222 zfsvfs) == 0); | |
1223 | |
1224 VERIFY(dsl_prop_unregister(ds, "readonly", readonly_changed_cb, | |
1225 zfsvfs) == 0); | |
1226 | |
1227 VERIFY(dsl_prop_unregister(ds, "devices", devices_changed_cb, | |
1228 zfsvfs) == 0); | |
1229 | |
1230 VERIFY(dsl_prop_unregister(ds, "setuid", setuid_changed_cb, | |
1231 zfsvfs) == 0); | |
1232 | |
1233 VERIFY(dsl_prop_unregister(ds, "exec", exec_changed_cb, | |
1234 zfsvfs) == 0); | |
1235 | |
1236 VERIFY(dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb, | |
1237 zfsvfs) == 0); | |
1238 | |
1239 VERIFY(dsl_prop_unregister(ds, "aclinherit", | |
1240 acl_inherit_changed_cb, zfsvfs) == 0); | |
5331 | 1241 |
1242 VERIFY(dsl_prop_unregister(ds, "vscan", | |
1243 vscan_changed_cb, zfsvfs) == 0); | |
1544 | 1244 } |
1245 } | |
1246 | |
3912 | 1247 /* |
1248 * Convert a decimal digit string to a uint64_t integer. | |
1249 */ | |
1250 static int | |
1251 str_to_uint64(char *str, uint64_t *objnum) | |
1252 { | |
1253 uint64_t num = 0; | |
1254 | |
1255 while (*str) { | |
1256 if (*str < '0' || *str > '9') | |
1257 return (EINVAL); | |
1258 | |
1259 num = num*10 + *str++ - '0'; | |
1260 } | |
1261 | |
1262 *objnum = num; | |
1263 return (0); | |
1264 } | |
1265 | |
1266 /* | |
1267 * The boot path passed from the boot loader is in the form of | |
1268 * "rootpool-name/root-filesystem-object-number'. Convert this | |
1269 * string to a dataset name: "rootpool-name/root-filesystem-name". | |
1270 */ | |
1271 static int | |
6423 | 1272 zfs_parse_bootfs(char *bpath, char *outpath) |
3912 | 1273 { |
1274 char *slashp; | |
1275 uint64_t objnum; | |
1276 int error; | |
1277 | |
1278 if (*bpath == 0 || *bpath == '/') | |
1279 return (EINVAL); | |
1280 | |
7656
2621e50fdf4a
PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents:
7638
diff
changeset
|
1281 (void) strcpy(outpath, bpath); |
2621e50fdf4a
PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents:
7638
diff
changeset
|
1282 |
3912 | 1283 slashp = strchr(bpath, '/'); |
1284 | |
1285 /* if no '/', just return the pool name */ | |
1286 if (slashp == NULL) { | |
1287 return (0); | |
1288 } | |
1289 | |
7656
2621e50fdf4a
PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents:
7638
diff
changeset
|
1290 /* if not a number, just return the root dataset name */ |
2621e50fdf4a
PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents:
7638
diff
changeset
|
1291 if (str_to_uint64(slashp+1, &objnum)) { |
2621e50fdf4a
PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents:
7638
diff
changeset
|
1292 return (0); |
2621e50fdf4a
PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents:
7638
diff
changeset
|
1293 } |
3912 | 1294 |
1295 *slashp = '\0'; | |
1296 error = dsl_dsobj_to_dsname(bpath, objnum, outpath); | |
1297 *slashp = '/'; | |
1298 | |
1299 return (error); | |
1300 } | |
1301 | |
10972
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1302 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1303 * zfs_check_global_label: |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1304 * Check that the hex label string is appropriate for the dataset |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1305 * being mounted into the global_zone proper. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1306 * |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1307 * Return an error if the hex label string is not default or |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1308 * admin_low/admin_high. For admin_low labels, the corresponding |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1309 * dataset must be readonly. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1310 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1311 int |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1312 zfs_check_global_label(const char *dsname, const char *hexsl) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1313 { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1314 if (strcasecmp(hexsl, ZFS_MLSLABEL_DEFAULT) == 0) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1315 return (0); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1316 if (strcasecmp(hexsl, ADMIN_HIGH) == 0) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1317 return (0); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1318 if (strcasecmp(hexsl, ADMIN_LOW) == 0) { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1319 /* must be readonly */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1320 uint64_t rdonly; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1321 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1322 if (dsl_prop_get_integer(dsname, |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1323 zfs_prop_to_name(ZFS_PROP_READONLY), &rdonly, NULL)) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1324 return (EACCES); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1325 return (rdonly ? 0 : EACCES); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1326 } |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1327 return (EACCES); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1328 } |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1329 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1330 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1331 * zfs_mount_label_policy: |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1332 * Determine whether the mount is allowed according to MAC check. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1333 * by comparing (where appropriate) label of the dataset against |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1334 * the label of the zone being mounted into. If the dataset has |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1335 * no label, create one. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1336 * |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1337 * Returns: |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1338 * 0 : access allowed |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1339 * >0 : error code, such as EACCES |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1340 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1341 static int |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1342 zfs_mount_label_policy(vfs_t *vfsp, char *osname) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1343 { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1344 int error, retv; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1345 zone_t *mntzone = NULL; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1346 ts_label_t *mnt_tsl; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1347 bslabel_t *mnt_sl; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1348 bslabel_t ds_sl; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1349 char ds_hexsl[MAXNAMELEN]; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1350 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1351 retv = EACCES; /* assume the worst */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1352 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1353 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1354 * Start by getting the dataset label if it exists. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1355 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1356 error = dsl_prop_get(osname, zfs_prop_to_name(ZFS_PROP_MLSLABEL), |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1357 1, sizeof (ds_hexsl), &ds_hexsl, NULL); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1358 if (error) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1359 return (EACCES); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1360 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1361 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1362 * If labeling is NOT enabled, then disallow the mount of datasets |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1363 * which have a non-default label already. No other label checks |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1364 * are needed. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1365 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1366 if (!is_system_labeled()) { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1367 if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1368 return (0); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1369 return (EACCES); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1370 } |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1371 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1372 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1373 * Get the label of the mountpoint. If mounting into the global |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1374 * zone (i.e. mountpoint is not within an active zone and the |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1375 * zoned property is off), the label must be default or |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1376 * admin_low/admin_high only; no other checks are needed. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1377 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1378 mntzone = zone_find_by_any_path(refstr_value(vfsp->vfs_mntpt), B_FALSE); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1379 if (mntzone->zone_id == GLOBAL_ZONEID) { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1380 uint64_t zoned; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1381 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1382 zone_rele(mntzone); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1383 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1384 if (dsl_prop_get_integer(osname, |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1385 zfs_prop_to_name(ZFS_PROP_ZONED), &zoned, NULL)) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1386 return (EACCES); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1387 if (!zoned) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1388 return (zfs_check_global_label(osname, ds_hexsl)); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1389 else |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1390 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1391 * This is the case of a zone dataset being mounted |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1392 * initially, before the zone has been fully created; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1393 * allow this mount into global zone. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1394 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1395 return (0); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1396 } |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1397 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1398 mnt_tsl = mntzone->zone_slabel; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1399 ASSERT(mnt_tsl != NULL); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1400 label_hold(mnt_tsl); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1401 mnt_sl = label2bslabel(mnt_tsl); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1402 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1403 if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0) { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1404 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1405 * The dataset doesn't have a real label, so fabricate one. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1406 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1407 char *str = NULL; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1408 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1409 if (l_to_str_internal(mnt_sl, &str) == 0 && |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1410 dsl_prop_set(osname, zfs_prop_to_name(ZFS_PROP_MLSLABEL), |
11022
63ab26072e41
PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents:
10984
diff
changeset
|
1411 ZPROP_SRC_LOCAL, 1, strlen(str) + 1, str) == 0) |
10972
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1412 retv = 0; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1413 if (str != NULL) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1414 kmem_free(str, strlen(str) + 1); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1415 } else if (hexstr_to_label(ds_hexsl, &ds_sl) == 0) { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1416 /* |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1417 * Now compare labels to complete the MAC check. If the |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1418 * labels are equal then allow access. If the mountpoint |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1419 * label dominates the dataset label, allow readonly access. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1420 * Otherwise, access is denied. |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1421 */ |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1422 if (blequal(mnt_sl, &ds_sl)) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1423 retv = 0; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1424 else if (bldominates(mnt_sl, &ds_sl)) { |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1425 vfs_setmntopt(vfsp, MNTOPT_RO, NULL, 0); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1426 retv = 0; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1427 } |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1428 } |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1429 |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1430 label_rele(mnt_tsl); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1431 zone_rele(mntzone); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1432 return (retv); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1433 } |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1434 |
1544 | 1435 static int |
1436 zfs_mountroot(vfs_t *vfsp, enum whymountroot why) | |
1437 { | |
1438 int error = 0; | |
1439 static int zfsrootdone = 0; | |
1440 zfsvfs_t *zfsvfs = NULL; | |
1441 znode_t *zp = NULL; | |
1442 vnode_t *vp = NULL; | |
6423 | 1443 char *zfs_bootfs; |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1444 char *zfs_devid; |
1544 | 1445 |
1446 ASSERT(vfsp); | |
1447 | |
1448 /* | |
3912 | 1449 * The filesystem that we mount as root is defined in the |
6423 | 1450 * boot property "zfs-bootfs" with a format of |
1451 * "poolname/root-dataset-objnum". | |
1544 | 1452 */ |
1453 if (why == ROOT_INIT) { | |
1454 if (zfsrootdone++) | |
1455 return (EBUSY); | |
6423 | 1456 /* |
1457 * the process of doing a spa_load will require the | |
1458 * clock to be set before we could (for example) do | |
1459 * something better by looking at the timestamp on | |
1460 * an uberblock, so just set it to -1. | |
1461 */ | |
1462 clkset(-1); | |
1544 | 1463 |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1464 if ((zfs_bootfs = spa_get_bootprop("zfs-bootfs")) == NULL) { |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1465 cmn_err(CE_NOTE, "spa_get_bootfs: can not get " |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1466 "bootfs name"); |
6423 | 1467 return (EINVAL); |
5648 | 1468 } |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1469 zfs_devid = spa_get_bootprop("diskdevid"); |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1470 error = spa_import_rootpool(rootfs.bo_name, zfs_devid); |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1471 if (zfs_devid) |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1472 spa_free_bootprop(zfs_devid); |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1473 if (error) { |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1474 spa_free_bootprop(zfs_bootfs); |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1475 cmn_err(CE_NOTE, "spa_import_rootpool: error %d", |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1476 error); |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1477 return (error); |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1478 } |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1479 if (error = zfs_parse_bootfs(zfs_bootfs, rootfs.bo_name)) { |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1480 spa_free_bootprop(zfs_bootfs); |
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1481 cmn_err(CE_NOTE, "zfs_parse_bootfs: error %d", |
6423 | 1482 error); |
1483 return (error); | |
1484 } | |
3912 | 1485 |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1486 spa_free_bootprop(zfs_bootfs); |
1544 | 1487 |
1488 if (error = vfs_lock(vfsp)) | |
1489 return (error); | |
1490 | |
7046
361307ae060d
6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents:
6689
diff
changeset
|
1491 if (error = zfs_domount(vfsp, rootfs.bo_name)) { |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1492 cmn_err(CE_NOTE, "zfs_domount: error %d", error); |
1544 | 1493 goto out; |
6423 | 1494 } |
1544 | 1495 |
1496 zfsvfs = (zfsvfs_t *)vfsp->vfs_data; | |
1497 ASSERT(zfsvfs); | |
6423 | 1498 if (error = zfs_zget(zfsvfs, zfsvfs->z_root, &zp)) { |
7147
1e1d75c88283
6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents:
7046
diff
changeset
|
1499 cmn_err(CE_NOTE, "zfs_zget: error %d", error); |
1544 | 1500 goto out; |
6423 | 1501 } |
1544 | 1502 |
1503 vp = ZTOV(zp); | |
1504 mutex_enter(&vp->v_lock); | |
1505 vp->v_flag |= VROOT; | |
1506 mutex_exit(&vp->v_lock); | |
1507 rootvp = vp; | |
1508 | |
1509 /* | |
6570
bbfcb773718e
6698415 on zfs root, ace_walk oversteps its bounds, causing panic when kmem_flags is set to 0x4f
marks
parents:
6423
diff
changeset
|
1510 * Leave rootvp held. The root file system is never unmounted. |
1544 | 1511 */ |
1512 | |
1513 vfs_add((struct vnode *)0, vfsp, | |
1514 (vfsp->vfs_flag & VFS_RDONLY) ? MS_RDONLY : 0); | |
1515 out: | |
1516 vfs_unlock(vfsp); | |
6423 | 1517 return (error); |
1544 | 1518 } else if (why == ROOT_REMOUNT) { |
1519 readonly_changed_cb(vfsp->vfs_data, B_FALSE); | |
1520 vfsp->vfs_flag |= VFS_REMOUNT; | |
4596
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1521 |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1522 /* refresh mount options */ |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1523 zfs_unregister_callbacks(vfsp->vfs_data); |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1524 return (zfs_register_callbacks(vfsp)); |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1525 |
1544 | 1526 } else if (why == ROOT_UNMOUNT) { |
1527 zfs_unregister_callbacks((zfsvfs_t *)vfsp->vfs_data); | |
1528 (void) zfs_sync(vfsp, 0, 0); | |
1529 return (0); | |
1530 } | |
1531 | |
1532 /* | |
1533 * if "why" is equal to anything else other than ROOT_INIT, | |
1534 * ROOT_REMOUNT, or ROOT_UNMOUNT, we do not support it. | |
1535 */ | |
1536 return (ENOTSUP); | |
1537 } | |
1538 | |
789 | 1539 /*ARGSUSED*/ |
1540 static int | |
1541 zfs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr) | |
1542 { | |
1543 char *osname; | |
1544 pathname_t spn; | |
1545 int error = 0; | |
1546 uio_seg_t fromspace = (uap->flags & MS_SYSSPACE) ? | |
3912 | 1547 UIO_SYSSPACE : UIO_USERSPACE; |
789 | 1548 int canwrite; |
1549 | |
1550 if (mvp->v_type != VDIR) | |
1551 return (ENOTDIR); | |
1552 | |
1553 mutex_enter(&mvp->v_lock); | |
1554 if ((uap->flags & MS_REMOUNT) == 0 && | |
1555 (uap->flags & MS_OVERLAY) == 0 && | |
1556 (mvp->v_count != 1 || (mvp->v_flag & VROOT))) { | |
1557 mutex_exit(&mvp->v_lock); | |
1558 return (EBUSY); | |
1559 } | |
1560 mutex_exit(&mvp->v_lock); | |
1561 | |
1562 /* | |
1563 * ZFS does not support passing unparsed data in via MS_DATA. | |
1564 * Users should use the MS_OPTIONSTR interface; this means | |
1565 * that all option parsing is already done and the options struct | |
1566 * can be interrogated. | |
1567 */ | |
1568 if ((uap->flags & MS_DATA) && uap->datalen > 0) | |
1569 return (EINVAL); | |
1570 | |
1571 /* | |
1572 * Get the objset name (the "special" mount argument). | |
1573 */ | |
1574 if (error = pn_get(uap->spec, fromspace, &spn)) | |
1575 return (error); | |
1576 | |
1577 osname = spn.pn_path; | |
1578 | |
4543 | 1579 /* |
1580 * Check for mount privilege? | |
1581 * | |
1582 * If we don't have privilege then see if | |
1583 * we have local permission to allow it | |
1584 */ | |
1585 error = secpolicy_fs_mount(cr, mvp, vfsp); | |
1586 if (error) { | |
11824
53128e5db7cf
6863610 ZFS mount can lose correct error return
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11539
diff
changeset
|
1587 if (dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr) == 0) { |
4543 | 1588 vattr_t vattr; |
1589 | |
1590 /* | |
1591 * Make sure user is the owner of the mount point | |
1592 * or has sufficient privileges. | |
1593 */ | |
1594 | |
1595 vattr.va_mask = AT_UID; | |
1596 | |
11824
53128e5db7cf
6863610 ZFS mount can lose correct error return
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11539
diff
changeset
|
1597 if (VOP_GETATTR(mvp, &vattr, 0, cr, NULL)) { |
4543 | 1598 goto out; |
1599 } | |
1600 | |
5489
25bfaf065197
6601830 mismatch between zfs_mount() behavior and comment
marks
parents:
5446
diff
changeset
|
1601 if (secpolicy_vnode_owner(cr, vattr.va_uid) != 0 && |
25bfaf065197
6601830 mismatch between zfs_mount() behavior and comment
marks
parents:
5446
diff
changeset
|
1602 VOP_ACCESS(mvp, VWRITE, 0, cr, NULL) != 0) { |
4543 | 1603 goto out; |
1604 } | |
1605 secpolicy_fs_mount_clearopts(cr, vfsp); | |
1606 } else { | |
1607 goto out; | |
1608 } | |
1609 } | |
789 | 1610 |
1611 /* | |
1612 * Refuse to mount a filesystem if we are in a local zone and the | |
1613 * dataset is not visible. | |
1614 */ | |
1615 if (!INGLOBALZONE(curproc) && | |
1616 (!zone_dataset_visible(osname, &canwrite) || !canwrite)) { | |
1617 error = EPERM; | |
1618 goto out; | |
1619 } | |
1620 | |
10972
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1621 error = zfs_mount_label_policy(vfsp, osname); |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1622 if (error) |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1623 goto out; |
807794d41b3a
PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents:
10793
diff
changeset
|
1624 |
4596
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1625 /* |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1626 * When doing a remount, we simply refresh our temporary properties |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1627 * according to those options set in the current VFS options. |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1628 */ |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1629 if (uap->flags & MS_REMOUNT) { |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1630 /* refresh mount options */ |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1631 zfs_unregister_callbacks(vfsp->vfs_data); |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1632 error = zfs_register_callbacks(vfsp); |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1633 goto out; |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1634 } |
3aa6e3b5dfca
6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents:
4577
diff
changeset
|
1635 |
7046
361307ae060d
6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents:
6689
diff
changeset
|
1636 error = zfs_domount(vfsp, osname); |
789 | 1637 |
9214
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
1638 /* |
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
1639 * Add an extra VFS_HOLD on our parent vfs so that it can't |
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
1640 * disappear due to a forced unmount. |
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
1641 */ |
9246
67c03c93c071
6824062 System panicked in zfs_mount due to NULL pointer dereference when running btts and svvs tests
Chris Kirby <chris.kirby@sun.com>
parents:
9234
diff
changeset
|
1642 if (error == 0 && ((zfsvfs_t *)vfsp->vfs_data)->z_issnap) |
9214
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
1643 VFS_HOLD(mvp->v_vfsp); |
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
1644 |
789 | 1645 out: |
1646 pn_free(&spn); | |
1647 return (error); | |
1648 } | |
1649 | |
1650 static int | |
1651 zfs_statvfs(vfs_t *vfsp, struct statvfs64 *statp) | |
1652 { | |
1653 zfsvfs_t *zfsvfs = vfsp->vfs_data; | |
1654 dev32_t d32; | |
2885 | 1655 uint64_t refdbytes, availbytes, usedobjs, availobjs; |
789 | 1656 |
1657 ZFS_ENTER(zfsvfs); | |
1658 | |
2885 | 1659 dmu_objset_space(zfsvfs->z_os, |
1660 &refdbytes, &availbytes, &usedobjs, &availobjs); | |
789 | 1661 |
1662 /* | |
1663 * The underlying storage pool actually uses multiple block sizes. | |
1664 * We report the fragsize as the smallest block size we support, | |
1665 * and we report our blocksize as the filesystem's maximum blocksize. | |
1666 */ | |
1667 statp->f_frsize = 1UL << SPA_MINBLOCKSHIFT; | |
1668 statp->f_bsize = zfsvfs->z_max_blksz; | |
1669 | |
1670 /* | |
1671 * The following report "total" blocks of various kinds in the | |
1672 * file system, but reported in terms of f_frsize - the | |
1673 * "fragment" size. | |
1674 */ | |
1675 | |
2885 | 1676 statp->f_blocks = (refdbytes + availbytes) >> SPA_MINBLOCKSHIFT; |
1677 statp->f_bfree = availbytes >> SPA_MINBLOCKSHIFT; | |
789 | 1678 statp->f_bavail = statp->f_bfree; /* no root reservation */ |
1679 | |
1680 /* | |
1681 * statvfs() should really be called statufs(), because it assumes | |
1682 * static metadata. ZFS doesn't preallocate files, so the best | |
1683 * we can do is report the max that could possibly fit in f_files, | |
1684 * and that minus the number actually used in f_ffree. | |
1685 * For f_ffree, report the smaller of the number of object available | |
1686 * and the number of blocks (each object will take at least a block). | |
1687 */ | |
2885 | 1688 statp->f_ffree = MIN(availobjs, statp->f_bfree); |
789 | 1689 statp->f_favail = statp->f_ffree; /* no "root reservation" */ |
2885 | 1690 statp->f_files = statp->f_ffree + usedobjs; |
789 | 1691 |
1692 (void) cmpldev(&d32, vfsp->vfs_dev); | |
1693 statp->f_fsid = d32; | |
1694 | |
1695 /* | |
1696 * We're a zfs filesystem. | |
1697 */ | |
1698 (void) strcpy(statp->f_basetype, vfssw[vfsp->vfs_fstype].vsw_name); | |
1699 | |
1123
02a0390fbc7d
6363529 UNIX03/UNIX98 *vsx* CAPI.os/files/fstatvfs/T.fstatvfs 11 FAILS
marks
parents:
849
diff
changeset
|
1700 statp->f_flag = vf_to_stf(vfsp->vfs_flag); |
789 | 1701 |
1702 statp->f_namemax = ZFS_MAXNAMELEN; | |
1703 | |
1704 /* | |
1705 * We have all of 32 characters to stuff a string here. | |
1706 * Is there anything useful we could/should provide? | |
1707 */ | |
1708 bzero(statp->f_fstr, sizeof (statp->f_fstr)); | |
1709 | |
1710 ZFS_EXIT(zfsvfs); | |
1711 return (0); | |
1712 } | |
1713 | |
1714 static int | |
1715 zfs_root(vfs_t *vfsp, vnode_t **vpp) | |
1716 { | |
1717 zfsvfs_t *zfsvfs = vfsp->vfs_data; | |
1718 znode_t *rootzp; | |
1719 int error; | |
1720 | |
1721 ZFS_ENTER(zfsvfs); | |
1722 | |
1723 error = zfs_zget(zfsvfs, zfsvfs->z_root, &rootzp); | |
1724 if (error == 0) | |
1725 *vpp = ZTOV(rootzp); | |
1726 | |
1727 ZFS_EXIT(zfsvfs); | |
1728 return (error); | |
1729 } | |
1730 | |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1731 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1732 * Teardown the zfsvfs::z_os. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1733 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1734 * Note, if 'unmounting' if FALSE, we return with the 'z_teardown_lock' |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1735 * and 'z_teardown_inactive_lock' held. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1736 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1737 static int |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1738 zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1739 { |
5642
504c84876fda
6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents:
5498
diff
changeset
|
1740 znode_t *zp; |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1741 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1742 rrw_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1743 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1744 if (!unmounting) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1745 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1746 * We purge the parent filesystem's vfsp as the parent |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1747 * filesystem and all of its snapshots have their vnode's |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1748 * v_vfsp set to the parent's filesystem's vfsp. Note, |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1749 * 'z_parent' is self referential for non-snapshots. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1750 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1751 (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1752 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1753 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1754 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1755 * Close the zil. NB: Can't close the zil while zfs_inactive |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1756 * threads are blocked as zil_close can call zfs_inactive. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1757 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1758 if (zfsvfs->z_log) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1759 zil_close(zfsvfs->z_log); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1760 zfsvfs->z_log = NULL; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1761 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1762 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1763 rw_enter(&zfsvfs->z_teardown_inactive_lock, RW_WRITER); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1764 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1765 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1766 * If we are not unmounting (ie: online recv) and someone already |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1767 * unmounted this file system while we were doing the switcheroo, |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1768 * or a reopen of z_os failed then just bail out now. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1769 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1770 if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1771 rw_exit(&zfsvfs->z_teardown_inactive_lock); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1772 rrw_exit(&zfsvfs->z_teardown_lock, FTAG); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1773 return (EIO); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1774 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1775 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1776 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1777 * At this point there are no vops active, and any new vops will |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1778 * fail with EIO since we have z_teardown_lock for writer (only |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1779 * relavent for forced unmount). |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1780 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1781 * Release all holds on dbufs. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1782 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1783 mutex_enter(&zfsvfs->z_znodes_lock); |
5642
504c84876fda
6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents:
5498
diff
changeset
|
1784 for (zp = list_head(&zfsvfs->z_all_znodes); zp != NULL; |
504c84876fda
6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents:
5498
diff
changeset
|
1785 zp = list_next(&zfsvfs->z_all_znodes, zp)) |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
1786 if (zp->z_sa_hdl) { |
5642
504c84876fda
6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents:
5498
diff
changeset
|
1787 ASSERT(ZTOV(zp)->v_count > 0); |
504c84876fda
6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents:
5498
diff
changeset
|
1788 zfs_znode_dmu_fini(zp); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1789 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1790 mutex_exit(&zfsvfs->z_znodes_lock); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1791 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1792 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1793 * If we are unmounting, set the unmounted flag and let new vops |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1794 * unblock. zfs_inactive will have the unmounted behavior, and all |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1795 * other vops will fail with EIO. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1796 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1797 if (unmounting) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1798 zfsvfs->z_unmounted = B_TRUE; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1799 rrw_exit(&zfsvfs->z_teardown_lock, FTAG); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1800 rw_exit(&zfsvfs->z_teardown_inactive_lock); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1801 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1802 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1803 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1804 * z_os will be NULL if there was an error in attempting to reopen |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1805 * zfsvfs, so just return as the properties had already been |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1806 * unregistered and cached data had been evicted before. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1807 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1808 if (zfsvfs->z_os == NULL) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1809 return (0); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1810 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1811 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1812 * Unregister properties. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1813 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1814 zfs_unregister_callbacks(zfsvfs); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1815 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1816 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1817 * Evict cached data |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1818 */ |
12722
0cc41f673f9d
6937998 txg_wait_synced() is called when unmounting zfs snapshots
Sanjeev Bagewadi <Sanjeev.Bagewadi@Sun.COM>
parents:
12699
diff
changeset
|
1819 if (dmu_objset_is_dirty_anywhere(zfsvfs->z_os)) |
13061
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1820 if (!(zfsvfs->z_vfs->vfs_flag & VFS_RDONLY)) |
bda0decf867b
PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents:
12722
diff
changeset
|
1821 txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0); |
12722
0cc41f673f9d
6937998 txg_wait_synced() is called when unmounting zfs snapshots
Sanjeev Bagewadi <Sanjeev.Bagewadi@Sun.COM>
parents:
12699
diff
changeset
|
1822 (void) dmu_objset_evict_dbufs(zfsvfs->z_os); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1823 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1824 return (0); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1825 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1826 |
789 | 1827 /*ARGSUSED*/ |
1828 static int | |
1829 zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr) | |
1830 { | |
1831 zfsvfs_t *zfsvfs = vfsp->vfs_data; | |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1832 objset_t *os; |
789 | 1833 int ret; |
1834 | |
4543 | 1835 ret = secpolicy_fs_unmount(cr, vfsp); |
1836 if (ret) { | |
11824
53128e5db7cf
6863610 ZFS mount can lose correct error return
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11539
diff
changeset
|
1837 if (dsl_deleg_access((char *)refstr_value(vfsp->vfs_resource), |
53128e5db7cf
6863610 ZFS mount can lose correct error return
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11539
diff
changeset
|
1838 ZFS_DELEG_PERM_MOUNT, cr)) |
4543 | 1839 return (ret); |
1840 } | |
1484
d330e98f8ed7
6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents:
1298
diff
changeset
|
1841 |
4736
f8714efb3e12
6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents:
4614
diff
changeset
|
1842 /* |
f8714efb3e12
6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents:
4614
diff
changeset
|
1843 * We purge the parent filesystem's vfsp as the parent filesystem |
f8714efb3e12
6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents:
4614
diff
changeset
|
1844 * and all of its snapshots have their vnode's v_vfsp set to the |
f8714efb3e12
6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents:
4614
diff
changeset
|
1845 * parent's filesystem's vfsp. Note, 'z_parent' is self |
f8714efb3e12
6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents:
4614
diff
changeset
|
1846 * referential for non-snapshots. |
f8714efb3e12
6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents:
4614
diff
changeset
|
1847 */ |
f8714efb3e12
6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents:
4614
diff
changeset
|
1848 (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0); |
1484
d330e98f8ed7
6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents:
1298
diff
changeset
|
1849 |
789 | 1850 /* |
1851 * Unmount any snapshots mounted under .zfs before unmounting the | |
1852 * dataset itself. | |
1853 */ | |
1854 if (zfsvfs->z_ctldir != NULL && | |
4543 | 1855 (ret = zfsctl_umount_snapshots(vfsp, fflag, cr)) != 0) { |
789 | 1856 return (ret); |
4543 | 1857 } |
789 | 1858 |
4787 | 1859 if (!(fflag & MS_FORCE)) { |
4480
0976678e58c5
6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents:
3912
diff
changeset
|
1860 /* |
4787 | 1861 * Check the number of active vnodes in the file system. |
1862 * Our count is maintained in the vfs structure, but the | |
1863 * number is off by 1 to indicate a hold on the vfs | |
1864 * structure itself. | |
1865 * | |
1866 * The '.zfs' directory maintains a reference of its | |
1867 * own, and any active references underneath are | |
1868 * reflected in the vnode count. | |
789 | 1869 */ |
4787 | 1870 if (zfsvfs->z_ctldir == NULL) { |
1871 if (vfsp->vfs_count > 1) | |
1872 return (EBUSY); | |
1873 } else { | |
1874 if (vfsp->vfs_count > 2 || | |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1875 zfsvfs->z_ctldir->v_count > 1) |
4787 | 1876 return (EBUSY); |
789 | 1877 } |
1878 } | |
1879 | |
1880 vfsp->vfs_flag |= VFS_UNMOUNTED; | |
4787 | 1881 |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1882 VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1883 os = zfsvfs->z_os; |
4787 | 1884 |
1885 /* | |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1886 * z_os will be NULL if there was an error in |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1887 * attempting to reopen zfsvfs. |
4787 | 1888 */ |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1889 if (os != NULL) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1890 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1891 * Unset the objset user_ptr. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1892 */ |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1893 mutex_enter(&os->os_user_ptr_lock); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1894 dmu_objset_set_user(os, NULL); |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1895 mutex_exit(&os->os_user_ptr_lock); |
4787 | 1896 |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1897 /* |
6689
47572a2f5e73
6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents:
6570
diff
changeset
|
1898 * Finally release the objset |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1899 */ |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
1900 dmu_objset_disown(os, zfsvfs); |
4787 | 1901 } |
1902 | |
1903 /* | |
1904 * We can now safely destroy the '.zfs' directory node. | |
1905 */ | |
1906 if (zfsvfs->z_ctldir != NULL) | |
1907 zfsctl_destroy(zfsvfs); | |
789 | 1908 |
1909 return (0); | |
1910 } | |
1911 | |
1912 static int | |
1913 zfs_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp) | |
1914 { | |
1915 zfsvfs_t *zfsvfs = vfsp->vfs_data; | |
1916 znode_t *zp; | |
1917 uint64_t object = 0; | |
1918 uint64_t fid_gen = 0; | |
1919 uint64_t gen_mask; | |
1920 uint64_t zp_gen; | |
1921 int i, err; | |
1922 | |
1923 *vpp = NULL; | |
1924 | |
1925 ZFS_ENTER(zfsvfs); | |
1926 | |
1927 if (fidp->fid_len == LONG_FID_LEN) { | |
1928 zfid_long_t *zlfid = (zfid_long_t *)fidp; | |
1929 uint64_t objsetid = 0; | |
1930 uint64_t setgen = 0; | |
1931 | |
1932 for (i = 0; i < sizeof (zlfid->zf_setid); i++) | |
1933 objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i); | |
1934 | |
1935 for (i = 0; i < sizeof (zlfid->zf_setgen); i++) | |
1936 setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i); | |
1937 | |
1938 ZFS_EXIT(zfsvfs); | |
1939 | |
1940 err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs); | |
1941 if (err) | |
1942 return (EINVAL); | |
1943 ZFS_ENTER(zfsvfs); | |
1944 } | |
1945 | |
1946 if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) { | |
1947 zfid_short_t *zfid = (zfid_short_t *)fidp; | |
1948 | |
1949 for (i = 0; i < sizeof (zfid->zf_object); i++) | |
1950 object |= ((uint64_t)zfid->zf_object[i]) << (8 * i); | |
1951 | |
1952 for (i = 0; i < sizeof (zfid->zf_gen); i++) | |
1953 fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i); | |
1954 } else { | |
1955 ZFS_EXIT(zfsvfs); | |
1956 return (EINVAL); | |
1957 } | |
1958 | |
1959 /* A zero fid_gen means we are in the .zfs control directories */ | |
1960 if (fid_gen == 0 && | |
1961 (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) { | |
1962 *vpp = zfsvfs->z_ctldir; | |
1963 ASSERT(*vpp != NULL); | |
1964 if (object == ZFSCTL_INO_SNAPDIR) { | |
1965 VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL, | |
5331 | 1966 0, NULL, NULL, NULL, NULL, NULL) == 0); |
789 | 1967 } else { |
1968 VN_HOLD(*vpp); | |
1969 } | |
1970 ZFS_EXIT(zfsvfs); | |
1971 return (0); | |
1972 } | |
1973 | |
1974 gen_mask = -1ULL >> (64 - 8 * i); | |
1975 | |
1976 dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask); | |
1977 if (err = zfs_zget(zfsvfs, object, &zp)) { | |
1978 ZFS_EXIT(zfsvfs); | |
1979 return (err); | |
1980 } | |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
1981 (void) sa_lookup(zp->z_sa_hdl, SA_ZPL_GEN(zfsvfs), &zp_gen, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
1982 sizeof (uint64_t)); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
1983 zp_gen = zp_gen & gen_mask; |
789 | 1984 if (zp_gen == 0) |
1985 zp_gen = 1; | |
3461 | 1986 if (zp->z_unlinked || zp_gen != fid_gen) { |
789 | 1987 dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen); |
1988 VN_RELE(ZTOV(zp)); | |
1989 ZFS_EXIT(zfsvfs); | |
1990 return (EINVAL); | |
1991 } | |
1992 | |
1993 *vpp = ZTOV(zp); | |
1994 ZFS_EXIT(zfsvfs); | |
1995 return (0); | |
1996 } | |
1997 | |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1998 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
1999 * Block out VOPs and close zfsvfs_t::z_os |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2000 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2001 * Note, if successful, then we return with the 'z_teardown_lock' and |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2002 * 'z_teardown_inactive_lock' write held. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2003 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2004 int |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
2005 zfs_suspend_fs(zfsvfs_t *zfsvfs) |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2006 { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2007 int error; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2008 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2009 if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2010 return (error); |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
2011 dmu_objset_disown(zfsvfs->z_os, zfsvfs); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2012 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2013 return (0); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2014 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2015 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2016 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2017 * Reopen zfsvfs_t::z_os and release VOPs. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2018 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2019 int |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
2020 zfs_resume_fs(zfsvfs_t *zfsvfs, const char *osname) |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2021 { |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2022 int err, err2; |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2023 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2024 ASSERT(RRW_WRITE_HELD(&zfsvfs->z_teardown_lock)); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2025 ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock)); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2026 |
10298
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
2027 err = dmu_objset_own(osname, DMU_OST_ZFS, B_FALSE, zfsvfs, |
a0d52501437c
6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
10204
diff
changeset
|
2028 &zfsvfs->z_os); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2029 if (err) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2030 zfsvfs->z_os = NULL; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2031 } else { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2032 znode_t *zp; |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2033 uint64_t sa_obj = 0; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2034 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2035 err2 = zap_lookup(zfsvfs->z_os, MASTER_NODE_OBJ, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2036 ZFS_SA_ATTRS, 8, 1, &sa_obj); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2037 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2038 if ((err || err2) && zfsvfs->z_version >= ZPL_VERSION_SA) |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2039 goto bail; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2040 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2041 |
12493
89ce40422cea
6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents:
12296
diff
changeset
|
2042 if ((err = sa_setup(zfsvfs->z_os, sa_obj, |
89ce40422cea
6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents:
12296
diff
changeset
|
2043 zfs_attr_table, ZPL_END, &zfsvfs->z_attr_table)) != 0) |
89ce40422cea
6952177 SA handling of on-disk corruption can be improved
Mark Shellenbaum <Mark.Shellenbaum@Oracle.COM>
parents:
12296
diff
changeset
|
2044 goto bail; |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2045 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2046 VERIFY(zfsvfs_setup(zfsvfs, B_FALSE) == 0); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2047 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2048 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2049 * Attempt to re-establish all the active znodes with |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2050 * their dbufs. If a zfs_rezget() fails, then we'll let |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2051 * any potential callers discover that via ZFS_ENTER_VERIFY_VP |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2052 * when they try to use their znode. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2053 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2054 mutex_enter(&zfsvfs->z_znodes_lock); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2055 for (zp = list_head(&zfsvfs->z_all_znodes); zp; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2056 zp = list_next(&zfsvfs->z_all_znodes, zp)) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2057 (void) zfs_rezget(zp); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2058 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2059 mutex_exit(&zfsvfs->z_znodes_lock); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2060 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2061 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2062 |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2063 bail: |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2064 /* release the VOPs */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2065 rw_exit(&zfsvfs->z_teardown_inactive_lock); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2066 rrw_exit(&zfsvfs->z_teardown_lock, FTAG); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2067 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2068 if (err) { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2069 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2070 * Since we couldn't reopen zfsvfs::z_os, force |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2071 * unmount this file system. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2072 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2073 if (vn_vfswlock(zfsvfs->z_vfs->vfs_vnodecovered) == 0) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2074 (void) dounmount(zfsvfs->z_vfs, MS_FORCE, CRED()); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2075 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2076 return (err); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2077 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
5147
diff
changeset
|
2078 |
789 | 2079 static void |
2080 zfs_freevfs(vfs_t *vfsp) | |
2081 { | |
2082 zfsvfs_t *zfsvfs = vfsp->vfs_data; | |
9214
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
2083 |
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
2084 /* |
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
2085 * If this is a snapshot, we have an extra VFS_HOLD on our parent |
12095
6596d5361407
6891449 zvol_strategy() check for zv == NULL too late
Chris Kirby <Chris.Kirby@sun.com>
parents:
12070
diff
changeset
|
2086 * from zfs_mount(). Release it here. If we came through |
6596d5361407
6891449 zvol_strategy() check for zv == NULL too late
Chris Kirby <Chris.Kirby@sun.com>
parents:
12070
diff
changeset
|
2087 * zfs_mountroot() instead, we didn't grab an extra hold, so |
6596d5361407
6891449 zvol_strategy() check for zv == NULL too late
Chris Kirby <Chris.Kirby@sun.com>
parents:
12070
diff
changeset
|
2088 * skip the VFS_RELE for rootvfs. |
9214
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
2089 */ |
12095
6596d5361407
6891449 zvol_strategy() check for zv == NULL too late
Chris Kirby <Chris.Kirby@sun.com>
parents:
12070
diff
changeset
|
2090 if (zfsvfs->z_issnap && (vfsp != rootvfs)) |
9214
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
2091 VFS_RELE(zfsvfs->z_parent->z_vfs); |
8d350e5d04aa
6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents:
9179
diff
changeset
|
2092 |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2093 zfsvfs_free(zfsvfs); |
789 | 2094 |
2095 atomic_add_32(&zfs_active_fs_count, -1); | |
2096 } | |
2097 | |
2098 /* | |
2099 * VFS_INIT() initialization. Note that there is no VFS_FINI(), | |
2100 * so we can't safely do any non-idempotent initialization here. | |
2101 * Leave that to zfs_init() and zfs_fini(), which are called | |
2102 * from the module's _init() and _fini() entry points. | |
2103 */ | |
2104 /*ARGSUSED*/ | |
2105 static int | |
2106 zfs_vfsinit(int fstype, char *name) | |
2107 { | |
2108 int error; | |
2109 | |
2110 zfsfstype = fstype; | |
2111 | |
2112 /* | |
2113 * Setup vfsops and vnodeops tables. | |
2114 */ | |
2115 error = vfs_setfsops(fstype, zfs_vfsops_template, &zfs_vfsops); | |
2116 if (error != 0) { | |
2117 cmn_err(CE_WARN, "zfs: bad vfs ops template"); | |
2118 } | |
2119 | |
2120 error = zfs_create_op_tables(); | |
2121 if (error) { | |
2122 zfs_remove_op_tables(); | |
2123 cmn_err(CE_WARN, "zfs: bad vnode ops template"); | |
2124 (void) vfs_freevfsops_by_type(zfsfstype); | |
2125 return (error); | |
2126 } | |
2127 | |
2128 mutex_init(&zfs_dev_mtx, NULL, MUTEX_DEFAULT, NULL); | |
2129 | |
2130 /* | |
849
8d799fd81a9b
6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents:
789
diff
changeset
|
2131 * Unique major number for all zfs mounts. |
8d799fd81a9b
6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents:
789
diff
changeset
|
2132 * If we run out of 32-bit minors, we'll getudev() another major. |
789 | 2133 */ |
849
8d799fd81a9b
6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents:
789
diff
changeset
|
2134 zfs_major = ddi_name_to_major(ZFS_DRIVER); |
8d799fd81a9b
6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents:
789
diff
changeset
|
2135 zfs_minor = ZFS_MIN_MINOR; |
789 | 2136 |
2137 return (0); | |
2138 } | |
2139 | |
2140 void | |
2141 zfs_init(void) | |
2142 { | |
2143 /* | |
2144 * Initialize .zfs directory structures | |
2145 */ | |
2146 zfsctl_init(); | |
2147 | |
2148 /* | |
2149 * Initialize znode cache, vnode ops, etc... | |
2150 */ | |
2151 zfs_znode_init(); | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2152 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2153 dmu_objset_register_type(DMU_OST_ZFS, zfs_space_delta_cb); |
789 | 2154 } |
2155 | |
2156 void | |
2157 zfs_fini(void) | |
2158 { | |
2159 zfsctl_fini(); | |
2160 zfs_znode_fini(); | |
2161 } | |
2162 | |
2163 int | |
2164 zfs_busy(void) | |
2165 { | |
2166 return (zfs_active_fs_count != 0); | |
2167 } | |
2168 | |
4577 | 2169 int |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2170 zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers) |
4577 | 2171 { |
2172 int error; | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2173 objset_t *os = zfsvfs->z_os; |
4577 | 2174 dmu_tx_t *tx; |
2175 | |
2176 if (newvers < ZPL_VERSION_INITIAL || newvers > ZPL_VERSION) | |
2177 return (EINVAL); | |
2178 | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2179 if (newvers < zfsvfs->z_version) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2180 return (EINVAL); |
4577 | 2181 |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2182 if (zfs_spa_version_map(newvers) > |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2183 spa_version(dmu_objset_spa(zfsvfs->z_os))) |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2184 return (ENOTSUP); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2185 |
4577 | 2186 tx = dmu_tx_create(os); |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2187 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_FALSE, ZPL_VERSION_STR); |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2188 if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2189 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2190 ZFS_SA_ATTRS); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2191 dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2192 } |
4577 | 2193 error = dmu_tx_assign(tx, TXG_WAIT); |
2194 if (error) { | |
2195 dmu_tx_abort(tx); | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2196 return (error); |
4577 | 2197 } |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2198 |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2199 error = zap_update(os, MASTER_NODE_OBJ, ZPL_VERSION_STR, |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2200 8, 1, &newvers, tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2201 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2202 if (error) { |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2203 dmu_tx_commit(tx); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2204 return (error); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2205 } |
4577 | 2206 |
11935
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2207 if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) { |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2208 uint64_t sa_obj; |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2209 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2210 ASSERT3U(spa_version(dmu_objset_spa(zfsvfs->z_os)), >=, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2211 SPA_VERSION_SA); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2212 sa_obj = zap_create(os, DMU_OT_SA_MASTER_NODE, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2213 DMU_OT_NONE, 0, tx); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2214 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2215 error = zap_add(os, MASTER_NODE_OBJ, |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2216 ZFS_SA_ATTRS, 8, 1, &sa_obj, tx); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2217 ASSERT3U(error, ==, 0); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2218 |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2219 VERIFY(0 == sa_set_sa_object(os, sa_obj)); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2220 sa_register_update_callback(os, zfs_sa_upgrade); |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2221 } |
538c866aaac6
6716117 ZFS needs native system attribute infrastructure
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents:
11824
diff
changeset
|
2222 |
12296
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12294
diff
changeset
|
2223 spa_history_log_internal(LOG_DS_UPGRADE, |
7cf402a7f374
6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents:
12294
diff
changeset
|
2224 dmu_objset_spa(os), tx, "oldver=%llu newver=%llu dataset = %llu", |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2225 zfsvfs->z_version, newvers, dmu_objset_id(os)); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2226 |
4577 | 2227 dmu_tx_commit(tx); |
2228 | |
9396
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2229 zfsvfs->z_version = newvers; |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2230 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2231 if (zfsvfs->z_version >= ZPL_VERSION_FUID) |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2232 zfs_set_fuid_feature(zfsvfs); |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2233 |
f41cf682d0d3
PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents:
9292
diff
changeset
|
2234 return (0); |
4577 | 2235 } |
2236 | |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2237 /* |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2238 * Read a property stored within the master node. |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2239 */ |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2240 int |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2241 zfs_get_zplprop(objset_t *os, zfs_prop_t prop, uint64_t *value) |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2242 { |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2243 const char *pname; |
7184
9508660f9c27
PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents:
7147
diff
changeset
|
2244 int error = ENOENT; |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2245 |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2246 /* |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2247 * Look up the file system's value for the property. For the |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2248 * version property, we look up a slightly different string. |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2249 */ |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2250 if (prop == ZFS_PROP_VERSION) |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2251 pname = ZPL_VERSION_STR; |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2252 else |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2253 pname = zfs_prop_to_name(prop); |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2254 |
7184
9508660f9c27
PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents:
7147
diff
changeset
|
2255 if (os != NULL) |
9508660f9c27
PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents:
7147
diff
changeset
|
2256 error = zap_lookup(os, MASTER_NODE_OBJ, pname, 8, 1, value); |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2257 |
6404 | 2258 if (error == ENOENT) { |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2259 /* No value set, use the default value */ |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2260 switch (prop) { |
6404 | 2261 case ZFS_PROP_VERSION: |
2262 *value = ZPL_VERSION; | |
2263 break; | |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2264 case ZFS_PROP_NORMALIZE: |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2265 case ZFS_PROP_UTF8ONLY: |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2266 *value = 0; |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2267 break; |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2268 case ZFS_PROP_CASE: |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2269 *value = ZFS_CASE_SENSITIVE; |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2270 break; |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2271 default: |
6404 | 2272 return (error); |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2273 } |
6404 | 2274 error = 0; |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2275 } |
6404 | 2276 return (error); |
5498
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2277 } |
334b476844ca
6622831 normalization properties are not preserved by "zfs send"
timh
parents:
5489
diff
changeset
|
2278 |
789 | 2279 static vfsdef_t vfw = { |
2280 VFSDEF_VERSION, | |
2281 MNTTYPE_ZFS, | |
2282 zfs_vfsinit, | |
5331 | 2283 VSW_HASPROTO|VSW_CANRWRO|VSW_CANREMOUNT|VSW_VOLATILEDEV|VSW_STATS| |
12633
9f2cda0ed938
PSARC 2010/144 lofi(7D) in non global zones
John Levon <john.levon@sun.com>
parents:
12530
diff
changeset
|
2284 VSW_XID|VSW_ZMOUNT, |
789 | 2285 &zfs_mntopts |
2286 }; | |
2287 | |
2288 struct modlfs zfs_modlfs = { | |
4577 | 2289 &mod_fsops, "ZFS filesystem version " SPA_VERSION_STRING, &vfw |
789 | 2290 }; |