annotate usr/src/uts/common/fs/zfs/zfs_vfsops.c @ 4577:ed36b0e652bc

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