annotate usr/src/uts/common/fs/zfs/zfs_vfsops.c @ 4480:0976678e58c5

6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555 6565044 small race condition between zfs_umount() and ZFS_ENTER()
author gw25295
date Fri, 15 Jun 2007 15:04:37 -0700
parents f6891a60bd72
children 12bb2876a62e
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 /*
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
23 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
24 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
25
3246
7a46b8f56ee0 6351954 zfs missing noxattr mount flag (fix keywords)
ck153898
parents: 3234
diff changeset
26 #pragma ident "%Z%%M% %I% %E% SMI"
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
28 #include <sys/types.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
29 #include <sys/param.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
30 #include <sys/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/acl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
35 #include <sys/vnode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
36 #include <sys/vfs.h>
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
37 #include <sys/vfs_opreg.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
38 #include <sys/mntent.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
39 #include <sys/mount.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
40 #include <sys/cmn_err.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
41 #include "fs/fs_subr.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
42 #include <sys/zfs_znode.h>
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
43 #include <sys/zfs_dir.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
44 #include <sys/zil.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
45 #include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
46 #include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
47 #include <sys/dsl_prop.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
48 #include <sys/dsl_dataset.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>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
51 #include <sys/varargs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
52 #include <sys/policy.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
53 #include <sys/atomic.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
54 #include <sys/mkdev.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
55 #include <sys/modctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
56 #include <sys/zfs_ioctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
57 #include <sys/zfs_ctldir.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
58 #include <sys/bootconf.h>
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
59 #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
60 #include <sys/dnlc.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
61
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
62 int zfsfstype;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
63 vfsops_t *zfs_vfsops = NULL;
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
64 static major_t zfs_major;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
65 static minor_t zfs_minor;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
66 static kmutex_t zfs_dev_mtx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
67
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
68 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
69 static int zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
70 static int zfs_mountroot(vfs_t *vfsp, enum whymountroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
71 static int zfs_root(vfs_t *vfsp, vnode_t **vpp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
72 static int zfs_statvfs(vfs_t *vfsp, struct statvfs64 *statp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
73 static int zfs_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
74 static void zfs_freevfs(vfs_t *vfsp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
75 static void zfs_objset_close(zfsvfs_t *zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
76
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
77 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
78 VFSNAME_MOUNT, { .vfs_mount = zfs_mount },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
79 VFSNAME_MOUNTROOT, { .vfs_mountroot = zfs_mountroot },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
80 VFSNAME_UNMOUNT, { .vfs_unmount = zfs_umount },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
81 VFSNAME_ROOT, { .vfs_root = zfs_root },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
82 VFSNAME_STATVFS, { .vfs_statvfs = zfs_statvfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
83 VFSNAME_SYNC, { .vfs_sync = zfs_sync },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
84 VFSNAME_VGET, { .vfs_vget = zfs_vget },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
85 VFSNAME_FREEVFS, { .vfs_freevfs = zfs_freevfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
86 NULL, NULL
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
87 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
88
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
89 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
90 VFSNAME_FREEVFS, { .vfs_freevfs = zfs_freevfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
91 NULL, NULL
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
92 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
93
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
94 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
95 * We need to keep a count of active fs's.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
96 * This is necessary to prevent our module
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
97 * from being unloaded after a umount -f
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
98 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
99 static uint32_t zfs_active_fs_count = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
100
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
101 static char *noatime_cancel[] = { MNTOPT_ATIME, NULL };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
102 static char *atime_cancel[] = { MNTOPT_NOATIME, NULL };
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
103 static char *noxattr_cancel[] = { MNTOPT_XATTR, NULL };
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
104 static char *xattr_cancel[] = { MNTOPT_NOXATTR, NULL };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
105
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
106 /*
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
107 * MNTOPT_DEFAULT was removed from MNTOPT_XATTR, since the
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
108 * default value is now determined by the xattr property.
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
109 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
110 static mntopt_t mntopts[] = {
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
111 { MNTOPT_NOXATTR, noxattr_cancel, NULL, 0, NULL },
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
112 { MNTOPT_XATTR, xattr_cancel, NULL, 0, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
113 { MNTOPT_NOATIME, noatime_cancel, NULL, MO_DEFAULT, NULL },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
114 { MNTOPT_ATIME, atime_cancel, NULL, 0, NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
115 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
116
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
117 static mntopts_t zfs_mntopts = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
118 sizeof (mntopts) / sizeof (mntopt_t),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
119 mntopts
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
120 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
121
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
122 /*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
123 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
124 zfs_sync(vfs_t *vfsp, short flag, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
125 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
126 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
127 * Data integrity is job one. We don't want a compromised kernel
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
128 * writing to the storage pool, so we never sync during panic.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
129 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
130 if (panicstr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
131 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
132
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
133 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
134 * SYNC_ATTR is used by fsflush() to force old filesystems like UFS
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
135 * to sync metadata, which they would otherwise cache indefinitely.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
136 * Semantically, the only requirement is that the sync be initiated.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
137 * The DMU syncs out txgs frequently, so there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
138 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
139 if (flag & SYNC_ATTR)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
140 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
141
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
142 if (vfsp != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
143 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
144 * Sync a specific filesystem.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
145 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
146 zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
147
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
148 ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
149 if (zfsvfs->z_log != NULL)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2474
diff changeset
150 zil_commit(zfsvfs->z_log, UINT64_MAX, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
151 else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
152 txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
153 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
154 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
155 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
156 * Sync all ZFS filesystems. This is what happens when you
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
157 * run sync(1M). Unlike other filesystems, ZFS honors the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
158 * request by waiting for all pools to commit all dirty data.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
159 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
160 spa_sync_allpools();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
161 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
162
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
163 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
164 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
165
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
166 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
167 zfs_create_unique_device(dev_t *dev)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
168 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
169 major_t new_major;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
170
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
171 do {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
172 ASSERT3U(zfs_minor, <=, MAXMIN32);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
173 minor_t start = zfs_minor;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
174 do {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
175 mutex_enter(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
176 if (zfs_minor >= MAXMIN32) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
177 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
178 * If we're still using the real major
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
179 * keep out of /dev/zfs and /dev/zvol minor
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
180 * number space. If we're using a getudev()'ed
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
181 * major number, we can use all of its minors.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
182 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
183 if (zfs_major == ddi_name_to_major(ZFS_DRIVER))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
184 zfs_minor = ZFS_MIN_MINOR;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
185 else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
186 zfs_minor = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
187 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
188 zfs_minor++;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
189 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
190 *dev = makedevice(zfs_major, zfs_minor);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
191 mutex_exit(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
192 } while (vfs_devismounted(*dev) && zfs_minor != start);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
193 if (zfs_minor == start) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
194 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
195 * We are using all ~262,000 minor numbers for the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
196 * current major number. Create a new major number.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
197 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
198 if ((new_major = getudev()) == (major_t)-1) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
199 cmn_err(CE_WARN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
200 "zfs_mount: Can't get unique major "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
201 "device number.");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
202 return (-1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
203 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
204 mutex_enter(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
205 zfs_major = new_major;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
206 zfs_minor = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
207
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
208 mutex_exit(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
209 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
210 break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
211 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
212 /* CONSTANTCONDITION */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
213 } while (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
214
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
215 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
216 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
217
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
218 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
219 atime_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
220 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
221 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
222
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
223 if (newval == TRUE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
224 zfsvfs->z_atime = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
225 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
226 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_ATIME, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
227 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
228 zfsvfs->z_atime = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
229 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_ATIME);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
230 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
231 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
232 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
233
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
234 static void
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
235 xattr_changed_cb(void *arg, uint64_t newval)
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
236 {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
237 zfsvfs_t *zfsvfs = arg;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
238
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
239 if (newval == TRUE) {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
240 /* XXX locking on vfs_flag? */
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
241 zfsvfs->z_vfs->vfs_flag |= VFS_XATTR;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
242 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
243 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_XATTR, NULL, 0);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
244 } else {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
245 /* XXX locking on vfs_flag? */
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
246 zfsvfs->z_vfs->vfs_flag &= ~VFS_XATTR;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
247 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_XATTR);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
248 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR, NULL, 0);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
249 }
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
250 }
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
251
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
252 static void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
253 blksz_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
254 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
255 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
256
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
257 if (newval < SPA_MINBLOCKSIZE ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
258 newval > SPA_MAXBLOCKSIZE || !ISP2(newval))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
259 newval = SPA_MAXBLOCKSIZE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
260
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
261 zfsvfs->z_max_blksz = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
262 zfsvfs->z_vfs->vfs_bsize = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
263 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
264
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
265 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
266 readonly_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
267 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
268 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
269
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
270 if (newval) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
271 /* XXX locking on vfs_flag? */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
272 zfsvfs->z_vfs->vfs_flag |= VFS_RDONLY;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
273 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RW);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
274 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RO, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
275 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
276 /* XXX locking on vfs_flag? */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
277 zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
278 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RO);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
279 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RW, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
280 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
281 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
282
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
283 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
284 devices_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
285 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
286 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
287
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
288 if (newval == FALSE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
289 zfsvfs->z_vfs->vfs_flag |= VFS_NODEVICES;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
290 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_DEVICES);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
291 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NODEVICES, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
292 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
293 zfsvfs->z_vfs->vfs_flag &= ~VFS_NODEVICES;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
294 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NODEVICES);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
295 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_DEVICES, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
296 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
297 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
298
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
299 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
300 setuid_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
301 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
302 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
303
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
304 if (newval == FALSE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
305 zfsvfs->z_vfs->vfs_flag |= VFS_NOSETUID;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
306 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_SETUID);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
307 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
308 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
309 zfsvfs->z_vfs->vfs_flag &= ~VFS_NOSETUID;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
310 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
311 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_SETUID, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
312 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
313 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
314
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
315 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
316 exec_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
317 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
318 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
320 if (newval == FALSE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
321 zfsvfs->z_vfs->vfs_flag |= VFS_NOEXEC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
322 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_EXEC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
323 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
324 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
325 zfsvfs->z_vfs->vfs_flag &= ~VFS_NOEXEC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
326 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
327 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_EXEC, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
328 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
329 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
330
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
331 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
332 snapdir_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
333 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
334 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
335
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
336 zfsvfs->z_show_ctldir = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
337 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
338
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
339 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
340 acl_mode_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
341 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
342 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
343
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
344 zfsvfs->z_acl_mode = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
345 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
346
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
347 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
348 acl_inherit_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
349 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
350 zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
351
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
352 zfsvfs->z_acl_inherit = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
353 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
354
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
355 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
356 zfs_refresh_properties(vfs_t *vfsp)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
357 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
358 zfsvfs_t *zfsvfs = vfsp->vfs_data;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
359
2354
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
360 /*
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
361 * Remount operations default to "rw" unless "ro" is explicitly
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
362 * specified.
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
363 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
364 if (vfs_optionisset(vfsp, MNTOPT_RO, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
365 readonly_changed_cb(zfsvfs, B_TRUE);
2354
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
366 } else {
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
367 if (!dmu_objset_is_snapshot(zfsvfs->z_os))
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
368 readonly_changed_cb(zfsvfs, B_FALSE);
8cc863b1e47a 6420204 root filesystem's delete queue is not running
tabriz
parents: 1646
diff changeset
369 else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL))
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
370 return (EROFS);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
371 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
372
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
373 if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
374 devices_changed_cb(zfsvfs, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
375 setuid_changed_cb(zfsvfs, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
376 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
377 if (vfs_optionisset(vfsp, MNTOPT_NODEVICES, NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
378 devices_changed_cb(zfsvfs, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
379 else if (vfs_optionisset(vfsp, MNTOPT_DEVICES, NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
380 devices_changed_cb(zfsvfs, B_TRUE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
381
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
382 if (vfs_optionisset(vfsp, MNTOPT_NOSETUID, NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
383 setuid_changed_cb(zfsvfs, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
384 else if (vfs_optionisset(vfsp, MNTOPT_SETUID, NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
385 setuid_changed_cb(zfsvfs, B_TRUE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
386 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
387
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
388 if (vfs_optionisset(vfsp, MNTOPT_NOEXEC, NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
389 exec_changed_cb(zfsvfs, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
390 else if (vfs_optionisset(vfsp, MNTOPT_EXEC, NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
391 exec_changed_cb(zfsvfs, B_TRUE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
392
2474
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2354
diff changeset
393 if (vfs_optionisset(vfsp, MNTOPT_ATIME, NULL))
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2354
diff changeset
394 atime_changed_cb(zfsvfs, B_TRUE);
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2354
diff changeset
395 else if (vfs_optionisset(vfsp, MNTOPT_NOATIME, NULL))
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2354
diff changeset
396 atime_changed_cb(zfsvfs, B_FALSE);
c001ad7e0c25 6368751 libzfs interface for mount/umounting all the file systems for a given pool
eschrock
parents: 2354
diff changeset
397
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
398 if (vfs_optionisset(vfsp, MNTOPT_XATTR, NULL))
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
399 xattr_changed_cb(zfsvfs, B_TRUE);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
400 else if (vfs_optionisset(vfsp, MNTOPT_NOXATTR, NULL))
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
401 xattr_changed_cb(zfsvfs, B_FALSE);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
402
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
403 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
404 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
405
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
406 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
407 zfs_register_callbacks(vfs_t *vfsp)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
408 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
409 struct dsl_dataset *ds = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
410 objset_t *os = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
411 zfsvfs_t *zfsvfs = NULL;
3265
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3246
diff changeset
412 int readonly, do_readonly = FALSE;
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3246
diff changeset
413 int setuid, do_setuid = FALSE;
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3246
diff changeset
414 int exec, do_exec = FALSE;
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3246
diff changeset
415 int devices, do_devices = FALSE;
967e0fca6143 6463140 zfs recv with a snapshot name that has 2 @@ in a row succeeds
ahrens
parents: 3246
diff changeset
416 int xattr, do_xattr = FALSE;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
417 int error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
418
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
419 ASSERT(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
420 zfsvfs = vfsp->vfs_data;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
421 ASSERT(zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
422 os = zfsvfs->z_os;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
423
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
424 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
425 * The act of registering our callbacks will destroy any mount
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
426 * options we may have. In order to enable temporary overrides
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
427 * of mount options, we stash away the current values and
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
428 * restore them after we register the callbacks.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
429 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
430 if (vfs_optionisset(vfsp, MNTOPT_RO, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
431 readonly = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
432 do_readonly = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
433 } else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
434 readonly = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
435 do_readonly = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
436 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
437 if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
438 devices = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
439 setuid = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
440 do_devices = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
441 do_setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
442 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
443 if (vfs_optionisset(vfsp, MNTOPT_NODEVICES, 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 do_devices = B_TRUE;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
446 } else if (vfs_optionisset(vfsp, MNTOPT_DEVICES, NULL)) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
447 devices = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
448 do_devices = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
449 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
450
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
451 if (vfs_optionisset(vfsp, MNTOPT_NOSETUID, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
452 setuid = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
453 do_setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
454 } else if (vfs_optionisset(vfsp, MNTOPT_SETUID, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
455 setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
456 do_setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
457 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
458 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
459 if (vfs_optionisset(vfsp, MNTOPT_NOEXEC, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
460 exec = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
461 do_exec = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
462 } else if (vfs_optionisset(vfsp, MNTOPT_EXEC, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
463 exec = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
464 do_exec = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
465 }
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
466 if (vfs_optionisset(vfsp, MNTOPT_NOXATTR, NULL)) {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
467 xattr = B_FALSE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
468 do_xattr = B_TRUE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
469 } else if (vfs_optionisset(vfsp, MNTOPT_XATTR, NULL)) {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
470 xattr = B_TRUE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
471 do_xattr = B_TRUE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
472 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
473
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
474 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
475 * Register property callbacks.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
476 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
477 * It would probably be fine to just check for i/o error from
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
478 * the first prop_register(), but I guess I like to go
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
479 * overboard...
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
480 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
481 ds = dmu_objset_ds(os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
482 error = dsl_prop_register(ds, "atime", atime_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
483 error = error ? error : dsl_prop_register(ds,
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
484 "xattr", xattr_changed_cb, zfsvfs);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
485 error = error ? error : dsl_prop_register(ds,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
486 "recordsize", blksz_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
487 error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
488 "readonly", readonly_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
489 error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
490 "devices", devices_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
491 error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
492 "setuid", setuid_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
493 error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
494 "exec", exec_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
495 error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
496 "snapdir", snapdir_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
497 error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
498 "aclmode", acl_mode_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
499 error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
500 "aclinherit", acl_inherit_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
501 if (error)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
502 goto unregister;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
503
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
504 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
505 * Invoke our callbacks to restore temporary mount options.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
506 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
507 if (do_readonly)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
508 readonly_changed_cb(zfsvfs, readonly);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
509 if (do_setuid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
510 setuid_changed_cb(zfsvfs, setuid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
511 if (do_exec)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
512 exec_changed_cb(zfsvfs, exec);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
513 if (do_devices)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
514 devices_changed_cb(zfsvfs, devices);
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
515 if (do_xattr)
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
516 xattr_changed_cb(zfsvfs, xattr);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
517
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
518 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
519
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
520 unregister:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
521 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
522 * We may attempt to unregister some callbacks that are not
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
523 * registered, but this is OK; it will simply return ENOMSG,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
524 * which we will ignore.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
525 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
526 (void) dsl_prop_unregister(ds, "atime", atime_changed_cb, zfsvfs);
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
527 (void) dsl_prop_unregister(ds, "xattr", xattr_changed_cb, zfsvfs);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
528 (void) dsl_prop_unregister(ds, "recordsize", blksz_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
529 (void) dsl_prop_unregister(ds, "readonly", readonly_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
530 (void) dsl_prop_unregister(ds, "devices", devices_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
531 (void) dsl_prop_unregister(ds, "setuid", setuid_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
532 (void) dsl_prop_unregister(ds, "exec", exec_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
533 (void) dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
534 (void) dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
535 (void) dsl_prop_unregister(ds, "aclinherit", acl_inherit_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
536 zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
537 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
538
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
539 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
540
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
541 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
542 zfs_domount(vfs_t *vfsp, char *osname, cred_t *cr)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
543 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
544 dev_t mount_dev;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
545 uint64_t recordsize, readonly;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
546 int error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
547 int mode;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
548 zfsvfs_t *zfsvfs;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
549 znode_t *zp = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
550
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
551 ASSERT(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
552 ASSERT(osname);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
553
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
554 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
555 * Initialize the zfs-specific filesystem structure.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
556 * Should probably make this a kmem cache, shuffle fields,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
557 * and just bzero up to z_hold_mtx[].
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
558 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
559 zfsvfs = kmem_zalloc(sizeof (zfsvfs_t), KM_SLEEP);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
560 zfsvfs->z_vfs = vfsp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
561 zfsvfs->z_parent = zfsvfs;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
562 zfsvfs->z_assign = TXG_NOWAIT;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
563 zfsvfs->z_max_blksz = SPA_MAXBLOCKSIZE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
564 zfsvfs->z_show_ctldir = ZFS_SNAPDIR_VISIBLE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
565
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
566 mutex_init(&zfsvfs->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
567 list_create(&zfsvfs->z_all_znodes, sizeof (znode_t),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
568 offsetof(znode_t, z_link_node));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
569 rw_init(&zfsvfs->z_um_lock, NULL, RW_DEFAULT, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
570
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
571 /* Initialize the generic filesystem structure. */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
572 vfsp->vfs_bcount = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
573 vfsp->vfs_data = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
574
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
575 if (zfs_create_unique_device(&mount_dev) == -1) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
576 error = ENODEV;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
577 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
578 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
579 ASSERT(vfs_devismounted(mount_dev) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
580
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
581 if (error = dsl_prop_get_integer(osname, "recordsize", &recordsize,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
582 NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
583 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
584
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
585 vfsp->vfs_dev = mount_dev;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
586 vfsp->vfs_fstype = zfsfstype;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
587 vfsp->vfs_bsize = recordsize;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
588 vfsp->vfs_flag |= VFS_NOTRUNC;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
589 vfsp->vfs_data = zfsvfs;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
590
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
591 if (error = dsl_prop_get_integer(osname, "readonly", &readonly, NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
592 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
593
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
594 if (readonly)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
595 mode = DS_MODE_PRIMARY | DS_MODE_READONLY;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
596 else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
597 mode = DS_MODE_PRIMARY;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
598
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
599 error = dmu_objset_open(osname, DMU_OST_ZFS, mode, &zfsvfs->z_os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
600 if (error == EROFS) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
601 mode = DS_MODE_PRIMARY | DS_MODE_READONLY;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
602 error = dmu_objset_open(osname, DMU_OST_ZFS, mode,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
603 &zfsvfs->z_os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
604 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
605
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
606 if (error)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
607 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
608
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
609 if (error = zfs_init_fs(zfsvfs, &zp, cr))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
610 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
611
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
612 /* The call to zfs_init_fs leaves the vnode held, release it here. */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
613 VN_RELE(ZTOV(zp));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
614
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
615 if (dmu_objset_is_snapshot(zfsvfs->z_os)) {
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
616 uint64_t xattr;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
617
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
618 ASSERT(mode & DS_MODE_READONLY);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
619 atime_changed_cb(zfsvfs, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
620 readonly_changed_cb(zfsvfs, B_TRUE);
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
621 if (error = dsl_prop_get_integer(osname, "xattr", &xattr, NULL))
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
622 goto out;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
623 xattr_changed_cb(zfsvfs, xattr);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
624 zfsvfs->z_issnap = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
625 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
626 error = zfs_register_callbacks(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
627 if (error)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
628 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
629
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
630 zfs_unlinked_drain(zfsvfs);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
631
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
632 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
633 * Parse and replay the intent log.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
634 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
635 zil_replay(zfsvfs->z_os, zfsvfs, &zfsvfs->z_assign,
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
636 zfs_replay_vector);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
637
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
638 if (!zil_disable)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
639 zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
640 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
641
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
642 if (!zfsvfs->z_issnap)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
643 zfsctl_create(zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
644 out:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
645 if (error) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
646 if (zfsvfs->z_os)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
647 dmu_objset_close(zfsvfs->z_os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
648 kmem_free(zfsvfs, sizeof (zfsvfs_t));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
649 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
650 atomic_add_32(&zfs_active_fs_count, 1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
651 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
652
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
653 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
654
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
655 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
656
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
657 void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
658 zfs_unregister_callbacks(zfsvfs_t *zfsvfs)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
659 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
660 objset_t *os = zfsvfs->z_os;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
661 struct dsl_dataset *ds;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
662
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
663 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
664 * Unregister properties.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
665 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
666 if (!dmu_objset_is_snapshot(os)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
667 ds = dmu_objset_ds(os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
668 VERIFY(dsl_prop_unregister(ds, "atime", atime_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
669 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
670
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
671 VERIFY(dsl_prop_unregister(ds, "xattr", xattr_changed_cb,
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
672 zfsvfs) == 0);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
673
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
674 VERIFY(dsl_prop_unregister(ds, "recordsize", blksz_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
675 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
676
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
677 VERIFY(dsl_prop_unregister(ds, "readonly", readonly_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
678 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
679
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
680 VERIFY(dsl_prop_unregister(ds, "devices", devices_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
681 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
682
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
683 VERIFY(dsl_prop_unregister(ds, "setuid", setuid_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
684 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
685
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
686 VERIFY(dsl_prop_unregister(ds, "exec", exec_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
687 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
688
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
689 VERIFY(dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
690 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
691
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
692 VERIFY(dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
693 zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
694
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
695 VERIFY(dsl_prop_unregister(ds, "aclinherit",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
696 acl_inherit_changed_cb, zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
697 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
698 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
699
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
700 /*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
701 * Convert a decimal digit string to a uint64_t integer.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
702 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
703 static int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
704 str_to_uint64(char *str, uint64_t *objnum)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
705 {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
706 uint64_t num = 0;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
707
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
708 while (*str) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
709 if (*str < '0' || *str > '9')
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
710 return (EINVAL);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
711
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
712 num = num*10 + *str++ - '0';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
713 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
714
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
715 *objnum = num;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
716 return (0);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
717 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
718
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
719
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
720 /*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
721 * 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
722 * "rootpool-name/root-filesystem-object-number'. Convert this
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
723 * string to a dataset name: "rootpool-name/root-filesystem-name".
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
724 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
725 static int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
726 parse_bootpath(char *bpath, char *outpath)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
727 {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
728 char *slashp;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
729 uint64_t objnum;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
730 int error;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
731
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
732 if (*bpath == 0 || *bpath == '/')
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
733 return (EINVAL);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
734
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
735 slashp = strchr(bpath, '/');
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
736
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
737 /* if no '/', just return the pool name */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
738 if (slashp == NULL) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
739 (void) strcpy(outpath, bpath);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
740 return (0);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
741 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
742
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
743 if (error = str_to_uint64(slashp+1, &objnum))
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
744 return (error);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
745
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
746 *slashp = '\0';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
747 error = dsl_dsobj_to_dsname(bpath, objnum, outpath);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
748 *slashp = '/';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
749
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
750 return (error);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
751 }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
752
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
753 static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
754 zfs_mountroot(vfs_t *vfsp, enum whymountroot why)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
755 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
756 int error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
757 int ret = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
758 static int zfsrootdone = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
759 zfsvfs_t *zfsvfs = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
760 znode_t *zp = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
761 vnode_t *vp = NULL;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
762 char *zfs_bootpath;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
763
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
764 ASSERT(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
765
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
766 /*
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
767 * The filesystem that we mount as root is defined in the
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
768 * "zfs-bootfs" property.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
769 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
770 if (why == ROOT_INIT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
771 if (zfsrootdone++)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
772 return (EBUSY);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
773
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
774 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_root_node(),
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
775 DDI_PROP_DONTPASS, "zfs-bootfs", &zfs_bootpath) !=
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
776 DDI_SUCCESS)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
777 return (EIO);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
778
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
779 error = parse_bootpath(zfs_bootpath, rootfs.bo_name);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
780 ddi_prop_free(zfs_bootpath);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
781
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
782 if (error)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
783 return (error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
784
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
785 if (error = vfs_lock(vfsp))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
786 return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
787
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
788 if (error = zfs_domount(vfsp, rootfs.bo_name, CRED()))
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
789 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
790
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
791 zfsvfs = (zfsvfs_t *)vfsp->vfs_data;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
792 ASSERT(zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
793 if (error = zfs_zget(zfsvfs, zfsvfs->z_root, &zp))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
794 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
795
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
796 vp = ZTOV(zp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
797 mutex_enter(&vp->v_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
798 vp->v_flag |= VROOT;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
799 mutex_exit(&vp->v_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
800 rootvp = vp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
801
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
802 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
803 * The zfs_zget call above returns with a hold on vp, we release
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
804 * it here.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
805 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
806 VN_RELE(vp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
807
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
808 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
809 * Mount root as readonly initially, it will be remouted
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
810 * read/write by /lib/svc/method/fs-usr.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
811 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
812 readonly_changed_cb(vfsp->vfs_data, B_TRUE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
813 vfs_add((struct vnode *)0, vfsp,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
814 (vfsp->vfs_flag & VFS_RDONLY) ? MS_RDONLY : 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
815 out:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
816 vfs_unlock(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
817 ret = (error) ? error : 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
818 return (ret);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
819
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
820 } else if (why == ROOT_REMOUNT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
821
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
822 readonly_changed_cb(vfsp->vfs_data, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
823 vfsp->vfs_flag |= VFS_REMOUNT;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
824 return (zfs_refresh_properties(vfsp));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
825
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
826 } else if (why == ROOT_UNMOUNT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
827 zfs_unregister_callbacks((zfsvfs_t *)vfsp->vfs_data);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
828 (void) zfs_sync(vfsp, 0, 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
829 return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
830 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
831
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
832 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
833 * if "why" is equal to anything else other than ROOT_INIT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
834 * ROOT_REMOUNT, or ROOT_UNMOUNT, we do not support it.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
835 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
836 return (ENOTSUP);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
837 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
838
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
839 /*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
840 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
841 zfs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
842 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
843 char *osname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
844 pathname_t spn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
845 int error = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
846 uio_seg_t fromspace = (uap->flags & MS_SYSSPACE) ?
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
847 UIO_SYSSPACE : UIO_USERSPACE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
848 int canwrite;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
849
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
850 if (mvp->v_type != VDIR)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
851 return (ENOTDIR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
852
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
853 mutex_enter(&mvp->v_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
854 if ((uap->flags & MS_REMOUNT) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
855 (uap->flags & MS_OVERLAY) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
856 (mvp->v_count != 1 || (mvp->v_flag & VROOT))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
857 mutex_exit(&mvp->v_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
858 return (EBUSY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
859 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
860 mutex_exit(&mvp->v_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
861
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
862 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
863 * ZFS does not support passing unparsed data in via MS_DATA.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
864 * Users should use the MS_OPTIONSTR interface; this means
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
865 * that all option parsing is already done and the options struct
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
866 * can be interrogated.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
867 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
868 if ((uap->flags & MS_DATA) && uap->datalen > 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
869 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
870
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
871 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
872 * When doing a remount, we simply refresh our temporary properties
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
873 * according to those options set in the current VFS options.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
874 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
875 if (uap->flags & MS_REMOUNT) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
876 return (zfs_refresh_properties(vfsp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
877 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
878
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
879 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
880 * Get the objset name (the "special" mount argument).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
881 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
882 if (error = pn_get(uap->spec, fromspace, &spn))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
883 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
884
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
885 osname = spn.pn_path;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
886
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
887 if ((error = secpolicy_fs_mount(cr, mvp, vfsp)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
888 goto out;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
889
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
890 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
891 * Refuse to mount a filesystem if we are in a local zone and the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
892 * dataset is not visible.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
893 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
894 if (!INGLOBALZONE(curproc) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
895 (!zone_dataset_visible(osname, &canwrite) || !canwrite)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
896 error = EPERM;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
897 goto out;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
898 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
899
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
900 error = zfs_domount(vfsp, osname, cr);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
901
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
902 out:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
903 pn_free(&spn);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
904 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
905 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
906
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
907 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
908 zfs_statvfs(vfs_t *vfsp, struct statvfs64 *statp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
909 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
910 zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
911 dev32_t d32;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
912 uint64_t refdbytes, availbytes, usedobjs, availobjs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
913
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
914 ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
915
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
916 dmu_objset_space(zfsvfs->z_os,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
917 &refdbytes, &availbytes, &usedobjs, &availobjs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
918
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
919 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
920 * The underlying storage pool actually uses multiple block sizes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
921 * We report the fragsize as the smallest block size we support,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
922 * and we report our blocksize as the filesystem's maximum blocksize.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
923 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
924 statp->f_frsize = 1UL << SPA_MINBLOCKSHIFT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
925 statp->f_bsize = zfsvfs->z_max_blksz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
926
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
927 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
928 * The following report "total" blocks of various kinds in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
929 * file system, but reported in terms of f_frsize - the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
930 * "fragment" size.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
931 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
932
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
933 statp->f_blocks = (refdbytes + availbytes) >> SPA_MINBLOCKSHIFT;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
934 statp->f_bfree = availbytes >> SPA_MINBLOCKSHIFT;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
935 statp->f_bavail = statp->f_bfree; /* no root reservation */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
936
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
937 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
938 * statvfs() should really be called statufs(), because it assumes
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
939 * static metadata. ZFS doesn't preallocate files, so the best
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
940 * we can do is report the max that could possibly fit in f_files,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
941 * and that minus the number actually used in f_ffree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
942 * For f_ffree, report the smaller of the number of object available
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
943 * and the number of blocks (each object will take at least a block).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
944 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
945 statp->f_ffree = MIN(availobjs, statp->f_bfree);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
946 statp->f_favail = statp->f_ffree; /* no "root reservation" */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
947 statp->f_files = statp->f_ffree + usedobjs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
948
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
949 (void) cmpldev(&d32, vfsp->vfs_dev);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
950 statp->f_fsid = d32;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
951
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
952 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
953 * We're a zfs filesystem.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
954 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
955 (void) strcpy(statp->f_basetype, vfssw[vfsp->vfs_fstype].vsw_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
956
1123
02a0390fbc7d 6363529 UNIX03/UNIX98 *vsx* CAPI.os/files/fstatvfs/T.fstatvfs 11 FAILS
marks
parents: 849
diff changeset
957 statp->f_flag = vf_to_stf(vfsp->vfs_flag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
958
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
959 statp->f_namemax = ZFS_MAXNAMELEN;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
960
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
961 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
962 * We have all of 32 characters to stuff a string here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
963 * Is there anything useful we could/should provide?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
964 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
965 bzero(statp->f_fstr, sizeof (statp->f_fstr));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
966
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
967 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
968 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
969 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
970
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
971 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
972 zfs_root(vfs_t *vfsp, vnode_t **vpp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
973 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
974 zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
975 znode_t *rootzp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
976 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
977
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
978 ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
979
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
980 error = zfs_zget(zfsvfs, zfsvfs->z_root, &rootzp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
981 if (error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
982 *vpp = ZTOV(rootzp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
983
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
984 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
985 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
986 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
987
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
988 /*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
989 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
990 zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
991 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
992 zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
993 int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
994
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
995 if ((ret = secpolicy_fs_unmount(cr, vfsp)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
996 return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
997
1484
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
998
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
999 (void) dnlc_purge_vfsp(vfsp, 0);
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
1000
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1001 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1002 * Unmount any snapshots mounted under .zfs before unmounting the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1003 * dataset itself.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1004 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1005 if (zfsvfs->z_ctldir != NULL &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1006 (ret = zfsctl_umount_snapshots(vfsp, fflag, cr)) != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1007 return (ret);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1008
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1009 if (fflag & MS_FORCE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1010 vfsp->vfs_flag |= VFS_UNMOUNTED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1011 zfsvfs->z_unmounted1 = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1012
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1013 /*
4480
0976678e58c5 6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents: 3912
diff changeset
1014 * Ensure that z_unmounted1 reaches global visibility
0976678e58c5 6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents: 3912
diff changeset
1015 * before z_op_cnt.
0976678e58c5 6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents: 3912
diff changeset
1016 */
0976678e58c5 6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents: 3912
diff changeset
1017 membar_producer();
0976678e58c5 6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents: 3912
diff changeset
1018
0976678e58c5 6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents: 3912
diff changeset
1019 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1020 * Wait for all zfs threads to leave zfs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1021 * Grabbing a rwlock as reader in all vops and
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1022 * as writer here doesn't work because it too easy to get
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1023 * multiple reader enters as zfs can re-enter itself.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1024 * This can lead to deadlock if there is an intervening
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1025 * rw_enter as writer.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1026 * So a file system threads ref count (z_op_cnt) is used.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1027 * A polling loop on z_op_cnt may seem inefficient, but
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1028 * - this saves all threads on exit from having to grab a
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1029 * mutex in order to cv_signal
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1030 * - only occurs on forced unmount in the rare case when
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1031 * there are outstanding threads within the file system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1032 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1033 while (zfsvfs->z_op_cnt) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1034 delay(1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1035 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1036
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1037 zfs_objset_close(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1038
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1039 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1040 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1041 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1042 * Check the number of active vnodes in the file system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1043 * Our count is maintained in the vfs structure, but the number
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1044 * is off by 1 to indicate a hold on the vfs structure itself.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1045 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1046 * The '.zfs' directory maintains a reference of its own, and any active
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1047 * references underneath are reflected in the vnode count.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1048 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1049 if (zfsvfs->z_ctldir == NULL) {
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
1050 if (vfsp->vfs_count > 1)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1051 return (EBUSY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1052 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1053 if (vfsp->vfs_count > 2 ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1054 (zfsvfs->z_ctldir->v_count > 1 && !(fflag & MS_FORCE))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1055 return (EBUSY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1056 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1057 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1058
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1059 vfsp->vfs_flag |= VFS_UNMOUNTED;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1060 zfs_objset_close(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1061
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1062 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1063 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1064
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1065 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1066 zfs_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1067 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1068 zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1069 znode_t *zp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1070 uint64_t object = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1071 uint64_t fid_gen = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1072 uint64_t gen_mask;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1073 uint64_t zp_gen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1074 int i, err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1075
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1076 *vpp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1077
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1078 ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1079
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1080 if (fidp->fid_len == LONG_FID_LEN) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1081 zfid_long_t *zlfid = (zfid_long_t *)fidp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1082 uint64_t objsetid = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1083 uint64_t setgen = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1084
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1085 for (i = 0; i < sizeof (zlfid->zf_setid); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1086 objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1087
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1088 for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1089 setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1090
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1091 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1092
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1093 err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1094 if (err)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1095 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1096 ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1097 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1098
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1099 if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1100 zfid_short_t *zfid = (zfid_short_t *)fidp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1101
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1102 for (i = 0; i < sizeof (zfid->zf_object); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1103 object |= ((uint64_t)zfid->zf_object[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1104
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1105 for (i = 0; i < sizeof (zfid->zf_gen); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1106 fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1107 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1108 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1109 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1110 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1111
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1112 /* A zero fid_gen means we are in the .zfs control directories */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1113 if (fid_gen == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1114 (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1115 *vpp = zfsvfs->z_ctldir;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1116 ASSERT(*vpp != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1117 if (object == ZFSCTL_INO_SNAPDIR) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1118 VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1119 0, NULL, NULL) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1120 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1121 VN_HOLD(*vpp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1122 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1123 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1124 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1125 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1126
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1127 gen_mask = -1ULL >> (64 - 8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1128
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1129 dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1130 if (err = zfs_zget(zfsvfs, object, &zp)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1131 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1132 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1133 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1134 zp_gen = zp->z_phys->zp_gen & gen_mask;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1135 if (zp_gen == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1136 zp_gen = 1;
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
1137 if (zp->z_unlinked || zp_gen != fid_gen) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1138 dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1139 VN_RELE(ZTOV(zp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1140 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1141 return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1142 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1143
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1144 *vpp = ZTOV(zp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1145 ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1146 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1147 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1148
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1149 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1150 zfs_objset_close(zfsvfs_t *zfsvfs)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1151 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1152 znode_t *zp, *nextzp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1153 objset_t *os = zfsvfs->z_os;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1154
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1155 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1156 * For forced unmount, at this point all vops except zfs_inactive
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1157 * are erroring EIO. We need to now suspend zfs_inactive threads
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1158 * while we are freeing dbufs before switching zfs_inactive
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1159 * to use behaviour without a objset.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1160 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1161 rw_enter(&zfsvfs->z_um_lock, RW_WRITER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1162
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1163 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1164 * Release all holds on dbufs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1165 * Note, although we have stopped all other vop threads and
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1166 * zfs_inactive(), the dmu can callback via znode_pageout_func()
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1167 * which can zfs_znode_free() the znode.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1168 * So we lock z_all_znodes; search the list for a held
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1169 * dbuf; drop the lock (we know zp can't disappear if we hold
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1170 * a dbuf lock; then regrab the lock and restart.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1171 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1172 mutex_enter(&zfsvfs->z_znodes_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1173 for (zp = list_head(&zfsvfs->z_all_znodes); zp; zp = nextzp) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1174 nextzp = list_next(&zfsvfs->z_all_znodes, zp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1175 if (zp->z_dbuf_held) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1176 /* dbufs should only be held when force unmounting */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1177 zp->z_dbuf_held = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1178 mutex_exit(&zfsvfs->z_znodes_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
1179 dmu_buf_rele(zp->z_dbuf, NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1180 /* Start again */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1181 mutex_enter(&zfsvfs->z_znodes_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1182 nextzp = list_head(&zfsvfs->z_all_znodes);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1183 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1184 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1185 mutex_exit(&zfsvfs->z_znodes_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1186
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1187 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1188 * Unregister properties.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1189 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
1190 if (!dmu_objset_is_snapshot(os))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
1191 zfs_unregister_callbacks(zfsvfs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1192
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1193 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1194 * Switch zfs_inactive to behaviour without an objset.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1195 * It just tosses cached pages and frees the znode & vnode.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1196 * Then re-enable zfs_inactive threads in that new behaviour.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1197 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1198 zfsvfs->z_unmounted2 = B_TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1199 rw_exit(&zfsvfs->z_um_lock); /* re-enable any zfs_inactive threads */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1200
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1201 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1202 * Close the zil. Can't close the zil while zfs_inactive
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1203 * threads are blocked as zil_close can call zfs_inactive.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1204 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1205 if (zfsvfs->z_log) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1206 zil_close(zfsvfs->z_log);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1207 zfsvfs->z_log = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1208 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1209
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1210 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
1211 * Evict all dbufs so that cached znodes will be freed
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
1212 */
1646
b4e43ae19fff 6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents: 1544
diff changeset
1213 if (dmu_objset_evict_dbufs(os, 1)) {
b4e43ae19fff 6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents: 1544
diff changeset
1214 txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
b4e43ae19fff 6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents: 1544
diff changeset
1215 (void) dmu_objset_evict_dbufs(os, 0);
b4e43ae19fff 6393443 Remove remaining txg_wait_synced() from zfs unmount path.
perrin
parents: 1544
diff changeset
1216 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
1217
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
1218 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1219 * Finally close the objset
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1220 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1221 dmu_objset_close(os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1222
1298
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1123
diff changeset
1223 /*
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1123
diff changeset
1224 * We can now safely destroy the '.zfs' directory node.
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1123
diff changeset
1225 */
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1123
diff changeset
1226 if (zfsvfs->z_ctldir != NULL)
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1123
diff changeset
1227 zfsctl_destroy(zfsvfs);
1a70f57b62f0 6368181 some memleaks found related to zfs mount
perrin
parents: 1123
diff changeset
1228
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1229 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1230
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1231 static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1232 zfs_freevfs(vfs_t *vfsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1233 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1234 zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1235
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1236 kmem_free(zfsvfs, sizeof (zfsvfs_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1237
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1238 atomic_add_32(&zfs_active_fs_count, -1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1239 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1240
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1241 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1242 * VFS_INIT() initialization. Note that there is no VFS_FINI(),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1243 * so we can't safely do any non-idempotent initialization here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1244 * Leave that to zfs_init() and zfs_fini(), which are called
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1245 * from the module's _init() and _fini() entry points.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1246 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1247 /*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1248 static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1249 zfs_vfsinit(int fstype, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1250 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1251 int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1252
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1253 zfsfstype = fstype;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1254
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1255 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1256 * Setup vfsops and vnodeops tables.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1257 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1258 error = vfs_setfsops(fstype, zfs_vfsops_template, &zfs_vfsops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1259 if (error != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1260 cmn_err(CE_WARN, "zfs: bad vfs ops template");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1261 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1262
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1263 error = zfs_create_op_tables();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1264 if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1265 zfs_remove_op_tables();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1266 cmn_err(CE_WARN, "zfs: bad vnode ops template");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1267 (void) vfs_freevfsops_by_type(zfsfstype);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1268 return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1269 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1270
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1271 mutex_init(&zfs_dev_mtx, NULL, MUTEX_DEFAULT, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1272
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1273 /*
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1274 * Unique major number for all zfs mounts.
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1275 * If we run out of 32-bit minors, we'll getudev() another major.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1276 */
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
1277 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
1278 zfs_minor = ZFS_MIN_MINOR;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1279
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1280 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1281 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1282
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1283 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1284 zfs_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1285 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1286 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1287 * Initialize .zfs directory structures
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1288 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1289 zfsctl_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1290
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1291 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1292 * Initialize znode cache, vnode ops, etc...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1293 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1294 zfs_znode_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1295 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1296
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1297 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1298 zfs_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1299 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1300 zfsctl_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1301 zfs_znode_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1302 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1303
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1304 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1305 zfs_busy(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1306 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1307 return (zfs_active_fs_count != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1308 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1309
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1310 static vfsdef_t vfw = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1311 VFSDEF_VERSION,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1312 MNTTYPE_ZFS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1313 zfs_vfsinit,
1488
196daa2cf3db PSARC/2006/034 fsstat
rsb
parents: 1484
diff changeset
1314 VSW_HASPROTO|VSW_CANRWRO|VSW_CANREMOUNT|VSW_VOLATILEDEV|VSW_STATS,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1315 &zfs_mntopts
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1316 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1317
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1318 struct modlfs zfs_modlfs = {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2638
diff changeset
1319 &mod_fsops, "ZFS filesystem version " ZFS_VERSION_STRING, &vfw
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1320 };