annotate usr/src/uts/common/fs/zfs/zfs_vfsops.c @ 13980:d7059eb1884c

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