]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
MFV r316925: 6101 attempt to lzc_create() a filesystem under a volume results in...
[FreeBSD/FreeBSD.git] / sys / cddl / contrib / opensolaris / uts / common / fs / zfs / zfs_vfsops.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright (c) 2011 Pawel Jakub Dawidek <pawel@dawidek.net>.
24  * All rights reserved.
25  * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
26  * Copyright (c) 2014 Integros [integros.com]
27  */
28
29 /* Portions Copyright 2010 Robert Milkowski */
30
31 #include <sys/types.h>
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/kernel.h>
35 #include <sys/sysmacros.h>
36 #include <sys/kmem.h>
37 #include <sys/acl.h>
38 #include <sys/vnode.h>
39 #include <sys/vfs.h>
40 #include <sys/mntent.h>
41 #include <sys/mount.h>
42 #include <sys/cmn_err.h>
43 #include <sys/zfs_znode.h>
44 #include <sys/zfs_dir.h>
45 #include <sys/zil.h>
46 #include <sys/fs/zfs.h>
47 #include <sys/dmu.h>
48 #include <sys/dsl_prop.h>
49 #include <sys/dsl_dataset.h>
50 #include <sys/dsl_deleg.h>
51 #include <sys/spa.h>
52 #include <sys/zap.h>
53 #include <sys/sa.h>
54 #include <sys/sa_impl.h>
55 #include <sys/varargs.h>
56 #include <sys/policy.h>
57 #include <sys/atomic.h>
58 #include <sys/zfs_ioctl.h>
59 #include <sys/zfs_ctldir.h>
60 #include <sys/zfs_fuid.h>
61 #include <sys/sunddi.h>
62 #include <sys/dnlc.h>
63 #include <sys/dmu_objset.h>
64 #include <sys/spa_boot.h>
65 #include <sys/jail.h>
66 #include "zfs_comutil.h"
67
68 struct mtx zfs_debug_mtx;
69 MTX_SYSINIT(zfs_debug_mtx, &zfs_debug_mtx, "zfs_debug", MTX_DEF);
70
71 SYSCTL_NODE(_vfs, OID_AUTO, zfs, CTLFLAG_RW, 0, "ZFS file system");
72
73 int zfs_super_owner;
74 SYSCTL_INT(_vfs_zfs, OID_AUTO, super_owner, CTLFLAG_RW, &zfs_super_owner, 0,
75     "File system owner can perform privileged operation on his file systems");
76
77 int zfs_debug_level;
78 SYSCTL_INT(_vfs_zfs, OID_AUTO, debug, CTLFLAG_RWTUN, &zfs_debug_level, 0,
79     "Debug level");
80
81 SYSCTL_NODE(_vfs_zfs, OID_AUTO, version, CTLFLAG_RD, 0, "ZFS versions");
82 static int zfs_version_acl = ZFS_ACL_VERSION;
83 SYSCTL_INT(_vfs_zfs_version, OID_AUTO, acl, CTLFLAG_RD, &zfs_version_acl, 0,
84     "ZFS_ACL_VERSION");
85 static int zfs_version_spa = SPA_VERSION;
86 SYSCTL_INT(_vfs_zfs_version, OID_AUTO, spa, CTLFLAG_RD, &zfs_version_spa, 0,
87     "SPA_VERSION");
88 static int zfs_version_zpl = ZPL_VERSION;
89 SYSCTL_INT(_vfs_zfs_version, OID_AUTO, zpl, CTLFLAG_RD, &zfs_version_zpl, 0,
90     "ZPL_VERSION");
91
92 static int zfs_mount(vfs_t *vfsp);
93 static int zfs_umount(vfs_t *vfsp, int fflag);
94 static int zfs_root(vfs_t *vfsp, int flags, vnode_t **vpp);
95 static int zfs_statfs(vfs_t *vfsp, struct statfs *statp);
96 static int zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp);
97 static int zfs_sync(vfs_t *vfsp, int waitfor);
98 static int zfs_checkexp(vfs_t *vfsp, struct sockaddr *nam, int *extflagsp,
99     struct ucred **credanonp, int *numsecflavors, int **secflavors);
100 static int zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp);
101 static void zfs_objset_close(zfsvfs_t *zfsvfs);
102 static void zfs_freevfs(vfs_t *vfsp);
103
104 struct vfsops zfs_vfsops = {
105         .vfs_mount =            zfs_mount,
106         .vfs_unmount =          zfs_umount,
107         .vfs_root =             zfs_root,
108         .vfs_statfs =           zfs_statfs,
109         .vfs_vget =             zfs_vget,
110         .vfs_sync =             zfs_sync,
111         .vfs_checkexp =         zfs_checkexp,
112         .vfs_fhtovp =           zfs_fhtovp,
113 };
114
115 VFS_SET(zfs_vfsops, zfs, VFCF_JAIL | VFCF_DELEGADMIN);
116
117 /*
118  * We need to keep a count of active fs's.
119  * This is necessary to prevent our module
120  * from being unloaded after a umount -f
121  */
122 static uint32_t zfs_active_fs_count = 0;
123
124 /*ARGSUSED*/
125 static int
126 zfs_sync(vfs_t *vfsp, int waitfor)
127 {
128
129         /*
130          * Data integrity is job one.  We don't want a compromised kernel
131          * writing to the storage pool, so we never sync during panic.
132          */
133         if (panicstr)
134                 return (0);
135
136         /*
137          * Ignore the system syncher.  ZFS already commits async data
138          * at zfs_txg_timeout intervals.
139          */
140         if (waitfor == MNT_LAZY)
141                 return (0);
142
143         if (vfsp != NULL) {
144                 /*
145                  * Sync a specific filesystem.
146                  */
147                 zfsvfs_t *zfsvfs = vfsp->vfs_data;
148                 dsl_pool_t *dp;
149                 int error;
150
151                 error = vfs_stdsync(vfsp, waitfor);
152                 if (error != 0)
153                         return (error);
154
155                 ZFS_ENTER(zfsvfs);
156                 dp = dmu_objset_pool(zfsvfs->z_os);
157
158                 /*
159                  * If the system is shutting down, then skip any
160                  * filesystems which may exist on a suspended pool.
161                  */
162                 if (sys_shutdown && spa_suspended(dp->dp_spa)) {
163                         ZFS_EXIT(zfsvfs);
164                         return (0);
165                 }
166
167                 if (zfsvfs->z_log != NULL)
168                         zil_commit(zfsvfs->z_log, 0);
169
170                 ZFS_EXIT(zfsvfs);
171         } else {
172                 /*
173                  * Sync all ZFS filesystems.  This is what happens when you
174                  * run sync(1M).  Unlike other filesystems, ZFS honors the
175                  * request by waiting for all pools to commit all dirty data.
176                  */
177                 spa_sync_allpools();
178         }
179
180         return (0);
181 }
182
183 #ifndef __FreeBSD_kernel__
184 static int
185 zfs_create_unique_device(dev_t *dev)
186 {
187         major_t new_major;
188
189         do {
190                 ASSERT3U(zfs_minor, <=, MAXMIN32);
191                 minor_t start = zfs_minor;
192                 do {
193                         mutex_enter(&zfs_dev_mtx);
194                         if (zfs_minor >= MAXMIN32) {
195                                 /*
196                                  * If we're still using the real major
197                                  * keep out of /dev/zfs and /dev/zvol minor
198                                  * number space.  If we're using a getudev()'ed
199                                  * major number, we can use all of its minors.
200                                  */
201                                 if (zfs_major == ddi_name_to_major(ZFS_DRIVER))
202                                         zfs_minor = ZFS_MIN_MINOR;
203                                 else
204                                         zfs_minor = 0;
205                         } else {
206                                 zfs_minor++;
207                         }
208                         *dev = makedevice(zfs_major, zfs_minor);
209                         mutex_exit(&zfs_dev_mtx);
210                 } while (vfs_devismounted(*dev) && zfs_minor != start);
211                 if (zfs_minor == start) {
212                         /*
213                          * We are using all ~262,000 minor numbers for the
214                          * current major number.  Create a new major number.
215                          */
216                         if ((new_major = getudev()) == (major_t)-1) {
217                                 cmn_err(CE_WARN,
218                                     "zfs_mount: Can't get unique major "
219                                     "device number.");
220                                 return (-1);
221                         }
222                         mutex_enter(&zfs_dev_mtx);
223                         zfs_major = new_major;
224                         zfs_minor = 0;
225
226                         mutex_exit(&zfs_dev_mtx);
227                 } else {
228                         break;
229                 }
230                 /* CONSTANTCONDITION */
231         } while (1);
232
233         return (0);
234 }
235 #endif  /* !__FreeBSD_kernel__ */
236
237 static void
238 atime_changed_cb(void *arg, uint64_t newval)
239 {
240         zfsvfs_t *zfsvfs = arg;
241
242         if (newval == TRUE) {
243                 zfsvfs->z_atime = TRUE;
244                 zfsvfs->z_vfs->vfs_flag &= ~MNT_NOATIME;
245                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME);
246                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_ATIME, NULL, 0);
247         } else {
248                 zfsvfs->z_atime = FALSE;
249                 zfsvfs->z_vfs->vfs_flag |= MNT_NOATIME;
250                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_ATIME);
251                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME, NULL, 0);
252         }
253 }
254
255 static void
256 xattr_changed_cb(void *arg, uint64_t newval)
257 {
258         zfsvfs_t *zfsvfs = arg;
259
260         if (newval == TRUE) {
261                 /* XXX locking on vfs_flag? */
262 #ifdef TODO
263                 zfsvfs->z_vfs->vfs_flag |= VFS_XATTR;
264 #endif
265                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR);
266                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_XATTR, NULL, 0);
267         } else {
268                 /* XXX locking on vfs_flag? */
269 #ifdef TODO
270                 zfsvfs->z_vfs->vfs_flag &= ~VFS_XATTR;
271 #endif
272                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_XATTR);
273                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR, NULL, 0);
274         }
275 }
276
277 static void
278 blksz_changed_cb(void *arg, uint64_t newval)
279 {
280         zfsvfs_t *zfsvfs = arg;
281         ASSERT3U(newval, <=, spa_maxblocksize(dmu_objset_spa(zfsvfs->z_os)));
282         ASSERT3U(newval, >=, SPA_MINBLOCKSIZE);
283         ASSERT(ISP2(newval));
284
285         zfsvfs->z_max_blksz = newval;
286         zfsvfs->z_vfs->mnt_stat.f_iosize = newval;
287 }
288
289 static void
290 readonly_changed_cb(void *arg, uint64_t newval)
291 {
292         zfsvfs_t *zfsvfs = arg;
293
294         if (newval) {
295                 /* XXX locking on vfs_flag? */
296                 zfsvfs->z_vfs->vfs_flag |= VFS_RDONLY;
297                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RW);
298                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RO, NULL, 0);
299         } else {
300                 /* XXX locking on vfs_flag? */
301                 zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY;
302                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RO);
303                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RW, NULL, 0);
304         }
305 }
306
307 static void
308 setuid_changed_cb(void *arg, uint64_t newval)
309 {
310         zfsvfs_t *zfsvfs = arg;
311
312         if (newval == FALSE) {
313                 zfsvfs->z_vfs->vfs_flag |= VFS_NOSETUID;
314                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_SETUID);
315                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID, NULL, 0);
316         } else {
317                 zfsvfs->z_vfs->vfs_flag &= ~VFS_NOSETUID;
318                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID);
319                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_SETUID, NULL, 0);
320         }
321 }
322
323 static void
324 exec_changed_cb(void *arg, uint64_t newval)
325 {
326         zfsvfs_t *zfsvfs = arg;
327
328         if (newval == FALSE) {
329                 zfsvfs->z_vfs->vfs_flag |= VFS_NOEXEC;
330                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_EXEC);
331                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC, NULL, 0);
332         } else {
333                 zfsvfs->z_vfs->vfs_flag &= ~VFS_NOEXEC;
334                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC);
335                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_EXEC, NULL, 0);
336         }
337 }
338
339 /*
340  * The nbmand mount option can be changed at mount time.
341  * We can't allow it to be toggled on live file systems or incorrect
342  * behavior may be seen from cifs clients
343  *
344  * This property isn't registered via dsl_prop_register(), but this callback
345  * will be called when a file system is first mounted
346  */
347 static void
348 nbmand_changed_cb(void *arg, uint64_t newval)
349 {
350         zfsvfs_t *zfsvfs = arg;
351         if (newval == FALSE) {
352                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NBMAND);
353                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NONBMAND, NULL, 0);
354         } else {
355                 vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NONBMAND);
356                 vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NBMAND, NULL, 0);
357         }
358 }
359
360 static void
361 snapdir_changed_cb(void *arg, uint64_t newval)
362 {
363         zfsvfs_t *zfsvfs = arg;
364
365         zfsvfs->z_show_ctldir = newval;
366 }
367
368 static void
369 vscan_changed_cb(void *arg, uint64_t newval)
370 {
371         zfsvfs_t *zfsvfs = arg;
372
373         zfsvfs->z_vscan = newval;
374 }
375
376 static void
377 acl_mode_changed_cb(void *arg, uint64_t newval)
378 {
379         zfsvfs_t *zfsvfs = arg;
380
381         zfsvfs->z_acl_mode = newval;
382 }
383
384 static void
385 acl_inherit_changed_cb(void *arg, uint64_t newval)
386 {
387         zfsvfs_t *zfsvfs = arg;
388
389         zfsvfs->z_acl_inherit = newval;
390 }
391
392 static int
393 zfs_register_callbacks(vfs_t *vfsp)
394 {
395         struct dsl_dataset *ds = NULL;
396         objset_t *os = NULL;
397         zfsvfs_t *zfsvfs = NULL;
398         uint64_t nbmand;
399         boolean_t readonly = B_FALSE;
400         boolean_t do_readonly = B_FALSE;
401         boolean_t setuid = B_FALSE;
402         boolean_t do_setuid = B_FALSE;
403         boolean_t exec = B_FALSE;
404         boolean_t do_exec = B_FALSE;
405 #ifdef illumos
406         boolean_t devices = B_FALSE;
407         boolean_t do_devices = B_FALSE;
408 #endif
409         boolean_t xattr = B_FALSE;
410         boolean_t do_xattr = B_FALSE;
411         boolean_t atime = B_FALSE;
412         boolean_t do_atime = B_FALSE;
413         int error = 0;
414
415         ASSERT(vfsp);
416         zfsvfs = vfsp->vfs_data;
417         ASSERT(zfsvfs);
418         os = zfsvfs->z_os;
419
420         /*
421          * This function can be called for a snapshot when we update snapshot's
422          * mount point, which isn't really supported.
423          */
424         if (dmu_objset_is_snapshot(os))
425                 return (EOPNOTSUPP);
426
427         /*
428          * The act of registering our callbacks will destroy any mount
429          * options we may have.  In order to enable temporary overrides
430          * of mount options, we stash away the current values and
431          * restore them after we register the callbacks.
432          */
433         if (vfs_optionisset(vfsp, MNTOPT_RO, NULL) ||
434             !spa_writeable(dmu_objset_spa(os))) {
435                 readonly = B_TRUE;
436                 do_readonly = B_TRUE;
437         } else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL)) {
438                 readonly = B_FALSE;
439                 do_readonly = B_TRUE;
440         }
441         if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) {
442                 setuid = B_FALSE;
443                 do_setuid = B_TRUE;
444         } else {
445                 if (vfs_optionisset(vfsp, MNTOPT_NOSETUID, NULL)) {
446                         setuid = B_FALSE;
447                         do_setuid = B_TRUE;
448                 } else if (vfs_optionisset(vfsp, MNTOPT_SETUID, NULL)) {
449                         setuid = B_TRUE;
450                         do_setuid = B_TRUE;
451                 }
452         }
453         if (vfs_optionisset(vfsp, MNTOPT_NOEXEC, NULL)) {
454                 exec = B_FALSE;
455                 do_exec = B_TRUE;
456         } else if (vfs_optionisset(vfsp, MNTOPT_EXEC, NULL)) {
457                 exec = B_TRUE;
458                 do_exec = B_TRUE;
459         }
460         if (vfs_optionisset(vfsp, MNTOPT_NOXATTR, NULL)) {
461                 xattr = B_FALSE;
462                 do_xattr = B_TRUE;
463         } else if (vfs_optionisset(vfsp, MNTOPT_XATTR, NULL)) {
464                 xattr = B_TRUE;
465                 do_xattr = B_TRUE;
466         }
467         if (vfs_optionisset(vfsp, MNTOPT_NOATIME, NULL)) {
468                 atime = B_FALSE;
469                 do_atime = B_TRUE;
470         } else if (vfs_optionisset(vfsp, MNTOPT_ATIME, NULL)) {
471                 atime = B_TRUE;
472                 do_atime = B_TRUE;
473         }
474
475         /*
476          * We need to enter pool configuration here, so that we can use
477          * dsl_prop_get_int_ds() to handle the special nbmand property below.
478          * dsl_prop_get_integer() can not be used, because it has to acquire
479          * spa_namespace_lock and we can not do that because we already hold
480          * z_teardown_lock.  The problem is that spa_config_sync() is called
481          * with spa_namespace_lock held and the function calls ZFS vnode
482          * operations to write the cache file and thus z_teardown_lock is
483          * acquired after spa_namespace_lock.
484          */
485         ds = dmu_objset_ds(os);
486         dsl_pool_config_enter(dmu_objset_pool(os), FTAG);
487
488         /*
489          * nbmand is a special property.  It can only be changed at
490          * mount time.
491          *
492          * This is weird, but it is documented to only be changeable
493          * at mount time.
494          */
495         if (vfs_optionisset(vfsp, MNTOPT_NONBMAND, NULL)) {
496                 nbmand = B_FALSE;
497         } else if (vfs_optionisset(vfsp, MNTOPT_NBMAND, NULL)) {
498                 nbmand = B_TRUE;
499         } else if (error = dsl_prop_get_int_ds(ds, "nbmand", &nbmand) != 0) {
500                 dsl_pool_config_exit(dmu_objset_pool(os), FTAG);
501                 return (error);
502         }
503
504         /*
505          * Register property callbacks.
506          *
507          * It would probably be fine to just check for i/o error from
508          * the first prop_register(), but I guess I like to go
509          * overboard...
510          */
511         error = dsl_prop_register(ds,
512             zfs_prop_to_name(ZFS_PROP_ATIME), atime_changed_cb, zfsvfs);
513         error = error ? error : dsl_prop_register(ds,
514             zfs_prop_to_name(ZFS_PROP_XATTR), xattr_changed_cb, zfsvfs);
515         error = error ? error : dsl_prop_register(ds,
516             zfs_prop_to_name(ZFS_PROP_RECORDSIZE), blksz_changed_cb, zfsvfs);
517         error = error ? error : dsl_prop_register(ds,
518             zfs_prop_to_name(ZFS_PROP_READONLY), readonly_changed_cb, zfsvfs);
519 #ifdef illumos
520         error = error ? error : dsl_prop_register(ds,
521             zfs_prop_to_name(ZFS_PROP_DEVICES), devices_changed_cb, zfsvfs);
522 #endif
523         error = error ? error : dsl_prop_register(ds,
524             zfs_prop_to_name(ZFS_PROP_SETUID), setuid_changed_cb, zfsvfs);
525         error = error ? error : dsl_prop_register(ds,
526             zfs_prop_to_name(ZFS_PROP_EXEC), exec_changed_cb, zfsvfs);
527         error = error ? error : dsl_prop_register(ds,
528             zfs_prop_to_name(ZFS_PROP_SNAPDIR), snapdir_changed_cb, zfsvfs);
529         error = error ? error : dsl_prop_register(ds,
530             zfs_prop_to_name(ZFS_PROP_ACLMODE), acl_mode_changed_cb, zfsvfs);
531         error = error ? error : dsl_prop_register(ds,
532             zfs_prop_to_name(ZFS_PROP_ACLINHERIT), acl_inherit_changed_cb,
533             zfsvfs);
534         error = error ? error : dsl_prop_register(ds,
535             zfs_prop_to_name(ZFS_PROP_VSCAN), vscan_changed_cb, zfsvfs);
536         dsl_pool_config_exit(dmu_objset_pool(os), FTAG);
537         if (error)
538                 goto unregister;
539
540         /*
541          * Invoke our callbacks to restore temporary mount options.
542          */
543         if (do_readonly)
544                 readonly_changed_cb(zfsvfs, readonly);
545         if (do_setuid)
546                 setuid_changed_cb(zfsvfs, setuid);
547         if (do_exec)
548                 exec_changed_cb(zfsvfs, exec);
549         if (do_xattr)
550                 xattr_changed_cb(zfsvfs, xattr);
551         if (do_atime)
552                 atime_changed_cb(zfsvfs, atime);
553
554         nbmand_changed_cb(zfsvfs, nbmand);
555
556         return (0);
557
558 unregister:
559         dsl_prop_unregister_all(ds, zfsvfs);
560         return (error);
561 }
562
563 static int
564 zfs_space_delta_cb(dmu_object_type_t bonustype, void *data,
565     uint64_t *userp, uint64_t *groupp)
566 {
567         /*
568          * Is it a valid type of object to track?
569          */
570         if (bonustype != DMU_OT_ZNODE && bonustype != DMU_OT_SA)
571                 return (SET_ERROR(ENOENT));
572
573         /*
574          * If we have a NULL data pointer
575          * then assume the id's aren't changing and
576          * return EEXIST to the dmu to let it know to
577          * use the same ids
578          */
579         if (data == NULL)
580                 return (SET_ERROR(EEXIST));
581
582         if (bonustype == DMU_OT_ZNODE) {
583                 znode_phys_t *znp = data;
584                 *userp = znp->zp_uid;
585                 *groupp = znp->zp_gid;
586         } else {
587                 int hdrsize;
588                 sa_hdr_phys_t *sap = data;
589                 sa_hdr_phys_t sa = *sap;
590                 boolean_t swap = B_FALSE;
591
592                 ASSERT(bonustype == DMU_OT_SA);
593
594                 if (sa.sa_magic == 0) {
595                         /*
596                          * This should only happen for newly created
597                          * files that haven't had the znode data filled
598                          * in yet.
599                          */
600                         *userp = 0;
601                         *groupp = 0;
602                         return (0);
603                 }
604                 if (sa.sa_magic == BSWAP_32(SA_MAGIC)) {
605                         sa.sa_magic = SA_MAGIC;
606                         sa.sa_layout_info = BSWAP_16(sa.sa_layout_info);
607                         swap = B_TRUE;
608                 } else {
609                         VERIFY3U(sa.sa_magic, ==, SA_MAGIC);
610                 }
611
612                 hdrsize = sa_hdrsize(&sa);
613                 VERIFY3U(hdrsize, >=, sizeof (sa_hdr_phys_t));
614                 *userp = *((uint64_t *)((uintptr_t)data + hdrsize +
615                     SA_UID_OFFSET));
616                 *groupp = *((uint64_t *)((uintptr_t)data + hdrsize +
617                     SA_GID_OFFSET));
618                 if (swap) {
619                         *userp = BSWAP_64(*userp);
620                         *groupp = BSWAP_64(*groupp);
621                 }
622         }
623         return (0);
624 }
625
626 static void
627 fuidstr_to_sid(zfsvfs_t *zfsvfs, const char *fuidstr,
628     char *domainbuf, int buflen, uid_t *ridp)
629 {
630         uint64_t fuid;
631         const char *domain;
632
633         fuid = strtonum(fuidstr, NULL);
634
635         domain = zfs_fuid_find_by_idx(zfsvfs, FUID_INDEX(fuid));
636         if (domain)
637                 (void) strlcpy(domainbuf, domain, buflen);
638         else
639                 domainbuf[0] = '\0';
640         *ridp = FUID_RID(fuid);
641 }
642
643 static uint64_t
644 zfs_userquota_prop_to_obj(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type)
645 {
646         switch (type) {
647         case ZFS_PROP_USERUSED:
648                 return (DMU_USERUSED_OBJECT);
649         case ZFS_PROP_GROUPUSED:
650                 return (DMU_GROUPUSED_OBJECT);
651         case ZFS_PROP_USERQUOTA:
652                 return (zfsvfs->z_userquota_obj);
653         case ZFS_PROP_GROUPQUOTA:
654                 return (zfsvfs->z_groupquota_obj);
655         }
656         return (0);
657 }
658
659 int
660 zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
661     uint64_t *cookiep, void *vbuf, uint64_t *bufsizep)
662 {
663         int error;
664         zap_cursor_t zc;
665         zap_attribute_t za;
666         zfs_useracct_t *buf = vbuf;
667         uint64_t obj;
668
669         if (!dmu_objset_userspace_present(zfsvfs->z_os))
670                 return (SET_ERROR(ENOTSUP));
671
672         obj = zfs_userquota_prop_to_obj(zfsvfs, type);
673         if (obj == 0) {
674                 *bufsizep = 0;
675                 return (0);
676         }
677
678         for (zap_cursor_init_serialized(&zc, zfsvfs->z_os, obj, *cookiep);
679             (error = zap_cursor_retrieve(&zc, &za)) == 0;
680             zap_cursor_advance(&zc)) {
681                 if ((uintptr_t)buf - (uintptr_t)vbuf + sizeof (zfs_useracct_t) >
682                     *bufsizep)
683                         break;
684
685                 fuidstr_to_sid(zfsvfs, za.za_name,
686                     buf->zu_domain, sizeof (buf->zu_domain), &buf->zu_rid);
687
688                 buf->zu_space = za.za_first_integer;
689                 buf++;
690         }
691         if (error == ENOENT)
692                 error = 0;
693
694         ASSERT3U((uintptr_t)buf - (uintptr_t)vbuf, <=, *bufsizep);
695         *bufsizep = (uintptr_t)buf - (uintptr_t)vbuf;
696         *cookiep = zap_cursor_serialize(&zc);
697         zap_cursor_fini(&zc);
698         return (error);
699 }
700
701 /*
702  * buf must be big enough (eg, 32 bytes)
703  */
704 static int
705 id_to_fuidstr(zfsvfs_t *zfsvfs, const char *domain, uid_t rid,
706     char *buf, boolean_t addok)
707 {
708         uint64_t fuid;
709         int domainid = 0;
710
711         if (domain && domain[0]) {
712                 domainid = zfs_fuid_find_by_domain(zfsvfs, domain, NULL, addok);
713                 if (domainid == -1)
714                         return (SET_ERROR(ENOENT));
715         }
716         fuid = FUID_ENCODE(domainid, rid);
717         (void) sprintf(buf, "%llx", (longlong_t)fuid);
718         return (0);
719 }
720
721 int
722 zfs_userspace_one(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
723     const char *domain, uint64_t rid, uint64_t *valp)
724 {
725         char buf[32];
726         int err;
727         uint64_t obj;
728
729         *valp = 0;
730
731         if (!dmu_objset_userspace_present(zfsvfs->z_os))
732                 return (SET_ERROR(ENOTSUP));
733
734         obj = zfs_userquota_prop_to_obj(zfsvfs, type);
735         if (obj == 0)
736                 return (0);
737
738         err = id_to_fuidstr(zfsvfs, domain, rid, buf, B_FALSE);
739         if (err)
740                 return (err);
741
742         err = zap_lookup(zfsvfs->z_os, obj, buf, 8, 1, valp);
743         if (err == ENOENT)
744                 err = 0;
745         return (err);
746 }
747
748 int
749 zfs_set_userquota(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
750     const char *domain, uint64_t rid, uint64_t quota)
751 {
752         char buf[32];
753         int err;
754         dmu_tx_t *tx;
755         uint64_t *objp;
756         boolean_t fuid_dirtied;
757
758         if (type != ZFS_PROP_USERQUOTA && type != ZFS_PROP_GROUPQUOTA)
759                 return (SET_ERROR(EINVAL));
760
761         if (zfsvfs->z_version < ZPL_VERSION_USERSPACE)
762                 return (SET_ERROR(ENOTSUP));
763
764         objp = (type == ZFS_PROP_USERQUOTA) ? &zfsvfs->z_userquota_obj :
765             &zfsvfs->z_groupquota_obj;
766
767         err = id_to_fuidstr(zfsvfs, domain, rid, buf, B_TRUE);
768         if (err)
769                 return (err);
770         fuid_dirtied = zfsvfs->z_fuid_dirty;
771
772         tx = dmu_tx_create(zfsvfs->z_os);
773         dmu_tx_hold_zap(tx, *objp ? *objp : DMU_NEW_OBJECT, B_TRUE, NULL);
774         if (*objp == 0) {
775                 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE,
776                     zfs_userquota_prop_prefixes[type]);
777         }
778         if (fuid_dirtied)
779                 zfs_fuid_txhold(zfsvfs, tx);
780         err = dmu_tx_assign(tx, TXG_WAIT);
781         if (err) {
782                 dmu_tx_abort(tx);
783                 return (err);
784         }
785
786         mutex_enter(&zfsvfs->z_lock);
787         if (*objp == 0) {
788                 *objp = zap_create(zfsvfs->z_os, DMU_OT_USERGROUP_QUOTA,
789                     DMU_OT_NONE, 0, tx);
790                 VERIFY(0 == zap_add(zfsvfs->z_os, MASTER_NODE_OBJ,
791                     zfs_userquota_prop_prefixes[type], 8, 1, objp, tx));
792         }
793         mutex_exit(&zfsvfs->z_lock);
794
795         if (quota == 0) {
796                 err = zap_remove(zfsvfs->z_os, *objp, buf, tx);
797                 if (err == ENOENT)
798                         err = 0;
799         } else {
800                 err = zap_update(zfsvfs->z_os, *objp, buf, 8, 1, &quota, tx);
801         }
802         ASSERT(err == 0);
803         if (fuid_dirtied)
804                 zfs_fuid_sync(zfsvfs, tx);
805         dmu_tx_commit(tx);
806         return (err);
807 }
808
809 boolean_t
810 zfs_fuid_overquota(zfsvfs_t *zfsvfs, boolean_t isgroup, uint64_t fuid)
811 {
812         char buf[32];
813         uint64_t used, quota, usedobj, quotaobj;
814         int err;
815
816         usedobj = isgroup ? DMU_GROUPUSED_OBJECT : DMU_USERUSED_OBJECT;
817         quotaobj = isgroup ? zfsvfs->z_groupquota_obj : zfsvfs->z_userquota_obj;
818
819         if (quotaobj == 0 || zfsvfs->z_replay)
820                 return (B_FALSE);
821
822         (void) sprintf(buf, "%llx", (longlong_t)fuid);
823         err = zap_lookup(zfsvfs->z_os, quotaobj, buf, 8, 1, &quota);
824         if (err != 0)
825                 return (B_FALSE);
826
827         err = zap_lookup(zfsvfs->z_os, usedobj, buf, 8, 1, &used);
828         if (err != 0)
829                 return (B_FALSE);
830         return (used >= quota);
831 }
832
833 boolean_t
834 zfs_owner_overquota(zfsvfs_t *zfsvfs, znode_t *zp, boolean_t isgroup)
835 {
836         uint64_t fuid;
837         uint64_t quotaobj;
838
839         quotaobj = isgroup ? zfsvfs->z_groupquota_obj : zfsvfs->z_userquota_obj;
840
841         fuid = isgroup ? zp->z_gid : zp->z_uid;
842
843         if (quotaobj == 0 || zfsvfs->z_replay)
844                 return (B_FALSE);
845
846         return (zfs_fuid_overquota(zfsvfs, isgroup, fuid));
847 }
848
849 /*
850  * Associate this zfsvfs with the given objset, which must be owned.
851  * This will cache a bunch of on-disk state from the objset in the
852  * zfsvfs.
853  */
854 static int
855 zfsvfs_init(zfsvfs_t *zfsvfs, objset_t *os)
856 {
857         int error;
858         uint64_t val;
859
860         zfsvfs->z_max_blksz = SPA_OLD_MAXBLOCKSIZE;
861         zfsvfs->z_show_ctldir = ZFS_SNAPDIR_VISIBLE;
862         zfsvfs->z_os = os;
863
864         error = zfs_get_zplprop(os, ZFS_PROP_VERSION, &zfsvfs->z_version);
865         if (error != 0)
866                 return (error);
867         if (zfsvfs->z_version >
868             zfs_zpl_version_map(spa_version(dmu_objset_spa(os)))) {
869                 (void) printf("Can't mount a version %lld file system "
870                     "on a version %lld pool\n. Pool must be upgraded to mount "
871                     "this file system.", (u_longlong_t)zfsvfs->z_version,
872                     (u_longlong_t)spa_version(dmu_objset_spa(os)));
873                 return (SET_ERROR(ENOTSUP));
874         }
875         error = zfs_get_zplprop(os, ZFS_PROP_NORMALIZE, &val);
876         if (error != 0)
877                 return (error);
878         zfsvfs->z_norm = (int)val;
879
880         error = zfs_get_zplprop(os, ZFS_PROP_UTF8ONLY, &val);
881         if (error != 0)
882                 return (error);
883         zfsvfs->z_utf8 = (val != 0);
884
885         error = zfs_get_zplprop(os, ZFS_PROP_CASE, &val);
886         if (error != 0)
887                 return (error);
888         zfsvfs->z_case = (uint_t)val;
889
890         /*
891          * Fold case on file systems that are always or sometimes case
892          * insensitive.
893          */
894         if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE ||
895             zfsvfs->z_case == ZFS_CASE_MIXED)
896                 zfsvfs->z_norm |= U8_TEXTPREP_TOUPPER;
897
898         zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os);
899         zfsvfs->z_use_sa = USE_SA(zfsvfs->z_version, zfsvfs->z_os);
900
901         uint64_t sa_obj = 0;
902         if (zfsvfs->z_use_sa) {
903                 /* should either have both of these objects or none */
904                 error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_SA_ATTRS, 8, 1,
905                     &sa_obj);
906                 if (error != 0)
907                         return (error);
908         }
909
910         error = sa_setup(os, sa_obj, zfs_attr_table, ZPL_END,
911             &zfsvfs->z_attr_table);
912         if (error != 0)
913                 return (error);
914
915         if (zfsvfs->z_version >= ZPL_VERSION_SA)
916                 sa_register_update_callback(os, zfs_sa_upgrade);
917
918         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_ROOT_OBJ, 8, 1,
919             &zfsvfs->z_root);
920         if (error != 0)
921                 return (error);
922         ASSERT(zfsvfs->z_root != 0);
923
924         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_UNLINKED_SET, 8, 1,
925             &zfsvfs->z_unlinkedobj);
926         if (error != 0)
927                 return (error);
928
929         error = zap_lookup(os, MASTER_NODE_OBJ,
930             zfs_userquota_prop_prefixes[ZFS_PROP_USERQUOTA],
931             8, 1, &zfsvfs->z_userquota_obj);
932         if (error == ENOENT)
933                 zfsvfs->z_userquota_obj = 0;
934         else if (error != 0)
935                 return (error);
936
937         error = zap_lookup(os, MASTER_NODE_OBJ,
938             zfs_userquota_prop_prefixes[ZFS_PROP_GROUPQUOTA],
939             8, 1, &zfsvfs->z_groupquota_obj);
940         if (error == ENOENT)
941                 zfsvfs->z_groupquota_obj = 0;
942         else if (error != 0)
943                 return (error);
944
945         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_FUID_TABLES, 8, 1,
946             &zfsvfs->z_fuid_obj);
947         if (error == ENOENT)
948                 zfsvfs->z_fuid_obj = 0;
949         else if (error != 0)
950                 return (error);
951
952         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_SHARES_DIR, 8, 1,
953             &zfsvfs->z_shares_dir);
954         if (error == ENOENT)
955                 zfsvfs->z_shares_dir = 0;
956         else if (error != 0)
957                 return (error);
958
959         /*
960          * Only use the name cache if we are looking for a
961          * name on a file system that does not require normalization
962          * or case folding.  We can also look there if we happen to be
963          * on a non-normalizing, mixed sensitivity file system IF we
964          * are looking for the exact name (which is always the case on
965          * FreeBSD).
966          */
967         zfsvfs->z_use_namecache = !zfsvfs->z_norm ||
968             ((zfsvfs->z_case == ZFS_CASE_MIXED) &&
969             !(zfsvfs->z_norm & ~U8_TEXTPREP_TOUPPER));
970
971         return (0);
972 }
973
974 int
975 zfsvfs_create(const char *osname, zfsvfs_t **zfvp)
976 {
977         objset_t *os;
978         zfsvfs_t *zfsvfs;
979         int error;
980
981         /*
982          * XXX: Fix struct statfs so this isn't necessary!
983          *
984          * The 'osname' is used as the filesystem's special node, which means
985          * it must fit in statfs.f_mntfromname, or else it can't be
986          * enumerated, so libzfs_mnttab_find() returns NULL, which causes
987          * 'zfs unmount' to think it's not mounted when it is.
988          */
989         if (strlen(osname) >= MNAMELEN)
990                 return (SET_ERROR(ENAMETOOLONG));
991
992         zfsvfs = kmem_zalloc(sizeof (zfsvfs_t), KM_SLEEP);
993
994         /*
995          * We claim to always be readonly so we can open snapshots;
996          * other ZPL code will prevent us from writing to snapshots.
997          */
998         error = dmu_objset_own(osname, DMU_OST_ZFS, B_TRUE, zfsvfs, &os);
999         if (error) {
1000                 kmem_free(zfsvfs, sizeof (zfsvfs_t));
1001                 return (error);
1002         }
1003
1004         zfsvfs->z_vfs = NULL;
1005         zfsvfs->z_parent = zfsvfs;
1006
1007         mutex_init(&zfsvfs->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL);
1008         mutex_init(&zfsvfs->z_lock, NULL, MUTEX_DEFAULT, NULL);
1009         list_create(&zfsvfs->z_all_znodes, sizeof (znode_t),
1010             offsetof(znode_t, z_link_node));
1011 #ifdef DIAGNOSTIC
1012         rrm_init(&zfsvfs->z_teardown_lock, B_TRUE);
1013 #else
1014         rrm_init(&zfsvfs->z_teardown_lock, B_FALSE);
1015 #endif
1016         rw_init(&zfsvfs->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL);
1017         rw_init(&zfsvfs->z_fuid_lock, NULL, RW_DEFAULT, NULL);
1018         for (int i = 0; i != ZFS_OBJ_MTX_SZ; i++)
1019                 mutex_init(&zfsvfs->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
1020
1021         error = zfsvfs_init(zfsvfs, os);
1022         if (error != 0) {
1023                 dmu_objset_disown(os, zfsvfs);
1024                 *zfvp = NULL;
1025                 kmem_free(zfsvfs, sizeof (zfsvfs_t));
1026                 return (error);
1027         }
1028
1029         *zfvp = zfsvfs;
1030         return (0);
1031 }
1032
1033 static int
1034 zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
1035 {
1036         int error;
1037
1038         error = zfs_register_callbacks(zfsvfs->z_vfs);
1039         if (error)
1040                 return (error);
1041
1042         zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
1043
1044         /*
1045          * If we are not mounting (ie: online recv), then we don't
1046          * have to worry about replaying the log as we blocked all
1047          * operations out since we closed the ZIL.
1048          */
1049         if (mounting) {
1050                 boolean_t readonly;
1051
1052                 /*
1053                  * During replay we remove the read only flag to
1054                  * allow replays to succeed.
1055                  */
1056                 readonly = zfsvfs->z_vfs->vfs_flag & VFS_RDONLY;
1057                 if (readonly != 0)
1058                         zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY;
1059                 else
1060                         zfs_unlinked_drain(zfsvfs);
1061
1062                 /*
1063                  * Parse and replay the intent log.
1064                  *
1065                  * Because of ziltest, this must be done after
1066                  * zfs_unlinked_drain().  (Further note: ziltest
1067                  * doesn't use readonly mounts, where
1068                  * zfs_unlinked_drain() isn't called.)  This is because
1069                  * ziltest causes spa_sync() to think it's committed,
1070                  * but actually it is not, so the intent log contains
1071                  * many txg's worth of changes.
1072                  *
1073                  * In particular, if object N is in the unlinked set in
1074                  * the last txg to actually sync, then it could be
1075                  * actually freed in a later txg and then reallocated
1076                  * in a yet later txg.  This would write a "create
1077                  * object N" record to the intent log.  Normally, this
1078                  * would be fine because the spa_sync() would have
1079                  * written out the fact that object N is free, before
1080                  * we could write the "create object N" intent log
1081                  * record.
1082                  *
1083                  * But when we are in ziltest mode, we advance the "open
1084                  * txg" without actually spa_sync()-ing the changes to
1085                  * disk.  So we would see that object N is still
1086                  * allocated and in the unlinked set, and there is an
1087                  * intent log record saying to allocate it.
1088                  */
1089                 if (spa_writeable(dmu_objset_spa(zfsvfs->z_os))) {
1090                         if (zil_replay_disable) {
1091                                 zil_destroy(zfsvfs->z_log, B_FALSE);
1092                         } else {
1093                                 zfsvfs->z_replay = B_TRUE;
1094                                 zil_replay(zfsvfs->z_os, zfsvfs,
1095                                     zfs_replay_vector);
1096                                 zfsvfs->z_replay = B_FALSE;
1097                         }
1098                 }
1099                 zfsvfs->z_vfs->vfs_flag |= readonly; /* restore readonly bit */
1100         }
1101
1102         /*
1103          * Set the objset user_ptr to track its zfsvfs.
1104          */
1105         mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
1106         dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
1107         mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
1108
1109         return (0);
1110 }
1111
1112 extern krwlock_t zfsvfs_lock; /* in zfs_znode.c */
1113
1114 void
1115 zfsvfs_free(zfsvfs_t *zfsvfs)
1116 {
1117         int i;
1118
1119         /*
1120          * This is a barrier to prevent the filesystem from going away in
1121          * zfs_znode_move() until we can safely ensure that the filesystem is
1122          * not unmounted. We consider the filesystem valid before the barrier
1123          * and invalid after the barrier.
1124          */
1125         rw_enter(&zfsvfs_lock, RW_READER);
1126         rw_exit(&zfsvfs_lock);
1127
1128         zfs_fuid_destroy(zfsvfs);
1129
1130         mutex_destroy(&zfsvfs->z_znodes_lock);
1131         mutex_destroy(&zfsvfs->z_lock);
1132         list_destroy(&zfsvfs->z_all_znodes);
1133         rrm_destroy(&zfsvfs->z_teardown_lock);
1134         rw_destroy(&zfsvfs->z_teardown_inactive_lock);
1135         rw_destroy(&zfsvfs->z_fuid_lock);
1136         for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
1137                 mutex_destroy(&zfsvfs->z_hold_mtx[i]);
1138         kmem_free(zfsvfs, sizeof (zfsvfs_t));
1139 }
1140
1141 static void
1142 zfs_set_fuid_feature(zfsvfs_t *zfsvfs)
1143 {
1144         zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os);
1145         if (zfsvfs->z_vfs) {
1146                 if (zfsvfs->z_use_fuids) {
1147                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_XVATTR);
1148                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_SYSATTR_VIEWS);
1149                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACEMASKONACCESS);
1150                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACLONCREATE);
1151                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACCESS_FILTER);
1152                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_REPARSE);
1153                 } else {
1154                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_XVATTR);
1155                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_SYSATTR_VIEWS);
1156                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_ACEMASKONACCESS);
1157                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_ACLONCREATE);
1158                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_ACCESS_FILTER);
1159                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_REPARSE);
1160                 }
1161         }
1162         zfsvfs->z_use_sa = USE_SA(zfsvfs->z_version, zfsvfs->z_os);
1163 }
1164
1165 static int
1166 zfs_domount(vfs_t *vfsp, char *osname)
1167 {
1168         uint64_t recordsize, fsid_guid;
1169         int error = 0;
1170         zfsvfs_t *zfsvfs;
1171         vnode_t *vp;
1172
1173         ASSERT(vfsp);
1174         ASSERT(osname);
1175
1176         error = zfsvfs_create(osname, &zfsvfs);
1177         if (error)
1178                 return (error);
1179         zfsvfs->z_vfs = vfsp;
1180
1181 #ifdef illumos
1182         /* Initialize the generic filesystem structure. */
1183         vfsp->vfs_bcount = 0;
1184         vfsp->vfs_data = NULL;
1185
1186         if (zfs_create_unique_device(&mount_dev) == -1) {
1187                 error = SET_ERROR(ENODEV);
1188                 goto out;
1189         }
1190         ASSERT(vfs_devismounted(mount_dev) == 0);
1191 #endif
1192
1193         if (error = dsl_prop_get_integer(osname, "recordsize", &recordsize,
1194             NULL))
1195                 goto out;
1196         zfsvfs->z_vfs->vfs_bsize = SPA_MINBLOCKSIZE;
1197         zfsvfs->z_vfs->mnt_stat.f_iosize = recordsize;
1198
1199         vfsp->vfs_data = zfsvfs;
1200         vfsp->mnt_flag |= MNT_LOCAL;
1201         vfsp->mnt_kern_flag |= MNTK_LOOKUP_SHARED;
1202         vfsp->mnt_kern_flag |= MNTK_SHARED_WRITES;
1203         vfsp->mnt_kern_flag |= MNTK_EXTENDED_SHARED;
1204         vfsp->mnt_kern_flag |= MNTK_NO_IOPF;    /* vn_io_fault can be used */
1205
1206         /*
1207          * The fsid is 64 bits, composed of an 8-bit fs type, which
1208          * separates our fsid from any other filesystem types, and a
1209          * 56-bit objset unique ID.  The objset unique ID is unique to
1210          * all objsets open on this system, provided by unique_create().
1211          * The 8-bit fs type must be put in the low bits of fsid[1]
1212          * because that's where other Solaris filesystems put it.
1213          */
1214         fsid_guid = dmu_objset_fsid_guid(zfsvfs->z_os);
1215         ASSERT((fsid_guid & ~((1ULL<<56)-1)) == 0);
1216         vfsp->vfs_fsid.val[0] = fsid_guid;
1217         vfsp->vfs_fsid.val[1] = ((fsid_guid>>32) << 8) |
1218             vfsp->mnt_vfc->vfc_typenum & 0xFF;
1219
1220         /*
1221          * Set features for file system.
1222          */
1223         zfs_set_fuid_feature(zfsvfs);
1224         if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
1225                 vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS);
1226                 vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE);
1227                 vfs_set_feature(vfsp, VFSFT_NOCASESENSITIVE);
1228         } else if (zfsvfs->z_case == ZFS_CASE_MIXED) {
1229                 vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS);
1230                 vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE);
1231         }
1232         vfs_set_feature(vfsp, VFSFT_ZEROCOPY_SUPPORTED);
1233
1234         if (dmu_objset_is_snapshot(zfsvfs->z_os)) {
1235                 uint64_t pval;
1236
1237                 atime_changed_cb(zfsvfs, B_FALSE);
1238                 readonly_changed_cb(zfsvfs, B_TRUE);
1239                 if (error = dsl_prop_get_integer(osname, "xattr", &pval, NULL))
1240                         goto out;
1241                 xattr_changed_cb(zfsvfs, pval);
1242                 zfsvfs->z_issnap = B_TRUE;
1243                 zfsvfs->z_os->os_sync = ZFS_SYNC_DISABLED;
1244
1245                 mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
1246                 dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
1247                 mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
1248         } else {
1249                 error = zfsvfs_setup(zfsvfs, B_TRUE);
1250         }
1251
1252         vfs_mountedfrom(vfsp, osname);
1253
1254         if (!zfsvfs->z_issnap)
1255                 zfsctl_create(zfsvfs);
1256 out:
1257         if (error) {
1258                 dmu_objset_disown(zfsvfs->z_os, zfsvfs);
1259                 zfsvfs_free(zfsvfs);
1260         } else {
1261                 atomic_inc_32(&zfs_active_fs_count);
1262         }
1263
1264         return (error);
1265 }
1266
1267 void
1268 zfs_unregister_callbacks(zfsvfs_t *zfsvfs)
1269 {
1270         objset_t *os = zfsvfs->z_os;
1271
1272         if (!dmu_objset_is_snapshot(os))
1273                 dsl_prop_unregister_all(dmu_objset_ds(os), zfsvfs);
1274 }
1275
1276 #ifdef SECLABEL
1277 /*
1278  * Convert a decimal digit string to a uint64_t integer.
1279  */
1280 static int
1281 str_to_uint64(char *str, uint64_t *objnum)
1282 {
1283         uint64_t num = 0;
1284
1285         while (*str) {
1286                 if (*str < '0' || *str > '9')
1287                         return (SET_ERROR(EINVAL));
1288
1289                 num = num*10 + *str++ - '0';
1290         }
1291
1292         *objnum = num;
1293         return (0);
1294 }
1295
1296 /*
1297  * The boot path passed from the boot loader is in the form of
1298  * "rootpool-name/root-filesystem-object-number'. Convert this
1299  * string to a dataset name: "rootpool-name/root-filesystem-name".
1300  */
1301 static int
1302 zfs_parse_bootfs(char *bpath, char *outpath)
1303 {
1304         char *slashp;
1305         uint64_t objnum;
1306         int error;
1307
1308         if (*bpath == 0 || *bpath == '/')
1309                 return (SET_ERROR(EINVAL));
1310
1311         (void) strcpy(outpath, bpath);
1312
1313         slashp = strchr(bpath, '/');
1314
1315         /* if no '/', just return the pool name */
1316         if (slashp == NULL) {
1317                 return (0);
1318         }
1319
1320         /* if not a number, just return the root dataset name */
1321         if (str_to_uint64(slashp+1, &objnum)) {
1322                 return (0);
1323         }
1324
1325         *slashp = '\0';
1326         error = dsl_dsobj_to_dsname(bpath, objnum, outpath);
1327         *slashp = '/';
1328
1329         return (error);
1330 }
1331
1332 /*
1333  * Check that the hex label string is appropriate for the dataset being
1334  * mounted into the global_zone proper.
1335  *
1336  * Return an error if the hex label string is not default or
1337  * admin_low/admin_high.  For admin_low labels, the corresponding
1338  * dataset must be readonly.
1339  */
1340 int
1341 zfs_check_global_label(const char *dsname, const char *hexsl)
1342 {
1343         if (strcasecmp(hexsl, ZFS_MLSLABEL_DEFAULT) == 0)
1344                 return (0);
1345         if (strcasecmp(hexsl, ADMIN_HIGH) == 0)
1346                 return (0);
1347         if (strcasecmp(hexsl, ADMIN_LOW) == 0) {
1348                 /* must be readonly */
1349                 uint64_t rdonly;
1350
1351                 if (dsl_prop_get_integer(dsname,
1352                     zfs_prop_to_name(ZFS_PROP_READONLY), &rdonly, NULL))
1353                         return (SET_ERROR(EACCES));
1354                 return (rdonly ? 0 : EACCES);
1355         }
1356         return (SET_ERROR(EACCES));
1357 }
1358
1359 /*
1360  * Determine whether the mount is allowed according to MAC check.
1361  * by comparing (where appropriate) label of the dataset against
1362  * the label of the zone being mounted into.  If the dataset has
1363  * no label, create one.
1364  *
1365  * Returns 0 if access allowed, error otherwise (e.g. EACCES)
1366  */
1367 static int
1368 zfs_mount_label_policy(vfs_t *vfsp, char *osname)
1369 {
1370         int             error, retv;
1371         zone_t          *mntzone = NULL;
1372         ts_label_t      *mnt_tsl;
1373         bslabel_t       *mnt_sl;
1374         bslabel_t       ds_sl;
1375         char            ds_hexsl[MAXNAMELEN];
1376
1377         retv = EACCES;                          /* assume the worst */
1378
1379         /*
1380          * Start by getting the dataset label if it exists.
1381          */
1382         error = dsl_prop_get(osname, zfs_prop_to_name(ZFS_PROP_MLSLABEL),
1383             1, sizeof (ds_hexsl), &ds_hexsl, NULL);
1384         if (error)
1385                 return (SET_ERROR(EACCES));
1386
1387         /*
1388          * If labeling is NOT enabled, then disallow the mount of datasets
1389          * which have a non-default label already.  No other label checks
1390          * are needed.
1391          */
1392         if (!is_system_labeled()) {
1393                 if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0)
1394                         return (0);
1395                 return (SET_ERROR(EACCES));
1396         }
1397
1398         /*
1399          * Get the label of the mountpoint.  If mounting into the global
1400          * zone (i.e. mountpoint is not within an active zone and the
1401          * zoned property is off), the label must be default or
1402          * admin_low/admin_high only; no other checks are needed.
1403          */
1404         mntzone = zone_find_by_any_path(refstr_value(vfsp->vfs_mntpt), B_FALSE);
1405         if (mntzone->zone_id == GLOBAL_ZONEID) {
1406                 uint64_t zoned;
1407
1408                 zone_rele(mntzone);
1409
1410                 if (dsl_prop_get_integer(osname,
1411                     zfs_prop_to_name(ZFS_PROP_ZONED), &zoned, NULL))
1412                         return (SET_ERROR(EACCES));
1413                 if (!zoned)
1414                         return (zfs_check_global_label(osname, ds_hexsl));
1415                 else
1416                         /*
1417                          * This is the case of a zone dataset being mounted
1418                          * initially, before the zone has been fully created;
1419                          * allow this mount into global zone.
1420                          */
1421                         return (0);
1422         }
1423
1424         mnt_tsl = mntzone->zone_slabel;
1425         ASSERT(mnt_tsl != NULL);
1426         label_hold(mnt_tsl);
1427         mnt_sl = label2bslabel(mnt_tsl);
1428
1429         if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0) {
1430                 /*
1431                  * The dataset doesn't have a real label, so fabricate one.
1432                  */
1433                 char *str = NULL;
1434
1435                 if (l_to_str_internal(mnt_sl, &str) == 0 &&
1436                     dsl_prop_set_string(osname,
1437                     zfs_prop_to_name(ZFS_PROP_MLSLABEL),
1438                     ZPROP_SRC_LOCAL, str) == 0)
1439                         retv = 0;
1440                 if (str != NULL)
1441                         kmem_free(str, strlen(str) + 1);
1442         } else if (hexstr_to_label(ds_hexsl, &ds_sl) == 0) {
1443                 /*
1444                  * Now compare labels to complete the MAC check.  If the
1445                  * labels are equal then allow access.  If the mountpoint
1446                  * label dominates the dataset label, allow readonly access.
1447                  * Otherwise, access is denied.
1448                  */
1449                 if (blequal(mnt_sl, &ds_sl))
1450                         retv = 0;
1451                 else if (bldominates(mnt_sl, &ds_sl)) {
1452                         vfs_setmntopt(vfsp, MNTOPT_RO, NULL, 0);
1453                         retv = 0;
1454                 }
1455         }
1456
1457         label_rele(mnt_tsl);
1458         zone_rele(mntzone);
1459         return (retv);
1460 }
1461 #endif  /* SECLABEL */
1462
1463 #ifdef OPENSOLARIS_MOUNTROOT
1464 static int
1465 zfs_mountroot(vfs_t *vfsp, enum whymountroot why)
1466 {
1467         int error = 0;
1468         static int zfsrootdone = 0;
1469         zfsvfs_t *zfsvfs = NULL;
1470         znode_t *zp = NULL;
1471         vnode_t *vp = NULL;
1472         char *zfs_bootfs;
1473         char *zfs_devid;
1474
1475         ASSERT(vfsp);
1476
1477         /*
1478          * The filesystem that we mount as root is defined in the
1479          * boot property "zfs-bootfs" with a format of
1480          * "poolname/root-dataset-objnum".
1481          */
1482         if (why == ROOT_INIT) {
1483                 if (zfsrootdone++)
1484                         return (SET_ERROR(EBUSY));
1485                 /*
1486                  * the process of doing a spa_load will require the
1487                  * clock to be set before we could (for example) do
1488                  * something better by looking at the timestamp on
1489                  * an uberblock, so just set it to -1.
1490                  */
1491                 clkset(-1);
1492
1493                 if ((zfs_bootfs = spa_get_bootprop("zfs-bootfs")) == NULL) {
1494                         cmn_err(CE_NOTE, "spa_get_bootfs: can not get "
1495                             "bootfs name");
1496                         return (SET_ERROR(EINVAL));
1497                 }
1498                 zfs_devid = spa_get_bootprop("diskdevid");
1499                 error = spa_import_rootpool(rootfs.bo_name, zfs_devid);
1500                 if (zfs_devid)
1501                         spa_free_bootprop(zfs_devid);
1502                 if (error) {
1503                         spa_free_bootprop(zfs_bootfs);
1504                         cmn_err(CE_NOTE, "spa_import_rootpool: error %d",
1505                             error);
1506                         return (error);
1507                 }
1508                 if (error = zfs_parse_bootfs(zfs_bootfs, rootfs.bo_name)) {
1509                         spa_free_bootprop(zfs_bootfs);
1510                         cmn_err(CE_NOTE, "zfs_parse_bootfs: error %d",
1511                             error);
1512                         return (error);
1513                 }
1514
1515                 spa_free_bootprop(zfs_bootfs);
1516
1517                 if (error = vfs_lock(vfsp))
1518                         return (error);
1519
1520                 if (error = zfs_domount(vfsp, rootfs.bo_name)) {
1521                         cmn_err(CE_NOTE, "zfs_domount: error %d", error);
1522                         goto out;
1523                 }
1524
1525                 zfsvfs = (zfsvfs_t *)vfsp->vfs_data;
1526                 ASSERT(zfsvfs);
1527                 if (error = zfs_zget(zfsvfs, zfsvfs->z_root, &zp)) {
1528                         cmn_err(CE_NOTE, "zfs_zget: error %d", error);
1529                         goto out;
1530                 }
1531
1532                 vp = ZTOV(zp);
1533                 mutex_enter(&vp->v_lock);
1534                 vp->v_flag |= VROOT;
1535                 mutex_exit(&vp->v_lock);
1536                 rootvp = vp;
1537
1538                 /*
1539                  * Leave rootvp held.  The root file system is never unmounted.
1540                  */
1541
1542                 vfs_add((struct vnode *)0, vfsp,
1543                     (vfsp->vfs_flag & VFS_RDONLY) ? MS_RDONLY : 0);
1544 out:
1545                 vfs_unlock(vfsp);
1546                 return (error);
1547         } else if (why == ROOT_REMOUNT) {
1548                 readonly_changed_cb(vfsp->vfs_data, B_FALSE);
1549                 vfsp->vfs_flag |= VFS_REMOUNT;
1550
1551                 /* refresh mount options */
1552                 zfs_unregister_callbacks(vfsp->vfs_data);
1553                 return (zfs_register_callbacks(vfsp));
1554
1555         } else if (why == ROOT_UNMOUNT) {
1556                 zfs_unregister_callbacks((zfsvfs_t *)vfsp->vfs_data);
1557                 (void) zfs_sync(vfsp, 0, 0);
1558                 return (0);
1559         }
1560
1561         /*
1562          * if "why" is equal to anything else other than ROOT_INIT,
1563          * ROOT_REMOUNT, or ROOT_UNMOUNT, we do not support it.
1564          */
1565         return (SET_ERROR(ENOTSUP));
1566 }
1567 #endif  /* OPENSOLARIS_MOUNTROOT */
1568
1569 static int
1570 getpoolname(const char *osname, char *poolname)
1571 {
1572         char *p;
1573
1574         p = strchr(osname, '/');
1575         if (p == NULL) {
1576                 if (strlen(osname) >= MAXNAMELEN)
1577                         return (ENAMETOOLONG);
1578                 (void) strcpy(poolname, osname);
1579         } else {
1580                 if (p - osname >= MAXNAMELEN)
1581                         return (ENAMETOOLONG);
1582                 (void) strncpy(poolname, osname, p - osname);
1583                 poolname[p - osname] = '\0';
1584         }
1585         return (0);
1586 }
1587
1588 /*ARGSUSED*/
1589 static int
1590 zfs_mount(vfs_t *vfsp)
1591 {
1592         kthread_t       *td = curthread;
1593         vnode_t         *mvp = vfsp->mnt_vnodecovered;
1594         cred_t          *cr = td->td_ucred;
1595         char            *osname;
1596         int             error = 0;
1597         int             canwrite;
1598
1599 #ifdef illumos
1600         if (mvp->v_type != VDIR)
1601                 return (SET_ERROR(ENOTDIR));
1602
1603         mutex_enter(&mvp->v_lock);
1604         if ((uap->flags & MS_REMOUNT) == 0 &&
1605             (uap->flags & MS_OVERLAY) == 0 &&
1606             (mvp->v_count != 1 || (mvp->v_flag & VROOT))) {
1607                 mutex_exit(&mvp->v_lock);
1608                 return (SET_ERROR(EBUSY));
1609         }
1610         mutex_exit(&mvp->v_lock);
1611
1612         /*
1613          * ZFS does not support passing unparsed data in via MS_DATA.
1614          * Users should use the MS_OPTIONSTR interface; this means
1615          * that all option parsing is already done and the options struct
1616          * can be interrogated.
1617          */
1618         if ((uap->flags & MS_DATA) && uap->datalen > 0)
1619 #else   /* !illumos */
1620         if (!prison_allow(td->td_ucred, PR_ALLOW_MOUNT_ZFS))
1621                 return (SET_ERROR(EPERM));
1622
1623         if (vfs_getopt(vfsp->mnt_optnew, "from", (void **)&osname, NULL))
1624                 return (SET_ERROR(EINVAL));
1625 #endif  /* illumos */
1626
1627         /*
1628          * If full-owner-access is enabled and delegated administration is
1629          * turned on, we must set nosuid.
1630          */
1631         if (zfs_super_owner &&
1632             dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr) != ECANCELED) {
1633                 secpolicy_fs_mount_clearopts(cr, vfsp);
1634         }
1635
1636         /*
1637          * Check for mount privilege?
1638          *
1639          * If we don't have privilege then see if
1640          * we have local permission to allow it
1641          */
1642         error = secpolicy_fs_mount(cr, mvp, vfsp);
1643         if (error) {
1644                 if (dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr) != 0)
1645                         goto out;
1646
1647                 if (!(vfsp->vfs_flag & MS_REMOUNT)) {
1648                         vattr_t         vattr;
1649
1650                         /*
1651                          * Make sure user is the owner of the mount point
1652                          * or has sufficient privileges.
1653                          */
1654
1655                         vattr.va_mask = AT_UID;
1656
1657                         vn_lock(mvp, LK_SHARED | LK_RETRY);
1658                         if (VOP_GETATTR(mvp, &vattr, cr)) {
1659                                 VOP_UNLOCK(mvp, 0);
1660                                 goto out;
1661                         }
1662
1663                         if (secpolicy_vnode_owner(mvp, cr, vattr.va_uid) != 0 &&
1664                             VOP_ACCESS(mvp, VWRITE, cr, td) != 0) {
1665                                 VOP_UNLOCK(mvp, 0);
1666                                 goto out;
1667                         }
1668                         VOP_UNLOCK(mvp, 0);
1669                 }
1670
1671                 secpolicy_fs_mount_clearopts(cr, vfsp);
1672         }
1673
1674         /*
1675          * Refuse to mount a filesystem if we are in a local zone and the
1676          * dataset is not visible.
1677          */
1678         if (!INGLOBALZONE(curthread) &&
1679             (!zone_dataset_visible(osname, &canwrite) || !canwrite)) {
1680                 error = SET_ERROR(EPERM);
1681                 goto out;
1682         }
1683
1684 #ifdef SECLABEL
1685         error = zfs_mount_label_policy(vfsp, osname);
1686         if (error)
1687                 goto out;
1688 #endif
1689
1690         vfsp->vfs_flag |= MNT_NFS4ACLS;
1691
1692         /*
1693          * When doing a remount, we simply refresh our temporary properties
1694          * according to those options set in the current VFS options.
1695          */
1696         if (vfsp->vfs_flag & MS_REMOUNT) {
1697                 zfsvfs_t *zfsvfs = vfsp->vfs_data;
1698
1699                 /*
1700                  * Refresh mount options with z_teardown_lock blocking I/O while
1701                  * the filesystem is in an inconsistent state.
1702                  * The lock also serializes this code with filesystem
1703                  * manipulations between entry to zfs_suspend_fs() and return
1704                  * from zfs_resume_fs().
1705                  */
1706                 rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1707                 zfs_unregister_callbacks(zfsvfs);
1708                 error = zfs_register_callbacks(vfsp);
1709                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1710                 goto out;
1711         }
1712
1713         /* Initial root mount: try hard to import the requested root pool. */
1714         if ((vfsp->vfs_flag & MNT_ROOTFS) != 0 &&
1715             (vfsp->vfs_flag & MNT_UPDATE) == 0) {
1716                 char pname[MAXNAMELEN];
1717
1718                 error = getpoolname(osname, pname);
1719                 if (error == 0)
1720                         error = spa_import_rootpool(pname);
1721                 if (error)
1722                         goto out;
1723         }
1724         DROP_GIANT();
1725         error = zfs_domount(vfsp, osname);
1726         PICKUP_GIANT();
1727
1728 #ifdef illumos
1729         /*
1730          * Add an extra VFS_HOLD on our parent vfs so that it can't
1731          * disappear due to a forced unmount.
1732          */
1733         if (error == 0 && ((zfsvfs_t *)vfsp->vfs_data)->z_issnap)
1734                 VFS_HOLD(mvp->v_vfsp);
1735 #endif
1736
1737 out:
1738         return (error);
1739 }
1740
1741 static int
1742 zfs_statfs(vfs_t *vfsp, struct statfs *statp)
1743 {
1744         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1745         uint64_t refdbytes, availbytes, usedobjs, availobjs;
1746
1747         statp->f_version = STATFS_VERSION;
1748
1749         ZFS_ENTER(zfsvfs);
1750
1751         dmu_objset_space(zfsvfs->z_os,
1752             &refdbytes, &availbytes, &usedobjs, &availobjs);
1753
1754         /*
1755          * The underlying storage pool actually uses multiple block sizes.
1756          * We report the fragsize as the smallest block size we support,
1757          * and we report our blocksize as the filesystem's maximum blocksize.
1758          */
1759         statp->f_bsize = SPA_MINBLOCKSIZE;
1760         statp->f_iosize = zfsvfs->z_vfs->mnt_stat.f_iosize;
1761
1762         /*
1763          * The following report "total" blocks of various kinds in the
1764          * file system, but reported in terms of f_frsize - the
1765          * "fragment" size.
1766          */
1767
1768         statp->f_blocks = (refdbytes + availbytes) >> SPA_MINBLOCKSHIFT;
1769         statp->f_bfree = availbytes / statp->f_bsize;
1770         statp->f_bavail = statp->f_bfree; /* no root reservation */
1771
1772         /*
1773          * statvfs() should really be called statufs(), because it assumes
1774          * static metadata.  ZFS doesn't preallocate files, so the best
1775          * we can do is report the max that could possibly fit in f_files,
1776          * and that minus the number actually used in f_ffree.
1777          * For f_ffree, report the smaller of the number of object available
1778          * and the number of blocks (each object will take at least a block).
1779          */
1780         statp->f_ffree = MIN(availobjs, statp->f_bfree);
1781         statp->f_files = statp->f_ffree + usedobjs;
1782
1783         /*
1784          * We're a zfs filesystem.
1785          */
1786         (void) strlcpy(statp->f_fstypename, "zfs", sizeof(statp->f_fstypename));
1787
1788         strlcpy(statp->f_mntfromname, vfsp->mnt_stat.f_mntfromname,
1789             sizeof(statp->f_mntfromname));
1790         strlcpy(statp->f_mntonname, vfsp->mnt_stat.f_mntonname,
1791             sizeof(statp->f_mntonname));
1792
1793         statp->f_namemax = MAXNAMELEN - 1;
1794
1795         ZFS_EXIT(zfsvfs);
1796         return (0);
1797 }
1798
1799 static int
1800 zfs_root(vfs_t *vfsp, int flags, vnode_t **vpp)
1801 {
1802         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1803         znode_t *rootzp;
1804         int error;
1805
1806         ZFS_ENTER(zfsvfs);
1807
1808         error = zfs_zget(zfsvfs, zfsvfs->z_root, &rootzp);
1809         if (error == 0)
1810                 *vpp = ZTOV(rootzp);
1811
1812         ZFS_EXIT(zfsvfs);
1813
1814         if (error == 0) {
1815                 error = vn_lock(*vpp, flags);
1816                 if (error != 0) {
1817                         VN_RELE(*vpp);
1818                         *vpp = NULL;
1819                 }
1820         }
1821         return (error);
1822 }
1823
1824 /*
1825  * Teardown the zfsvfs::z_os.
1826  *
1827  * Note, if 'unmounting' if FALSE, we return with the 'z_teardown_lock'
1828  * and 'z_teardown_inactive_lock' held.
1829  */
1830 static int
1831 zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting)
1832 {
1833         znode_t *zp;
1834
1835         rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1836
1837         if (!unmounting) {
1838                 /*
1839                  * We purge the parent filesystem's vfsp as the parent
1840                  * filesystem and all of its snapshots have their vnode's
1841                  * v_vfsp set to the parent's filesystem's vfsp.  Note,
1842                  * 'z_parent' is self referential for non-snapshots.
1843                  */
1844                 (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
1845 #ifdef FREEBSD_NAMECACHE
1846                 cache_purgevfs(zfsvfs->z_parent->z_vfs, true);
1847 #endif
1848         }
1849
1850         /*
1851          * Close the zil. NB: Can't close the zil while zfs_inactive
1852          * threads are blocked as zil_close can call zfs_inactive.
1853          */
1854         if (zfsvfs->z_log) {
1855                 zil_close(zfsvfs->z_log);
1856                 zfsvfs->z_log = NULL;
1857         }
1858
1859         rw_enter(&zfsvfs->z_teardown_inactive_lock, RW_WRITER);
1860
1861         /*
1862          * If we are not unmounting (ie: online recv) and someone already
1863          * unmounted this file system while we were doing the switcheroo,
1864          * or a reopen of z_os failed then just bail out now.
1865          */
1866         if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
1867                 rw_exit(&zfsvfs->z_teardown_inactive_lock);
1868                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1869                 return (SET_ERROR(EIO));
1870         }
1871
1872         /*
1873          * At this point there are no vops active, and any new vops will
1874          * fail with EIO since we have z_teardown_lock for writer (only
1875          * relavent for forced unmount).
1876          *
1877          * Release all holds on dbufs.
1878          */
1879         mutex_enter(&zfsvfs->z_znodes_lock);
1880         for (zp = list_head(&zfsvfs->z_all_znodes); zp != NULL;
1881             zp = list_next(&zfsvfs->z_all_znodes, zp))
1882                 if (zp->z_sa_hdl) {
1883                         ASSERT(ZTOV(zp)->v_count >= 0);
1884                         zfs_znode_dmu_fini(zp);
1885                 }
1886         mutex_exit(&zfsvfs->z_znodes_lock);
1887
1888         /*
1889          * If we are unmounting, set the unmounted flag and let new vops
1890          * unblock.  zfs_inactive will have the unmounted behavior, and all
1891          * other vops will fail with EIO.
1892          */
1893         if (unmounting) {
1894                 zfsvfs->z_unmounted = B_TRUE;
1895                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1896                 rw_exit(&zfsvfs->z_teardown_inactive_lock);
1897         }
1898
1899         /*
1900          * z_os will be NULL if there was an error in attempting to reopen
1901          * zfsvfs, so just return as the properties had already been
1902          * unregistered and cached data had been evicted before.
1903          */
1904         if (zfsvfs->z_os == NULL)
1905                 return (0);
1906
1907         /*
1908          * Unregister properties.
1909          */
1910         zfs_unregister_callbacks(zfsvfs);
1911
1912         /*
1913          * Evict cached data
1914          */
1915         if (dsl_dataset_is_dirty(dmu_objset_ds(zfsvfs->z_os)) &&
1916             !(zfsvfs->z_vfs->vfs_flag & VFS_RDONLY))
1917                 txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
1918         dmu_objset_evict_dbufs(zfsvfs->z_os);
1919
1920         return (0);
1921 }
1922
1923 /*ARGSUSED*/
1924 static int
1925 zfs_umount(vfs_t *vfsp, int fflag)
1926 {
1927         kthread_t *td = curthread;
1928         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1929         objset_t *os;
1930         cred_t *cr = td->td_ucred;
1931         int ret;
1932
1933         ret = secpolicy_fs_unmount(cr, vfsp);
1934         if (ret) {
1935                 if (dsl_deleg_access((char *)refstr_value(vfsp->vfs_resource),
1936                     ZFS_DELEG_PERM_MOUNT, cr))
1937                         return (ret);
1938         }
1939
1940         /*
1941          * We purge the parent filesystem's vfsp as the parent filesystem
1942          * and all of its snapshots have their vnode's v_vfsp set to the
1943          * parent's filesystem's vfsp.  Note, 'z_parent' is self
1944          * referential for non-snapshots.
1945          */
1946         (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
1947
1948         /*
1949          * Unmount any snapshots mounted under .zfs before unmounting the
1950          * dataset itself.
1951          */
1952         if (zfsvfs->z_ctldir != NULL) {
1953                 if ((ret = zfsctl_umount_snapshots(vfsp, fflag, cr)) != 0)
1954                         return (ret);
1955         }
1956
1957         if (fflag & MS_FORCE) {
1958                 /*
1959                  * Mark file system as unmounted before calling
1960                  * vflush(FORCECLOSE). This way we ensure no future vnops
1961                  * will be called and risk operating on DOOMED vnodes.
1962                  */
1963                 rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1964                 zfsvfs->z_unmounted = B_TRUE;
1965                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1966         }
1967
1968         /*
1969          * Flush all the files.
1970          */
1971         ret = vflush(vfsp, 0, (fflag & MS_FORCE) ? FORCECLOSE : 0, td);
1972         if (ret != 0)
1973                 return (ret);
1974
1975 #ifdef illumos
1976         if (!(fflag & MS_FORCE)) {
1977                 /*
1978                  * Check the number of active vnodes in the file system.
1979                  * Our count is maintained in the vfs structure, but the
1980                  * number is off by 1 to indicate a hold on the vfs
1981                  * structure itself.
1982                  *
1983                  * The '.zfs' directory maintains a reference of its
1984                  * own, and any active references underneath are
1985                  * reflected in the vnode count.
1986                  */
1987                 if (zfsvfs->z_ctldir == NULL) {
1988                         if (vfsp->vfs_count > 1)
1989                                 return (SET_ERROR(EBUSY));
1990                 } else {
1991                         if (vfsp->vfs_count > 2 ||
1992                             zfsvfs->z_ctldir->v_count > 1)
1993                                 return (SET_ERROR(EBUSY));
1994                 }
1995         }
1996 #endif
1997
1998         VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0);
1999         os = zfsvfs->z_os;
2000
2001         /*
2002          * z_os will be NULL if there was an error in
2003          * attempting to reopen zfsvfs.
2004          */
2005         if (os != NULL) {
2006                 /*
2007                  * Unset the objset user_ptr.
2008                  */
2009                 mutex_enter(&os->os_user_ptr_lock);
2010                 dmu_objset_set_user(os, NULL);
2011                 mutex_exit(&os->os_user_ptr_lock);
2012
2013                 /*
2014                  * Finally release the objset
2015                  */
2016                 dmu_objset_disown(os, zfsvfs);
2017         }
2018
2019         /*
2020          * We can now safely destroy the '.zfs' directory node.
2021          */
2022         if (zfsvfs->z_ctldir != NULL)
2023                 zfsctl_destroy(zfsvfs);
2024         zfs_freevfs(vfsp);
2025
2026         return (0);
2027 }
2028
2029 static int
2030 zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp)
2031 {
2032         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2033         znode_t         *zp;
2034         int             err;
2035
2036         /*
2037          * zfs_zget() can't operate on virtual entries like .zfs/ or
2038          * .zfs/snapshot/ directories, that's why we return EOPNOTSUPP.
2039          * This will make NFS to switch to LOOKUP instead of using VGET.
2040          */
2041         if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR ||
2042             (zfsvfs->z_shares_dir != 0 && ino == zfsvfs->z_shares_dir))
2043                 return (EOPNOTSUPP);
2044
2045         ZFS_ENTER(zfsvfs);
2046         err = zfs_zget(zfsvfs, ino, &zp);
2047         if (err == 0 && zp->z_unlinked) {
2048                 vrele(ZTOV(zp));
2049                 err = EINVAL;
2050         }
2051         if (err == 0)
2052                 *vpp = ZTOV(zp);
2053         ZFS_EXIT(zfsvfs);
2054         if (err == 0)
2055                 err = vn_lock(*vpp, flags);
2056         if (err != 0)
2057                 *vpp = NULL;
2058         return (err);
2059 }
2060
2061 static int
2062 zfs_checkexp(vfs_t *vfsp, struct sockaddr *nam, int *extflagsp,
2063     struct ucred **credanonp, int *numsecflavors, int **secflavors)
2064 {
2065         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2066
2067         /*
2068          * If this is regular file system vfsp is the same as
2069          * zfsvfs->z_parent->z_vfs, but if it is snapshot,
2070          * zfsvfs->z_parent->z_vfs represents parent file system
2071          * which we have to use here, because only this file system
2072          * has mnt_export configured.
2073          */
2074         return (vfs_stdcheckexp(zfsvfs->z_parent->z_vfs, nam, extflagsp,
2075             credanonp, numsecflavors, secflavors));
2076 }
2077
2078 CTASSERT(SHORT_FID_LEN <= sizeof(struct fid));
2079 CTASSERT(LONG_FID_LEN <= sizeof(struct fid));
2080
2081 static int
2082 zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
2083 {
2084         struct componentname cn;
2085         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2086         znode_t         *zp;
2087         vnode_t         *dvp;
2088         uint64_t        object = 0;
2089         uint64_t        fid_gen = 0;
2090         uint64_t        gen_mask;
2091         uint64_t        zp_gen;
2092         int             i, err;
2093
2094         *vpp = NULL;
2095
2096         ZFS_ENTER(zfsvfs);
2097
2098         /*
2099          * On FreeBSD we can get snapshot's mount point or its parent file
2100          * system mount point depending if snapshot is already mounted or not.
2101          */
2102         if (zfsvfs->z_parent == zfsvfs && fidp->fid_len == LONG_FID_LEN) {
2103                 zfid_long_t     *zlfid = (zfid_long_t *)fidp;
2104                 uint64_t        objsetid = 0;
2105                 uint64_t        setgen = 0;
2106
2107                 for (i = 0; i < sizeof (zlfid->zf_setid); i++)
2108                         objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
2109
2110                 for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
2111                         setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i);
2112
2113                 ZFS_EXIT(zfsvfs);
2114
2115                 err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs);
2116                 if (err)
2117                         return (SET_ERROR(EINVAL));
2118                 ZFS_ENTER(zfsvfs);
2119         }
2120
2121         if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) {
2122                 zfid_short_t    *zfid = (zfid_short_t *)fidp;
2123
2124                 for (i = 0; i < sizeof (zfid->zf_object); i++)
2125                         object |= ((uint64_t)zfid->zf_object[i]) << (8 * i);
2126
2127                 for (i = 0; i < sizeof (zfid->zf_gen); i++)
2128                         fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i);
2129         } else {
2130                 ZFS_EXIT(zfsvfs);
2131                 return (SET_ERROR(EINVAL));
2132         }
2133
2134         /*
2135          * A zero fid_gen means we are in .zfs or the .zfs/snapshot
2136          * directory tree. If the object == zfsvfs->z_shares_dir, then
2137          * we are in the .zfs/shares directory tree.
2138          */
2139         if ((fid_gen == 0 &&
2140              (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) ||
2141             (zfsvfs->z_shares_dir != 0 && object == zfsvfs->z_shares_dir)) {
2142                 ZFS_EXIT(zfsvfs);
2143                 VERIFY0(zfsctl_root(zfsvfs, LK_SHARED, &dvp));
2144                 if (object == ZFSCTL_INO_SNAPDIR) {
2145                         cn.cn_nameptr = "snapshot";
2146                         cn.cn_namelen = strlen(cn.cn_nameptr);
2147                         cn.cn_nameiop = LOOKUP;
2148                         cn.cn_flags = ISLASTCN | LOCKLEAF;
2149                         cn.cn_lkflags = flags;
2150                         VERIFY0(VOP_LOOKUP(dvp, vpp, &cn));
2151                         vput(dvp);
2152                 } else if (object == zfsvfs->z_shares_dir) {
2153                         /*
2154                          * XXX This branch must not be taken,
2155                          * if it is, then the lookup below will
2156                          * explode.
2157                          */
2158                         cn.cn_nameptr = "shares";
2159                         cn.cn_namelen = strlen(cn.cn_nameptr);
2160                         cn.cn_nameiop = LOOKUP;
2161                         cn.cn_flags = ISLASTCN;
2162                         cn.cn_lkflags = flags;
2163                         VERIFY0(VOP_LOOKUP(dvp, vpp, &cn));
2164                         vput(dvp);
2165                 } else {
2166                         *vpp = dvp;
2167                 }
2168                 return (err);
2169         }
2170
2171         gen_mask = -1ULL >> (64 - 8 * i);
2172
2173         dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask);
2174         if (err = zfs_zget(zfsvfs, object, &zp)) {
2175                 ZFS_EXIT(zfsvfs);
2176                 return (err);
2177         }
2178         (void) sa_lookup(zp->z_sa_hdl, SA_ZPL_GEN(zfsvfs), &zp_gen,
2179             sizeof (uint64_t));
2180         zp_gen = zp_gen & gen_mask;
2181         if (zp_gen == 0)
2182                 zp_gen = 1;
2183         if (zp->z_unlinked || zp_gen != fid_gen) {
2184                 dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen);
2185                 vrele(ZTOV(zp));
2186                 ZFS_EXIT(zfsvfs);
2187                 return (SET_ERROR(EINVAL));
2188         }
2189
2190         *vpp = ZTOV(zp);
2191         ZFS_EXIT(zfsvfs);
2192         err = vn_lock(*vpp, flags);
2193         if (err == 0)
2194                 vnode_create_vobject(*vpp, zp->z_size, curthread);
2195         else
2196                 *vpp = NULL;
2197         return (err);
2198 }
2199
2200 /*
2201  * Block out VOPs and close zfsvfs_t::z_os
2202  *
2203  * Note, if successful, then we return with the 'z_teardown_lock' and
2204  * 'z_teardown_inactive_lock' write held.  We leave ownership of the underlying
2205  * dataset and objset intact so that they can be atomically handed off during
2206  * a subsequent rollback or recv operation and the resume thereafter.
2207  */
2208 int
2209 zfs_suspend_fs(zfsvfs_t *zfsvfs)
2210 {
2211         int error;
2212
2213         if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0)
2214                 return (error);
2215
2216         return (0);
2217 }
2218
2219 /*
2220  * Rebuild SA and release VOPs.  Note that ownership of the underlying dataset
2221  * is an invariant across any of the operations that can be performed while the
2222  * filesystem was suspended.  Whether it succeeded or failed, the preconditions
2223  * are the same: the relevant objset and associated dataset are owned by
2224  * zfsvfs, held, and long held on entry.
2225  */
2226 int
2227 zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
2228 {
2229         int err;
2230         znode_t *zp;
2231
2232         ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
2233         ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock));
2234
2235         /*
2236          * We already own this, so just update the objset_t, as the one we
2237          * had before may have been evicted.
2238          */
2239         objset_t *os;
2240         VERIFY3P(ds->ds_owner, ==, zfsvfs);
2241         VERIFY(dsl_dataset_long_held(ds));
2242         VERIFY0(dmu_objset_from_ds(ds, &os));
2243
2244         err = zfsvfs_init(zfsvfs, os);
2245         if (err != 0)
2246                 goto bail;
2247
2248         VERIFY(zfsvfs_setup(zfsvfs, B_FALSE) == 0);
2249
2250         zfs_set_fuid_feature(zfsvfs);
2251
2252         /*
2253          * Attempt to re-establish all the active znodes with
2254          * their dbufs.  If a zfs_rezget() fails, then we'll let
2255          * any potential callers discover that via ZFS_ENTER_VERIFY_VP
2256          * when they try to use their znode.
2257          */
2258         mutex_enter(&zfsvfs->z_znodes_lock);
2259         for (zp = list_head(&zfsvfs->z_all_znodes); zp;
2260             zp = list_next(&zfsvfs->z_all_znodes, zp)) {
2261                 (void) zfs_rezget(zp);
2262         }
2263         mutex_exit(&zfsvfs->z_znodes_lock);
2264
2265 bail:
2266         /* release the VOPs */
2267         rw_exit(&zfsvfs->z_teardown_inactive_lock);
2268         rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
2269
2270         if (err) {
2271                 /*
2272                  * Since we couldn't setup the sa framework, try to force
2273                  * unmount this file system.
2274                  */
2275                 if (vn_vfswlock(zfsvfs->z_vfs->vfs_vnodecovered) == 0) {
2276                         vfs_ref(zfsvfs->z_vfs);
2277                         (void) dounmount(zfsvfs->z_vfs, MS_FORCE, curthread);
2278                 }
2279         }
2280         return (err);
2281 }
2282
2283 static void
2284 zfs_freevfs(vfs_t *vfsp)
2285 {
2286         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2287
2288 #ifdef illumos
2289         /*
2290          * If this is a snapshot, we have an extra VFS_HOLD on our parent
2291          * from zfs_mount().  Release it here.  If we came through
2292          * zfs_mountroot() instead, we didn't grab an extra hold, so
2293          * skip the VFS_RELE for rootvfs.
2294          */
2295         if (zfsvfs->z_issnap && (vfsp != rootvfs))
2296                 VFS_RELE(zfsvfs->z_parent->z_vfs);
2297 #endif
2298
2299         zfsvfs_free(zfsvfs);
2300
2301         atomic_dec_32(&zfs_active_fs_count);
2302 }
2303
2304 #ifdef __i386__
2305 static int desiredvnodes_backup;
2306 #endif
2307
2308 static void
2309 zfs_vnodes_adjust(void)
2310 {
2311 #ifdef __i386__
2312         int newdesiredvnodes;
2313
2314         desiredvnodes_backup = desiredvnodes;
2315
2316         /*
2317          * We calculate newdesiredvnodes the same way it is done in
2318          * vntblinit(). If it is equal to desiredvnodes, it means that
2319          * it wasn't tuned by the administrator and we can tune it down.
2320          */
2321         newdesiredvnodes = min(maxproc + vm_cnt.v_page_count / 4, 2 *
2322             vm_kmem_size / (5 * (sizeof(struct vm_object) +
2323             sizeof(struct vnode))));
2324         if (newdesiredvnodes == desiredvnodes)
2325                 desiredvnodes = (3 * newdesiredvnodes) / 4;
2326 #endif
2327 }
2328
2329 static void
2330 zfs_vnodes_adjust_back(void)
2331 {
2332
2333 #ifdef __i386__
2334         desiredvnodes = desiredvnodes_backup;
2335 #endif
2336 }
2337
2338 void
2339 zfs_init(void)
2340 {
2341
2342         printf("ZFS filesystem version: " ZPL_VERSION_STRING "\n");
2343
2344         /*
2345          * Initialize .zfs directory structures
2346          */
2347         zfsctl_init();
2348
2349         /*
2350          * Initialize znode cache, vnode ops, etc...
2351          */
2352         zfs_znode_init();
2353
2354         /*
2355          * Reduce number of vnodes. Originally number of vnodes is calculated
2356          * with UFS inode in mind. We reduce it here, because it's too big for
2357          * ZFS/i386.
2358          */
2359         zfs_vnodes_adjust();
2360
2361         dmu_objset_register_type(DMU_OST_ZFS, zfs_space_delta_cb);
2362 }
2363
2364 void
2365 zfs_fini(void)
2366 {
2367         zfsctl_fini();
2368         zfs_znode_fini();
2369         zfs_vnodes_adjust_back();
2370 }
2371
2372 int
2373 zfs_busy(void)
2374 {
2375         return (zfs_active_fs_count != 0);
2376 }
2377
2378 int
2379 zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers)
2380 {
2381         int error;
2382         objset_t *os = zfsvfs->z_os;
2383         dmu_tx_t *tx;
2384
2385         if (newvers < ZPL_VERSION_INITIAL || newvers > ZPL_VERSION)
2386                 return (SET_ERROR(EINVAL));
2387
2388         if (newvers < zfsvfs->z_version)
2389                 return (SET_ERROR(EINVAL));
2390
2391         if (zfs_spa_version_map(newvers) >
2392             spa_version(dmu_objset_spa(zfsvfs->z_os)))
2393                 return (SET_ERROR(ENOTSUP));
2394
2395         tx = dmu_tx_create(os);
2396         dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_FALSE, ZPL_VERSION_STR);
2397         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2398                 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE,
2399                     ZFS_SA_ATTRS);
2400                 dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
2401         }
2402         error = dmu_tx_assign(tx, TXG_WAIT);
2403         if (error) {
2404                 dmu_tx_abort(tx);
2405                 return (error);
2406         }
2407
2408         error = zap_update(os, MASTER_NODE_OBJ, ZPL_VERSION_STR,
2409             8, 1, &newvers, tx);
2410
2411         if (error) {
2412                 dmu_tx_commit(tx);
2413                 return (error);
2414         }
2415
2416         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2417                 uint64_t sa_obj;
2418
2419                 ASSERT3U(spa_version(dmu_objset_spa(zfsvfs->z_os)), >=,
2420                     SPA_VERSION_SA);
2421                 sa_obj = zap_create(os, DMU_OT_SA_MASTER_NODE,
2422                     DMU_OT_NONE, 0, tx);
2423
2424                 error = zap_add(os, MASTER_NODE_OBJ,
2425                     ZFS_SA_ATTRS, 8, 1, &sa_obj, tx);
2426                 ASSERT0(error);
2427
2428                 VERIFY(0 == sa_set_sa_object(os, sa_obj));
2429                 sa_register_update_callback(os, zfs_sa_upgrade);
2430         }
2431
2432         spa_history_log_internal_ds(dmu_objset_ds(os), "upgrade", tx,
2433             "from %llu to %llu", zfsvfs->z_version, newvers);
2434
2435         dmu_tx_commit(tx);
2436
2437         zfsvfs->z_version = newvers;
2438
2439         zfs_set_fuid_feature(zfsvfs);
2440
2441         return (0);
2442 }
2443
2444 /*
2445  * Read a property stored within the master node.
2446  */
2447 int
2448 zfs_get_zplprop(objset_t *os, zfs_prop_t prop, uint64_t *value)
2449 {
2450         const char *pname;
2451         int error = ENOENT;
2452
2453         /*
2454          * Look up the file system's value for the property.  For the
2455          * version property, we look up a slightly different string.
2456          */
2457         if (prop == ZFS_PROP_VERSION)
2458                 pname = ZPL_VERSION_STR;
2459         else
2460                 pname = zfs_prop_to_name(prop);
2461
2462         if (os != NULL) {
2463                 ASSERT3U(os->os_phys->os_type, ==, DMU_OST_ZFS);
2464                 error = zap_lookup(os, MASTER_NODE_OBJ, pname, 8, 1, value);
2465         }
2466
2467         if (error == ENOENT) {
2468                 /* No value set, use the default value */
2469                 switch (prop) {
2470                 case ZFS_PROP_VERSION:
2471                         *value = ZPL_VERSION;
2472                         break;
2473                 case ZFS_PROP_NORMALIZE:
2474                 case ZFS_PROP_UTF8ONLY:
2475                         *value = 0;
2476                         break;
2477                 case ZFS_PROP_CASE:
2478                         *value = ZFS_CASE_SENSITIVE;
2479                         break;
2480                 default:
2481                         return (error);
2482                 }
2483                 error = 0;
2484         }
2485         return (error);
2486 }
2487
2488 #ifdef _KERNEL
2489 void
2490 zfsvfs_update_fromname(const char *oldname, const char *newname)
2491 {
2492         char tmpbuf[MAXPATHLEN];
2493         struct mount *mp;
2494         char *fromname;
2495         size_t oldlen;
2496
2497         oldlen = strlen(oldname);
2498
2499         mtx_lock(&mountlist_mtx);
2500         TAILQ_FOREACH(mp, &mountlist, mnt_list) {
2501                 fromname = mp->mnt_stat.f_mntfromname;
2502                 if (strcmp(fromname, oldname) == 0) {
2503                         (void)strlcpy(fromname, newname,
2504                             sizeof(mp->mnt_stat.f_mntfromname));
2505                         continue;
2506                 }
2507                 if (strncmp(fromname, oldname, oldlen) == 0 &&
2508                     (fromname[oldlen] == '/' || fromname[oldlen] == '@')) {
2509                         (void)snprintf(tmpbuf, sizeof(tmpbuf), "%s%s",
2510                             newname, fromname + oldlen);
2511                         (void)strlcpy(fromname, tmpbuf,
2512                             sizeof(mp->mnt_stat.f_mntfromname));
2513                         continue;
2514                 }
2515         }
2516         mtx_unlock(&mountlist_mtx);
2517 }
2518 #endif