]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
Update tcpdump to 4.9.0.
[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                 ret = vflush(vfsp, 0, 0, td);
1956                 ASSERT(ret == EBUSY);
1957                 if (!(fflag & MS_FORCE)) {
1958                         if (zfsvfs->z_ctldir->v_count > 1)
1959                                 return (EBUSY);
1960                         ASSERT(zfsvfs->z_ctldir->v_count == 1);
1961                 }
1962                 zfsctl_destroy(zfsvfs);
1963                 ASSERT(zfsvfs->z_ctldir == NULL);
1964         }
1965
1966         if (fflag & MS_FORCE) {
1967                 /*
1968                  * Mark file system as unmounted before calling
1969                  * vflush(FORCECLOSE). This way we ensure no future vnops
1970                  * will be called and risk operating on DOOMED vnodes.
1971                  */
1972                 rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1973                 zfsvfs->z_unmounted = B_TRUE;
1974                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1975         }
1976
1977         /*
1978          * Flush all the files.
1979          */
1980         ret = vflush(vfsp, 0, (fflag & MS_FORCE) ? FORCECLOSE : 0, td);
1981         if (ret != 0) {
1982                 if (!zfsvfs->z_issnap) {
1983                         zfsctl_create(zfsvfs);
1984                         ASSERT(zfsvfs->z_ctldir != NULL);
1985                 }
1986                 return (ret);
1987         }
1988
1989 #ifdef illumos
1990         if (!(fflag & MS_FORCE)) {
1991                 /*
1992                  * Check the number of active vnodes in the file system.
1993                  * Our count is maintained in the vfs structure, but the
1994                  * number is off by 1 to indicate a hold on the vfs
1995                  * structure itself.
1996                  *
1997                  * The '.zfs' directory maintains a reference of its
1998                  * own, and any active references underneath are
1999                  * reflected in the vnode count.
2000                  */
2001                 if (zfsvfs->z_ctldir == NULL) {
2002                         if (vfsp->vfs_count > 1)
2003                                 return (SET_ERROR(EBUSY));
2004                 } else {
2005                         if (vfsp->vfs_count > 2 ||
2006                             zfsvfs->z_ctldir->v_count > 1)
2007                                 return (SET_ERROR(EBUSY));
2008                 }
2009         }
2010 #endif
2011
2012         VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0);
2013         os = zfsvfs->z_os;
2014
2015         /*
2016          * z_os will be NULL if there was an error in
2017          * attempting to reopen zfsvfs.
2018          */
2019         if (os != NULL) {
2020                 /*
2021                  * Unset the objset user_ptr.
2022                  */
2023                 mutex_enter(&os->os_user_ptr_lock);
2024                 dmu_objset_set_user(os, NULL);
2025                 mutex_exit(&os->os_user_ptr_lock);
2026
2027                 /*
2028                  * Finally release the objset
2029                  */
2030                 dmu_objset_disown(os, zfsvfs);
2031         }
2032
2033         /*
2034          * We can now safely destroy the '.zfs' directory node.
2035          */
2036         if (zfsvfs->z_ctldir != NULL)
2037                 zfsctl_destroy(zfsvfs);
2038         zfs_freevfs(vfsp);
2039
2040         return (0);
2041 }
2042
2043 static int
2044 zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp)
2045 {
2046         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2047         znode_t         *zp;
2048         int             err;
2049
2050         /*
2051          * zfs_zget() can't operate on virtual entries like .zfs/ or
2052          * .zfs/snapshot/ directories, that's why we return EOPNOTSUPP.
2053          * This will make NFS to switch to LOOKUP instead of using VGET.
2054          */
2055         if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR ||
2056             (zfsvfs->z_shares_dir != 0 && ino == zfsvfs->z_shares_dir))
2057                 return (EOPNOTSUPP);
2058
2059         ZFS_ENTER(zfsvfs);
2060         err = zfs_zget(zfsvfs, ino, &zp);
2061         if (err == 0 && zp->z_unlinked) {
2062                 vrele(ZTOV(zp));
2063                 err = EINVAL;
2064         }
2065         if (err == 0)
2066                 *vpp = ZTOV(zp);
2067         ZFS_EXIT(zfsvfs);
2068         if (err == 0)
2069                 err = vn_lock(*vpp, flags);
2070         if (err != 0)
2071                 *vpp = NULL;
2072         return (err);
2073 }
2074
2075 static int
2076 zfs_checkexp(vfs_t *vfsp, struct sockaddr *nam, int *extflagsp,
2077     struct ucred **credanonp, int *numsecflavors, int **secflavors)
2078 {
2079         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2080
2081         /*
2082          * If this is regular file system vfsp is the same as
2083          * zfsvfs->z_parent->z_vfs, but if it is snapshot,
2084          * zfsvfs->z_parent->z_vfs represents parent file system
2085          * which we have to use here, because only this file system
2086          * has mnt_export configured.
2087          */
2088         return (vfs_stdcheckexp(zfsvfs->z_parent->z_vfs, nam, extflagsp,
2089             credanonp, numsecflavors, secflavors));
2090 }
2091
2092 CTASSERT(SHORT_FID_LEN <= sizeof(struct fid));
2093 CTASSERT(LONG_FID_LEN <= sizeof(struct fid));
2094
2095 static int
2096 zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
2097 {
2098         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2099         znode_t         *zp;
2100         uint64_t        object = 0;
2101         uint64_t        fid_gen = 0;
2102         uint64_t        gen_mask;
2103         uint64_t        zp_gen;
2104         int             i, err;
2105
2106         *vpp = NULL;
2107
2108         ZFS_ENTER(zfsvfs);
2109
2110         /*
2111          * On FreeBSD we can get snapshot's mount point or its parent file
2112          * system mount point depending if snapshot is already mounted or not.
2113          */
2114         if (zfsvfs->z_parent == zfsvfs && fidp->fid_len == LONG_FID_LEN) {
2115                 zfid_long_t     *zlfid = (zfid_long_t *)fidp;
2116                 uint64_t        objsetid = 0;
2117                 uint64_t        setgen = 0;
2118
2119                 for (i = 0; i < sizeof (zlfid->zf_setid); i++)
2120                         objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
2121
2122                 for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
2123                         setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i);
2124
2125                 ZFS_EXIT(zfsvfs);
2126
2127                 err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs);
2128                 if (err)
2129                         return (SET_ERROR(EINVAL));
2130                 ZFS_ENTER(zfsvfs);
2131         }
2132
2133         if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) {
2134                 zfid_short_t    *zfid = (zfid_short_t *)fidp;
2135
2136                 for (i = 0; i < sizeof (zfid->zf_object); i++)
2137                         object |= ((uint64_t)zfid->zf_object[i]) << (8 * i);
2138
2139                 for (i = 0; i < sizeof (zfid->zf_gen); i++)
2140                         fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i);
2141         } else {
2142                 ZFS_EXIT(zfsvfs);
2143                 return (SET_ERROR(EINVAL));
2144         }
2145
2146         /*
2147          * A zero fid_gen means we are in .zfs or the .zfs/snapshot
2148          * directory tree. If the object == zfsvfs->z_shares_dir, then
2149          * we are in the .zfs/shares directory tree.
2150          */
2151         if ((fid_gen == 0 &&
2152              (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) ||
2153             (zfsvfs->z_shares_dir != 0 && object == zfsvfs->z_shares_dir)) {
2154                 *vpp = zfsvfs->z_ctldir;
2155                 ASSERT(*vpp != NULL);
2156                 if (object == ZFSCTL_INO_SNAPDIR) {
2157                         VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL,
2158                             0, NULL, NULL, NULL, NULL, NULL) == 0);
2159                 } else if (object == zfsvfs->z_shares_dir) {
2160                         VERIFY(zfsctl_root_lookup(*vpp, "shares", vpp, NULL,
2161                             0, NULL, NULL, NULL, NULL, NULL) == 0);
2162                 } else {
2163                         vref(*vpp);
2164                 }
2165                 ZFS_EXIT(zfsvfs);
2166                 err = vn_lock(*vpp, flags);
2167                 if (err != 0)
2168                         *vpp = NULL;
2169                 return (err);
2170         }
2171
2172         gen_mask = -1ULL >> (64 - 8 * i);
2173
2174         dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask);
2175         if (err = zfs_zget(zfsvfs, object, &zp)) {
2176                 ZFS_EXIT(zfsvfs);
2177                 return (err);
2178         }
2179         (void) sa_lookup(zp->z_sa_hdl, SA_ZPL_GEN(zfsvfs), &zp_gen,
2180             sizeof (uint64_t));
2181         zp_gen = zp_gen & gen_mask;
2182         if (zp_gen == 0)
2183                 zp_gen = 1;
2184         if (zp->z_unlinked || zp_gen != fid_gen) {
2185                 dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen);
2186                 vrele(ZTOV(zp));
2187                 ZFS_EXIT(zfsvfs);
2188                 return (SET_ERROR(EINVAL));
2189         }
2190
2191         *vpp = ZTOV(zp);
2192         ZFS_EXIT(zfsvfs);
2193         err = vn_lock(*vpp, flags | LK_RETRY);
2194         if (err == 0)
2195                 vnode_create_vobject(*vpp, zp->z_size, curthread);
2196         else
2197                 *vpp = NULL;
2198         return (err);
2199 }
2200
2201 /*
2202  * Block out VOPs and close zfsvfs_t::z_os
2203  *
2204  * Note, if successful, then we return with the 'z_teardown_lock' and
2205  * 'z_teardown_inactive_lock' write held.  We leave ownership of the underlying
2206  * dataset and objset intact so that they can be atomically handed off during
2207  * a subsequent rollback or recv operation and the resume thereafter.
2208  */
2209 int
2210 zfs_suspend_fs(zfsvfs_t *zfsvfs)
2211 {
2212         int error;
2213
2214         if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0)
2215                 return (error);
2216
2217         return (0);
2218 }
2219
2220 /*
2221  * Rebuild SA and release VOPs.  Note that ownership of the underlying dataset
2222  * is an invariant across any of the operations that can be performed while the
2223  * filesystem was suspended.  Whether it succeeded or failed, the preconditions
2224  * are the same: the relevant objset and associated dataset are owned by
2225  * zfsvfs, held, and long held on entry.
2226  */
2227 int
2228 zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
2229 {
2230         int err;
2231         znode_t *zp;
2232
2233         ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
2234         ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock));
2235
2236         /*
2237          * We already own this, so just update the objset_t, as the one we
2238          * had before may have been evicted.
2239          */
2240         objset_t *os;
2241         VERIFY3P(ds->ds_owner, ==, zfsvfs);
2242         VERIFY(dsl_dataset_long_held(ds));
2243         VERIFY0(dmu_objset_from_ds(ds, &os));
2244
2245         err = zfsvfs_init(zfsvfs, os);
2246         if (err != 0)
2247                 goto bail;
2248
2249         VERIFY(zfsvfs_setup(zfsvfs, B_FALSE) == 0);
2250
2251         zfs_set_fuid_feature(zfsvfs);
2252
2253         /*
2254          * Attempt to re-establish all the active znodes with
2255          * their dbufs.  If a zfs_rezget() fails, then we'll let
2256          * any potential callers discover that via ZFS_ENTER_VERIFY_VP
2257          * when they try to use their znode.
2258          */
2259         mutex_enter(&zfsvfs->z_znodes_lock);
2260         for (zp = list_head(&zfsvfs->z_all_znodes); zp;
2261             zp = list_next(&zfsvfs->z_all_znodes, zp)) {
2262                 (void) zfs_rezget(zp);
2263         }
2264         mutex_exit(&zfsvfs->z_znodes_lock);
2265
2266 bail:
2267         /* release the VOPs */
2268         rw_exit(&zfsvfs->z_teardown_inactive_lock);
2269         rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
2270
2271         if (err) {
2272                 /*
2273                  * Since we couldn't setup the sa framework, try to force
2274                  * unmount this file system.
2275                  */
2276                 if (vn_vfswlock(zfsvfs->z_vfs->vfs_vnodecovered) == 0) {
2277                         vfs_ref(zfsvfs->z_vfs);
2278                         (void) dounmount(zfsvfs->z_vfs, MS_FORCE, curthread);
2279                 }
2280         }
2281         return (err);
2282 }
2283
2284 static void
2285 zfs_freevfs(vfs_t *vfsp)
2286 {
2287         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2288
2289 #ifdef illumos
2290         /*
2291          * If this is a snapshot, we have an extra VFS_HOLD on our parent
2292          * from zfs_mount().  Release it here.  If we came through
2293          * zfs_mountroot() instead, we didn't grab an extra hold, so
2294          * skip the VFS_RELE for rootvfs.
2295          */
2296         if (zfsvfs->z_issnap && (vfsp != rootvfs))
2297                 VFS_RELE(zfsvfs->z_parent->z_vfs);
2298 #endif
2299
2300         zfsvfs_free(zfsvfs);
2301
2302         atomic_dec_32(&zfs_active_fs_count);
2303 }
2304
2305 #ifdef __i386__
2306 static int desiredvnodes_backup;
2307 #endif
2308
2309 static void
2310 zfs_vnodes_adjust(void)
2311 {
2312 #ifdef __i386__
2313         int newdesiredvnodes;
2314
2315         desiredvnodes_backup = desiredvnodes;
2316
2317         /*
2318          * We calculate newdesiredvnodes the same way it is done in
2319          * vntblinit(). If it is equal to desiredvnodes, it means that
2320          * it wasn't tuned by the administrator and we can tune it down.
2321          */
2322         newdesiredvnodes = min(maxproc + vm_cnt.v_page_count / 4, 2 *
2323             vm_kmem_size / (5 * (sizeof(struct vm_object) +
2324             sizeof(struct vnode))));
2325         if (newdesiredvnodes == desiredvnodes)
2326                 desiredvnodes = (3 * newdesiredvnodes) / 4;
2327 #endif
2328 }
2329
2330 static void
2331 zfs_vnodes_adjust_back(void)
2332 {
2333
2334 #ifdef __i386__
2335         desiredvnodes = desiredvnodes_backup;
2336 #endif
2337 }
2338
2339 void
2340 zfs_init(void)
2341 {
2342
2343         printf("ZFS filesystem version: " ZPL_VERSION_STRING "\n");
2344
2345         /*
2346          * Initialize .zfs directory structures
2347          */
2348         zfsctl_init();
2349
2350         /*
2351          * Initialize znode cache, vnode ops, etc...
2352          */
2353         zfs_znode_init();
2354
2355         /*
2356          * Reduce number of vnodes. Originally number of vnodes is calculated
2357          * with UFS inode in mind. We reduce it here, because it's too big for
2358          * ZFS/i386.
2359          */
2360         zfs_vnodes_adjust();
2361
2362         dmu_objset_register_type(DMU_OST_ZFS, zfs_space_delta_cb);
2363 }
2364
2365 void
2366 zfs_fini(void)
2367 {
2368         zfsctl_fini();
2369         zfs_znode_fini();
2370         zfs_vnodes_adjust_back();
2371 }
2372
2373 int
2374 zfs_busy(void)
2375 {
2376         return (zfs_active_fs_count != 0);
2377 }
2378
2379 int
2380 zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers)
2381 {
2382         int error;
2383         objset_t *os = zfsvfs->z_os;
2384         dmu_tx_t *tx;
2385
2386         if (newvers < ZPL_VERSION_INITIAL || newvers > ZPL_VERSION)
2387                 return (SET_ERROR(EINVAL));
2388
2389         if (newvers < zfsvfs->z_version)
2390                 return (SET_ERROR(EINVAL));
2391
2392         if (zfs_spa_version_map(newvers) >
2393             spa_version(dmu_objset_spa(zfsvfs->z_os)))
2394                 return (SET_ERROR(ENOTSUP));
2395
2396         tx = dmu_tx_create(os);
2397         dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_FALSE, ZPL_VERSION_STR);
2398         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2399                 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE,
2400                     ZFS_SA_ATTRS);
2401                 dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
2402         }
2403         error = dmu_tx_assign(tx, TXG_WAIT);
2404         if (error) {
2405                 dmu_tx_abort(tx);
2406                 return (error);
2407         }
2408
2409         error = zap_update(os, MASTER_NODE_OBJ, ZPL_VERSION_STR,
2410             8, 1, &newvers, tx);
2411
2412         if (error) {
2413                 dmu_tx_commit(tx);
2414                 return (error);
2415         }
2416
2417         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2418                 uint64_t sa_obj;
2419
2420                 ASSERT3U(spa_version(dmu_objset_spa(zfsvfs->z_os)), >=,
2421                     SPA_VERSION_SA);
2422                 sa_obj = zap_create(os, DMU_OT_SA_MASTER_NODE,
2423                     DMU_OT_NONE, 0, tx);
2424
2425                 error = zap_add(os, MASTER_NODE_OBJ,
2426                     ZFS_SA_ATTRS, 8, 1, &sa_obj, tx);
2427                 ASSERT0(error);
2428
2429                 VERIFY(0 == sa_set_sa_object(os, sa_obj));
2430                 sa_register_update_callback(os, zfs_sa_upgrade);
2431         }
2432
2433         spa_history_log_internal_ds(dmu_objset_ds(os), "upgrade", tx,
2434             "from %llu to %llu", zfsvfs->z_version, newvers);
2435
2436         dmu_tx_commit(tx);
2437
2438         zfsvfs->z_version = newvers;
2439
2440         zfs_set_fuid_feature(zfsvfs);
2441
2442         return (0);
2443 }
2444
2445 /*
2446  * Read a property stored within the master node.
2447  */
2448 int
2449 zfs_get_zplprop(objset_t *os, zfs_prop_t prop, uint64_t *value)
2450 {
2451         const char *pname;
2452         int error = ENOENT;
2453
2454         /*
2455          * Look up the file system's value for the property.  For the
2456          * version property, we look up a slightly different string.
2457          */
2458         if (prop == ZFS_PROP_VERSION)
2459                 pname = ZPL_VERSION_STR;
2460         else
2461                 pname = zfs_prop_to_name(prop);
2462
2463         if (os != NULL)
2464                 error = zap_lookup(os, MASTER_NODE_OBJ, pname, 8, 1, value);
2465
2466         if (error == ENOENT) {
2467                 /* No value set, use the default value */
2468                 switch (prop) {
2469                 case ZFS_PROP_VERSION:
2470                         *value = ZPL_VERSION;
2471                         break;
2472                 case ZFS_PROP_NORMALIZE:
2473                 case ZFS_PROP_UTF8ONLY:
2474                         *value = 0;
2475                         break;
2476                 case ZFS_PROP_CASE:
2477                         *value = ZFS_CASE_SENSITIVE;
2478                         break;
2479                 default:
2480                         return (error);
2481                 }
2482                 error = 0;
2483         }
2484         return (error);
2485 }
2486
2487 #ifdef _KERNEL
2488 void
2489 zfsvfs_update_fromname(const char *oldname, const char *newname)
2490 {
2491         char tmpbuf[MAXPATHLEN];
2492         struct mount *mp;
2493         char *fromname;
2494         size_t oldlen;
2495
2496         oldlen = strlen(oldname);
2497
2498         mtx_lock(&mountlist_mtx);
2499         TAILQ_FOREACH(mp, &mountlist, mnt_list) {
2500                 fromname = mp->mnt_stat.f_mntfromname;
2501                 if (strcmp(fromname, oldname) == 0) {
2502                         (void)strlcpy(fromname, newname,
2503                             sizeof(mp->mnt_stat.f_mntfromname));
2504                         continue;
2505                 }
2506                 if (strncmp(fromname, oldname, oldlen) == 0 &&
2507                     (fromname[oldlen] == '/' || fromname[oldlen] == '@')) {
2508                         (void)snprintf(tmpbuf, sizeof(tmpbuf), "%s%s",
2509                             newname, fromname + oldlen);
2510                         (void)strlcpy(fromname, tmpbuf,
2511                             sizeof(mp->mnt_stat.f_mntfromname));
2512                         continue;
2513                 }
2514         }
2515         mtx_unlock(&mountlist_mtx);
2516 }
2517 #endif