]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
MFC r277503 (by will): Ignore sync requests from the system syncher,
[FreeBSD/stable/10.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, 2014 by Delphix. All rights reserved.
26  */
27
28 /* Portions Copyright 2010 Robert Milkowski */
29
30 #include <sys/types.h>
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/kernel.h>
34 #include <sys/sysmacros.h>
35 #include <sys/kmem.h>
36 #include <sys/acl.h>
37 #include <sys/vnode.h>
38 #include <sys/vfs.h>
39 #include <sys/mntent.h>
40 #include <sys/mount.h>
41 #include <sys/cmn_err.h>
42 #include <sys/zfs_znode.h>
43 #include <sys/zfs_dir.h>
44 #include <sys/zil.h>
45 #include <sys/fs/zfs.h>
46 #include <sys/dmu.h>
47 #include <sys/dsl_prop.h>
48 #include <sys/dsl_dataset.h>
49 #include <sys/dsl_deleg.h>
50 #include <sys/spa.h>
51 #include <sys/zap.h>
52 #include <sys/sa.h>
53 #include <sys/sa_impl.h>
54 #include <sys/varargs.h>
55 #include <sys/policy.h>
56 #include <sys/atomic.h>
57 #include <sys/zfs_ioctl.h>
58 #include <sys/zfs_ctldir.h>
59 #include <sys/zfs_fuid.h>
60 #include <sys/sunddi.h>
61 #include <sys/dnlc.h>
62 #include <sys/dmu_objset.h>
63 #include <sys/spa_boot.h>
64 #include <sys/jail.h>
65 #include "zfs_comutil.h"
66
67 struct mtx zfs_debug_mtx;
68 MTX_SYSINIT(zfs_debug_mtx, &zfs_debug_mtx, "zfs_debug", MTX_DEF);
69
70 SYSCTL_NODE(_vfs, OID_AUTO, zfs, CTLFLAG_RW, 0, "ZFS file system");
71
72 int zfs_super_owner;
73 SYSCTL_INT(_vfs_zfs, OID_AUTO, super_owner, CTLFLAG_RW, &zfs_super_owner, 0,
74     "File system owner can perform privileged operation on his file systems");
75
76 int zfs_debug_level;
77 TUNABLE_INT("vfs.zfs.debug", &zfs_debug_level);
78 SYSCTL_INT(_vfs_zfs, OID_AUTO, debug, CTLFLAG_RW, &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 static 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 int
850 zfsvfs_create(const char *osname, zfsvfs_t **zfvp)
851 {
852         objset_t *os;
853         zfsvfs_t *zfsvfs;
854         uint64_t zval;
855         int i, error;
856         uint64_t sa_obj;
857
858         zfsvfs = kmem_zalloc(sizeof (zfsvfs_t), KM_SLEEP);
859
860         /*
861          * We claim to always be readonly so we can open snapshots;
862          * other ZPL code will prevent us from writing to snapshots.
863          */
864         error = dmu_objset_own(osname, DMU_OST_ZFS, B_TRUE, zfsvfs, &os);
865         if (error) {
866                 kmem_free(zfsvfs, sizeof (zfsvfs_t));
867                 return (error);
868         }
869
870         /*
871          * Initialize the zfs-specific filesystem structure.
872          * Should probably make this a kmem cache, shuffle fields,
873          * and just bzero up to z_hold_mtx[].
874          */
875         zfsvfs->z_vfs = NULL;
876         zfsvfs->z_parent = zfsvfs;
877         zfsvfs->z_max_blksz = SPA_OLD_MAXBLOCKSIZE;
878         zfsvfs->z_show_ctldir = ZFS_SNAPDIR_VISIBLE;
879         zfsvfs->z_os = os;
880
881         error = zfs_get_zplprop(os, ZFS_PROP_VERSION, &zfsvfs->z_version);
882         if (error) {
883                 goto out;
884         } else if (zfsvfs->z_version >
885             zfs_zpl_version_map(spa_version(dmu_objset_spa(os)))) {
886                 (void) printf("Can't mount a version %lld file system "
887                     "on a version %lld pool\n. Pool must be upgraded to mount "
888                     "this file system.", (u_longlong_t)zfsvfs->z_version,
889                     (u_longlong_t)spa_version(dmu_objset_spa(os)));
890                 error = SET_ERROR(ENOTSUP);
891                 goto out;
892         }
893         if ((error = zfs_get_zplprop(os, ZFS_PROP_NORMALIZE, &zval)) != 0)
894                 goto out;
895         zfsvfs->z_norm = (int)zval;
896
897         if ((error = zfs_get_zplprop(os, ZFS_PROP_UTF8ONLY, &zval)) != 0)
898                 goto out;
899         zfsvfs->z_utf8 = (zval != 0);
900
901         if ((error = zfs_get_zplprop(os, ZFS_PROP_CASE, &zval)) != 0)
902                 goto out;
903         zfsvfs->z_case = (uint_t)zval;
904
905         /*
906          * Fold case on file systems that are always or sometimes case
907          * insensitive.
908          */
909         if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE ||
910             zfsvfs->z_case == ZFS_CASE_MIXED)
911                 zfsvfs->z_norm |= U8_TEXTPREP_TOUPPER;
912
913         zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os);
914         zfsvfs->z_use_sa = USE_SA(zfsvfs->z_version, zfsvfs->z_os);
915
916         if (zfsvfs->z_use_sa) {
917                 /* should either have both of these objects or none */
918                 error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_SA_ATTRS, 8, 1,
919                     &sa_obj);
920                 if (error)
921                         goto out;
922         } else {
923                 /*
924                  * Pre SA versions file systems should never touch
925                  * either the attribute registration or layout objects.
926                  */
927                 sa_obj = 0;
928         }
929
930         error = sa_setup(os, sa_obj, zfs_attr_table, ZPL_END,
931             &zfsvfs->z_attr_table);
932         if (error)
933                 goto out;
934
935         if (zfsvfs->z_version >= ZPL_VERSION_SA)
936                 sa_register_update_callback(os, zfs_sa_upgrade);
937
938         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_ROOT_OBJ, 8, 1,
939             &zfsvfs->z_root);
940         if (error)
941                 goto out;
942         ASSERT(zfsvfs->z_root != 0);
943
944         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_UNLINKED_SET, 8, 1,
945             &zfsvfs->z_unlinkedobj);
946         if (error)
947                 goto out;
948
949         error = zap_lookup(os, MASTER_NODE_OBJ,
950             zfs_userquota_prop_prefixes[ZFS_PROP_USERQUOTA],
951             8, 1, &zfsvfs->z_userquota_obj);
952         if (error && error != ENOENT)
953                 goto out;
954
955         error = zap_lookup(os, MASTER_NODE_OBJ,
956             zfs_userquota_prop_prefixes[ZFS_PROP_GROUPQUOTA],
957             8, 1, &zfsvfs->z_groupquota_obj);
958         if (error && error != ENOENT)
959                 goto out;
960
961         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_FUID_TABLES, 8, 1,
962             &zfsvfs->z_fuid_obj);
963         if (error && error != ENOENT)
964                 goto out;
965
966         error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_SHARES_DIR, 8, 1,
967             &zfsvfs->z_shares_dir);
968         if (error && error != ENOENT)
969                 goto out;
970
971         mutex_init(&zfsvfs->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL);
972         mutex_init(&zfsvfs->z_lock, NULL, MUTEX_DEFAULT, NULL);
973         list_create(&zfsvfs->z_all_znodes, sizeof (znode_t),
974             offsetof(znode_t, z_link_node));
975         rrm_init(&zfsvfs->z_teardown_lock, B_FALSE);
976         rw_init(&zfsvfs->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL);
977         rw_init(&zfsvfs->z_fuid_lock, NULL, RW_DEFAULT, NULL);
978         for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
979                 mutex_init(&zfsvfs->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
980
981         *zfvp = zfsvfs;
982         return (0);
983
984 out:
985         dmu_objset_disown(os, zfsvfs);
986         *zfvp = NULL;
987         kmem_free(zfsvfs, sizeof (zfsvfs_t));
988         return (error);
989 }
990
991 static int
992 zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
993 {
994         int error;
995
996         error = zfs_register_callbacks(zfsvfs->z_vfs);
997         if (error)
998                 return (error);
999
1000         /*
1001          * Set the objset user_ptr to track its zfsvfs.
1002          */
1003         mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
1004         dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
1005         mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
1006
1007         zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
1008
1009         /*
1010          * If we are not mounting (ie: online recv), then we don't
1011          * have to worry about replaying the log as we blocked all
1012          * operations out since we closed the ZIL.
1013          */
1014         if (mounting) {
1015                 boolean_t readonly;
1016
1017                 /*
1018                  * During replay we remove the read only flag to
1019                  * allow replays to succeed.
1020                  */
1021                 readonly = zfsvfs->z_vfs->vfs_flag & VFS_RDONLY;
1022                 if (readonly != 0)
1023                         zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY;
1024                 else
1025                         zfs_unlinked_drain(zfsvfs);
1026
1027                 /*
1028                  * Parse and replay the intent log.
1029                  *
1030                  * Because of ziltest, this must be done after
1031                  * zfs_unlinked_drain().  (Further note: ziltest
1032                  * doesn't use readonly mounts, where
1033                  * zfs_unlinked_drain() isn't called.)  This is because
1034                  * ziltest causes spa_sync() to think it's committed,
1035                  * but actually it is not, so the intent log contains
1036                  * many txg's worth of changes.
1037                  *
1038                  * In particular, if object N is in the unlinked set in
1039                  * the last txg to actually sync, then it could be
1040                  * actually freed in a later txg and then reallocated
1041                  * in a yet later txg.  This would write a "create
1042                  * object N" record to the intent log.  Normally, this
1043                  * would be fine because the spa_sync() would have
1044                  * written out the fact that object N is free, before
1045                  * we could write the "create object N" intent log
1046                  * record.
1047                  *
1048                  * But when we are in ziltest mode, we advance the "open
1049                  * txg" without actually spa_sync()-ing the changes to
1050                  * disk.  So we would see that object N is still
1051                  * allocated and in the unlinked set, and there is an
1052                  * intent log record saying to allocate it.
1053                  */
1054                 if (spa_writeable(dmu_objset_spa(zfsvfs->z_os))) {
1055                         if (zil_replay_disable) {
1056                                 zil_destroy(zfsvfs->z_log, B_FALSE);
1057                         } else {
1058                                 zfsvfs->z_replay = B_TRUE;
1059                                 zil_replay(zfsvfs->z_os, zfsvfs,
1060                                     zfs_replay_vector);
1061                                 zfsvfs->z_replay = B_FALSE;
1062                         }
1063                 }
1064                 zfsvfs->z_vfs->vfs_flag |= readonly; /* restore readonly bit */
1065         }
1066
1067         return (0);
1068 }
1069
1070 extern krwlock_t zfsvfs_lock; /* in zfs_znode.c */
1071
1072 void
1073 zfsvfs_free(zfsvfs_t *zfsvfs)
1074 {
1075         int i;
1076
1077         /*
1078          * This is a barrier to prevent the filesystem from going away in
1079          * zfs_znode_move() until we can safely ensure that the filesystem is
1080          * not unmounted. We consider the filesystem valid before the barrier
1081          * and invalid after the barrier.
1082          */
1083         rw_enter(&zfsvfs_lock, RW_READER);
1084         rw_exit(&zfsvfs_lock);
1085
1086         zfs_fuid_destroy(zfsvfs);
1087
1088         mutex_destroy(&zfsvfs->z_znodes_lock);
1089         mutex_destroy(&zfsvfs->z_lock);
1090         list_destroy(&zfsvfs->z_all_znodes);
1091         rrm_destroy(&zfsvfs->z_teardown_lock);
1092         rw_destroy(&zfsvfs->z_teardown_inactive_lock);
1093         rw_destroy(&zfsvfs->z_fuid_lock);
1094         for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
1095                 mutex_destroy(&zfsvfs->z_hold_mtx[i]);
1096         kmem_free(zfsvfs, sizeof (zfsvfs_t));
1097 }
1098
1099 static void
1100 zfs_set_fuid_feature(zfsvfs_t *zfsvfs)
1101 {
1102         zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os);
1103         if (zfsvfs->z_vfs) {
1104                 if (zfsvfs->z_use_fuids) {
1105                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_XVATTR);
1106                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_SYSATTR_VIEWS);
1107                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACEMASKONACCESS);
1108                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACLONCREATE);
1109                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACCESS_FILTER);
1110                         vfs_set_feature(zfsvfs->z_vfs, VFSFT_REPARSE);
1111                 } else {
1112                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_XVATTR);
1113                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_SYSATTR_VIEWS);
1114                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_ACEMASKONACCESS);
1115                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_ACLONCREATE);
1116                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_ACCESS_FILTER);
1117                         vfs_clear_feature(zfsvfs->z_vfs, VFSFT_REPARSE);
1118                 }
1119         }
1120         zfsvfs->z_use_sa = USE_SA(zfsvfs->z_version, zfsvfs->z_os);
1121 }
1122
1123 static int
1124 zfs_domount(vfs_t *vfsp, char *osname)
1125 {
1126         uint64_t recordsize, fsid_guid;
1127         int error = 0;
1128         zfsvfs_t *zfsvfs;
1129         vnode_t *vp;
1130
1131         ASSERT(vfsp);
1132         ASSERT(osname);
1133
1134         error = zfsvfs_create(osname, &zfsvfs);
1135         if (error)
1136                 return (error);
1137         zfsvfs->z_vfs = vfsp;
1138
1139 #ifdef illumos
1140         /* Initialize the generic filesystem structure. */
1141         vfsp->vfs_bcount = 0;
1142         vfsp->vfs_data = NULL;
1143
1144         if (zfs_create_unique_device(&mount_dev) == -1) {
1145                 error = SET_ERROR(ENODEV);
1146                 goto out;
1147         }
1148         ASSERT(vfs_devismounted(mount_dev) == 0);
1149 #endif
1150
1151         if (error = dsl_prop_get_integer(osname, "recordsize", &recordsize,
1152             NULL))
1153                 goto out;
1154         zfsvfs->z_vfs->vfs_bsize = SPA_MINBLOCKSIZE;
1155         zfsvfs->z_vfs->mnt_stat.f_iosize = recordsize;
1156
1157         vfsp->vfs_data = zfsvfs;
1158         vfsp->mnt_flag |= MNT_LOCAL;
1159         vfsp->mnt_kern_flag |= MNTK_LOOKUP_SHARED;
1160         vfsp->mnt_kern_flag |= MNTK_SHARED_WRITES;
1161         vfsp->mnt_kern_flag |= MNTK_EXTENDED_SHARED;
1162
1163         /*
1164          * The fsid is 64 bits, composed of an 8-bit fs type, which
1165          * separates our fsid from any other filesystem types, and a
1166          * 56-bit objset unique ID.  The objset unique ID is unique to
1167          * all objsets open on this system, provided by unique_create().
1168          * The 8-bit fs type must be put in the low bits of fsid[1]
1169          * because that's where other Solaris filesystems put it.
1170          */
1171         fsid_guid = dmu_objset_fsid_guid(zfsvfs->z_os);
1172         ASSERT((fsid_guid & ~((1ULL<<56)-1)) == 0);
1173         vfsp->vfs_fsid.val[0] = fsid_guid;
1174         vfsp->vfs_fsid.val[1] = ((fsid_guid>>32) << 8) |
1175             vfsp->mnt_vfc->vfc_typenum & 0xFF;
1176
1177         /*
1178          * Set features for file system.
1179          */
1180         zfs_set_fuid_feature(zfsvfs);
1181         if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
1182                 vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS);
1183                 vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE);
1184                 vfs_set_feature(vfsp, VFSFT_NOCASESENSITIVE);
1185         } else if (zfsvfs->z_case == ZFS_CASE_MIXED) {
1186                 vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS);
1187                 vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE);
1188         }
1189         vfs_set_feature(vfsp, VFSFT_ZEROCOPY_SUPPORTED);
1190
1191         if (dmu_objset_is_snapshot(zfsvfs->z_os)) {
1192                 uint64_t pval;
1193
1194                 atime_changed_cb(zfsvfs, B_FALSE);
1195                 readonly_changed_cb(zfsvfs, B_TRUE);
1196                 if (error = dsl_prop_get_integer(osname, "xattr", &pval, NULL))
1197                         goto out;
1198                 xattr_changed_cb(zfsvfs, pval);
1199                 zfsvfs->z_issnap = B_TRUE;
1200                 zfsvfs->z_os->os_sync = ZFS_SYNC_DISABLED;
1201
1202                 mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
1203                 dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
1204                 mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
1205         } else {
1206                 error = zfsvfs_setup(zfsvfs, B_TRUE);
1207         }
1208
1209         vfs_mountedfrom(vfsp, osname);
1210
1211         if (!zfsvfs->z_issnap)
1212                 zfsctl_create(zfsvfs);
1213 out:
1214         if (error) {
1215                 dmu_objset_disown(zfsvfs->z_os, zfsvfs);
1216                 zfsvfs_free(zfsvfs);
1217         } else {
1218                 atomic_inc_32(&zfs_active_fs_count);
1219         }
1220
1221         return (error);
1222 }
1223
1224 void
1225 zfs_unregister_callbacks(zfsvfs_t *zfsvfs)
1226 {
1227         objset_t *os = zfsvfs->z_os;
1228
1229         if (!dmu_objset_is_snapshot(os))
1230                 dsl_prop_unregister_all(dmu_objset_ds(os), zfsvfs);
1231 }
1232
1233 #ifdef SECLABEL
1234 /*
1235  * Convert a decimal digit string to a uint64_t integer.
1236  */
1237 static int
1238 str_to_uint64(char *str, uint64_t *objnum)
1239 {
1240         uint64_t num = 0;
1241
1242         while (*str) {
1243                 if (*str < '0' || *str > '9')
1244                         return (SET_ERROR(EINVAL));
1245
1246                 num = num*10 + *str++ - '0';
1247         }
1248
1249         *objnum = num;
1250         return (0);
1251 }
1252
1253 /*
1254  * The boot path passed from the boot loader is in the form of
1255  * "rootpool-name/root-filesystem-object-number'. Convert this
1256  * string to a dataset name: "rootpool-name/root-filesystem-name".
1257  */
1258 static int
1259 zfs_parse_bootfs(char *bpath, char *outpath)
1260 {
1261         char *slashp;
1262         uint64_t objnum;
1263         int error;
1264
1265         if (*bpath == 0 || *bpath == '/')
1266                 return (SET_ERROR(EINVAL));
1267
1268         (void) strcpy(outpath, bpath);
1269
1270         slashp = strchr(bpath, '/');
1271
1272         /* if no '/', just return the pool name */
1273         if (slashp == NULL) {
1274                 return (0);
1275         }
1276
1277         /* if not a number, just return the root dataset name */
1278         if (str_to_uint64(slashp+1, &objnum)) {
1279                 return (0);
1280         }
1281
1282         *slashp = '\0';
1283         error = dsl_dsobj_to_dsname(bpath, objnum, outpath);
1284         *slashp = '/';
1285
1286         return (error);
1287 }
1288
1289 /*
1290  * Check that the hex label string is appropriate for the dataset being
1291  * mounted into the global_zone proper.
1292  *
1293  * Return an error if the hex label string is not default or
1294  * admin_low/admin_high.  For admin_low labels, the corresponding
1295  * dataset must be readonly.
1296  */
1297 int
1298 zfs_check_global_label(const char *dsname, const char *hexsl)
1299 {
1300         if (strcasecmp(hexsl, ZFS_MLSLABEL_DEFAULT) == 0)
1301                 return (0);
1302         if (strcasecmp(hexsl, ADMIN_HIGH) == 0)
1303                 return (0);
1304         if (strcasecmp(hexsl, ADMIN_LOW) == 0) {
1305                 /* must be readonly */
1306                 uint64_t rdonly;
1307
1308                 if (dsl_prop_get_integer(dsname,
1309                     zfs_prop_to_name(ZFS_PROP_READONLY), &rdonly, NULL))
1310                         return (SET_ERROR(EACCES));
1311                 return (rdonly ? 0 : EACCES);
1312         }
1313         return (SET_ERROR(EACCES));
1314 }
1315
1316 /*
1317  * Determine whether the mount is allowed according to MAC check.
1318  * by comparing (where appropriate) label of the dataset against
1319  * the label of the zone being mounted into.  If the dataset has
1320  * no label, create one.
1321  *
1322  * Returns 0 if access allowed, error otherwise (e.g. EACCES)
1323  */
1324 static int
1325 zfs_mount_label_policy(vfs_t *vfsp, char *osname)
1326 {
1327         int             error, retv;
1328         zone_t          *mntzone = NULL;
1329         ts_label_t      *mnt_tsl;
1330         bslabel_t       *mnt_sl;
1331         bslabel_t       ds_sl;
1332         char            ds_hexsl[MAXNAMELEN];
1333
1334         retv = EACCES;                          /* assume the worst */
1335
1336         /*
1337          * Start by getting the dataset label if it exists.
1338          */
1339         error = dsl_prop_get(osname, zfs_prop_to_name(ZFS_PROP_MLSLABEL),
1340             1, sizeof (ds_hexsl), &ds_hexsl, NULL);
1341         if (error)
1342                 return (SET_ERROR(EACCES));
1343
1344         /*
1345          * If labeling is NOT enabled, then disallow the mount of datasets
1346          * which have a non-default label already.  No other label checks
1347          * are needed.
1348          */
1349         if (!is_system_labeled()) {
1350                 if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0)
1351                         return (0);
1352                 return (SET_ERROR(EACCES));
1353         }
1354
1355         /*
1356          * Get the label of the mountpoint.  If mounting into the global
1357          * zone (i.e. mountpoint is not within an active zone and the
1358          * zoned property is off), the label must be default or
1359          * admin_low/admin_high only; no other checks are needed.
1360          */
1361         mntzone = zone_find_by_any_path(refstr_value(vfsp->vfs_mntpt), B_FALSE);
1362         if (mntzone->zone_id == GLOBAL_ZONEID) {
1363                 uint64_t zoned;
1364
1365                 zone_rele(mntzone);
1366
1367                 if (dsl_prop_get_integer(osname,
1368                     zfs_prop_to_name(ZFS_PROP_ZONED), &zoned, NULL))
1369                         return (SET_ERROR(EACCES));
1370                 if (!zoned)
1371                         return (zfs_check_global_label(osname, ds_hexsl));
1372                 else
1373                         /*
1374                          * This is the case of a zone dataset being mounted
1375                          * initially, before the zone has been fully created;
1376                          * allow this mount into global zone.
1377                          */
1378                         return (0);
1379         }
1380
1381         mnt_tsl = mntzone->zone_slabel;
1382         ASSERT(mnt_tsl != NULL);
1383         label_hold(mnt_tsl);
1384         mnt_sl = label2bslabel(mnt_tsl);
1385
1386         if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0) {
1387                 /*
1388                  * The dataset doesn't have a real label, so fabricate one.
1389                  */
1390                 char *str = NULL;
1391
1392                 if (l_to_str_internal(mnt_sl, &str) == 0 &&
1393                     dsl_prop_set_string(osname,
1394                     zfs_prop_to_name(ZFS_PROP_MLSLABEL),
1395                     ZPROP_SRC_LOCAL, str) == 0)
1396                         retv = 0;
1397                 if (str != NULL)
1398                         kmem_free(str, strlen(str) + 1);
1399         } else if (hexstr_to_label(ds_hexsl, &ds_sl) == 0) {
1400                 /*
1401                  * Now compare labels to complete the MAC check.  If the
1402                  * labels are equal then allow access.  If the mountpoint
1403                  * label dominates the dataset label, allow readonly access.
1404                  * Otherwise, access is denied.
1405                  */
1406                 if (blequal(mnt_sl, &ds_sl))
1407                         retv = 0;
1408                 else if (bldominates(mnt_sl, &ds_sl)) {
1409                         vfs_setmntopt(vfsp, MNTOPT_RO, NULL, 0);
1410                         retv = 0;
1411                 }
1412         }
1413
1414         label_rele(mnt_tsl);
1415         zone_rele(mntzone);
1416         return (retv);
1417 }
1418 #endif  /* SECLABEL */
1419
1420 #ifdef OPENSOLARIS_MOUNTROOT
1421 static int
1422 zfs_mountroot(vfs_t *vfsp, enum whymountroot why)
1423 {
1424         int error = 0;
1425         static int zfsrootdone = 0;
1426         zfsvfs_t *zfsvfs = NULL;
1427         znode_t *zp = NULL;
1428         vnode_t *vp = NULL;
1429         char *zfs_bootfs;
1430         char *zfs_devid;
1431
1432         ASSERT(vfsp);
1433
1434         /*
1435          * The filesystem that we mount as root is defined in the
1436          * boot property "zfs-bootfs" with a format of
1437          * "poolname/root-dataset-objnum".
1438          */
1439         if (why == ROOT_INIT) {
1440                 if (zfsrootdone++)
1441                         return (SET_ERROR(EBUSY));
1442                 /*
1443                  * the process of doing a spa_load will require the
1444                  * clock to be set before we could (for example) do
1445                  * something better by looking at the timestamp on
1446                  * an uberblock, so just set it to -1.
1447                  */
1448                 clkset(-1);
1449
1450                 if ((zfs_bootfs = spa_get_bootprop("zfs-bootfs")) == NULL) {
1451                         cmn_err(CE_NOTE, "spa_get_bootfs: can not get "
1452                             "bootfs name");
1453                         return (SET_ERROR(EINVAL));
1454                 }
1455                 zfs_devid = spa_get_bootprop("diskdevid");
1456                 error = spa_import_rootpool(rootfs.bo_name, zfs_devid);
1457                 if (zfs_devid)
1458                         spa_free_bootprop(zfs_devid);
1459                 if (error) {
1460                         spa_free_bootprop(zfs_bootfs);
1461                         cmn_err(CE_NOTE, "spa_import_rootpool: error %d",
1462                             error);
1463                         return (error);
1464                 }
1465                 if (error = zfs_parse_bootfs(zfs_bootfs, rootfs.bo_name)) {
1466                         spa_free_bootprop(zfs_bootfs);
1467                         cmn_err(CE_NOTE, "zfs_parse_bootfs: error %d",
1468                             error);
1469                         return (error);
1470                 }
1471
1472                 spa_free_bootprop(zfs_bootfs);
1473
1474                 if (error = vfs_lock(vfsp))
1475                         return (error);
1476
1477                 if (error = zfs_domount(vfsp, rootfs.bo_name)) {
1478                         cmn_err(CE_NOTE, "zfs_domount: error %d", error);
1479                         goto out;
1480                 }
1481
1482                 zfsvfs = (zfsvfs_t *)vfsp->vfs_data;
1483                 ASSERT(zfsvfs);
1484                 if (error = zfs_zget(zfsvfs, zfsvfs->z_root, &zp)) {
1485                         cmn_err(CE_NOTE, "zfs_zget: error %d", error);
1486                         goto out;
1487                 }
1488
1489                 vp = ZTOV(zp);
1490                 mutex_enter(&vp->v_lock);
1491                 vp->v_flag |= VROOT;
1492                 mutex_exit(&vp->v_lock);
1493                 rootvp = vp;
1494
1495                 /*
1496                  * Leave rootvp held.  The root file system is never unmounted.
1497                  */
1498
1499                 vfs_add((struct vnode *)0, vfsp,
1500                     (vfsp->vfs_flag & VFS_RDONLY) ? MS_RDONLY : 0);
1501 out:
1502                 vfs_unlock(vfsp);
1503                 return (error);
1504         } else if (why == ROOT_REMOUNT) {
1505                 readonly_changed_cb(vfsp->vfs_data, B_FALSE);
1506                 vfsp->vfs_flag |= VFS_REMOUNT;
1507
1508                 /* refresh mount options */
1509                 zfs_unregister_callbacks(vfsp->vfs_data);
1510                 return (zfs_register_callbacks(vfsp));
1511
1512         } else if (why == ROOT_UNMOUNT) {
1513                 zfs_unregister_callbacks((zfsvfs_t *)vfsp->vfs_data);
1514                 (void) zfs_sync(vfsp, 0, 0);
1515                 return (0);
1516         }
1517
1518         /*
1519          * if "why" is equal to anything else other than ROOT_INIT,
1520          * ROOT_REMOUNT, or ROOT_UNMOUNT, we do not support it.
1521          */
1522         return (SET_ERROR(ENOTSUP));
1523 }
1524 #endif  /* OPENSOLARIS_MOUNTROOT */
1525
1526 static int
1527 getpoolname(const char *osname, char *poolname)
1528 {
1529         char *p;
1530
1531         p = strchr(osname, '/');
1532         if (p == NULL) {
1533                 if (strlen(osname) >= MAXNAMELEN)
1534                         return (ENAMETOOLONG);
1535                 (void) strcpy(poolname, osname);
1536         } else {
1537                 if (p - osname >= MAXNAMELEN)
1538                         return (ENAMETOOLONG);
1539                 (void) strncpy(poolname, osname, p - osname);
1540                 poolname[p - osname] = '\0';
1541         }
1542         return (0);
1543 }
1544
1545 /*ARGSUSED*/
1546 static int
1547 zfs_mount(vfs_t *vfsp)
1548 {
1549         kthread_t       *td = curthread;
1550         vnode_t         *mvp = vfsp->mnt_vnodecovered;
1551         cred_t          *cr = td->td_ucred;
1552         char            *osname;
1553         int             error = 0;
1554         int             canwrite;
1555
1556 #ifdef illumos
1557         if (mvp->v_type != VDIR)
1558                 return (SET_ERROR(ENOTDIR));
1559
1560         mutex_enter(&mvp->v_lock);
1561         if ((uap->flags & MS_REMOUNT) == 0 &&
1562             (uap->flags & MS_OVERLAY) == 0 &&
1563             (mvp->v_count != 1 || (mvp->v_flag & VROOT))) {
1564                 mutex_exit(&mvp->v_lock);
1565                 return (SET_ERROR(EBUSY));
1566         }
1567         mutex_exit(&mvp->v_lock);
1568
1569         /*
1570          * ZFS does not support passing unparsed data in via MS_DATA.
1571          * Users should use the MS_OPTIONSTR interface; this means
1572          * that all option parsing is already done and the options struct
1573          * can be interrogated.
1574          */
1575         if ((uap->flags & MS_DATA) && uap->datalen > 0)
1576 #else   /* !illumos */
1577         if (!prison_allow(td->td_ucred, PR_ALLOW_MOUNT_ZFS))
1578                 return (SET_ERROR(EPERM));
1579
1580         if (vfs_getopt(vfsp->mnt_optnew, "from", (void **)&osname, NULL))
1581                 return (SET_ERROR(EINVAL));
1582 #endif  /* illumos */
1583
1584         /*
1585          * If full-owner-access is enabled and delegated administration is
1586          * turned on, we must set nosuid.
1587          */
1588         if (zfs_super_owner &&
1589             dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr) != ECANCELED) {
1590                 secpolicy_fs_mount_clearopts(cr, vfsp);
1591         }
1592
1593         /*
1594          * Check for mount privilege?
1595          *
1596          * If we don't have privilege then see if
1597          * we have local permission to allow it
1598          */
1599         error = secpolicy_fs_mount(cr, mvp, vfsp);
1600         if (error) {
1601                 if (dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr) != 0)
1602                         goto out;
1603
1604                 if (!(vfsp->vfs_flag & MS_REMOUNT)) {
1605                         vattr_t         vattr;
1606
1607                         /*
1608                          * Make sure user is the owner of the mount point
1609                          * or has sufficient privileges.
1610                          */
1611
1612                         vattr.va_mask = AT_UID;
1613
1614                         vn_lock(mvp, LK_SHARED | LK_RETRY);
1615                         if (VOP_GETATTR(mvp, &vattr, cr)) {
1616                                 VOP_UNLOCK(mvp, 0);
1617                                 goto out;
1618                         }
1619
1620                         if (secpolicy_vnode_owner(mvp, cr, vattr.va_uid) != 0 &&
1621                             VOP_ACCESS(mvp, VWRITE, cr, td) != 0) {
1622                                 VOP_UNLOCK(mvp, 0);
1623                                 goto out;
1624                         }
1625                         VOP_UNLOCK(mvp, 0);
1626                 }
1627
1628                 secpolicy_fs_mount_clearopts(cr, vfsp);
1629         }
1630
1631         /*
1632          * Refuse to mount a filesystem if we are in a local zone and the
1633          * dataset is not visible.
1634          */
1635         if (!INGLOBALZONE(curthread) &&
1636             (!zone_dataset_visible(osname, &canwrite) || !canwrite)) {
1637                 error = SET_ERROR(EPERM);
1638                 goto out;
1639         }
1640
1641 #ifdef SECLABEL
1642         error = zfs_mount_label_policy(vfsp, osname);
1643         if (error)
1644                 goto out;
1645 #endif
1646
1647         vfsp->vfs_flag |= MNT_NFS4ACLS;
1648
1649         /*
1650          * When doing a remount, we simply refresh our temporary properties
1651          * according to those options set in the current VFS options.
1652          */
1653         if (vfsp->vfs_flag & MS_REMOUNT) {
1654                 zfsvfs_t *zfsvfs = vfsp->vfs_data;
1655
1656                 /*
1657                  * Refresh mount options with z_teardown_lock blocking I/O while
1658                  * the filesystem is in an inconsistent state.
1659                  * The lock also serializes this code with filesystem
1660                  * manipulations between entry to zfs_suspend_fs() and return
1661                  * from zfs_resume_fs().
1662                  */
1663                 rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1664                 zfs_unregister_callbacks(zfsvfs);
1665                 error = zfs_register_callbacks(vfsp);
1666                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1667                 goto out;
1668         }
1669
1670         /* Initial root mount: try hard to import the requested root pool. */
1671         if ((vfsp->vfs_flag & MNT_ROOTFS) != 0 &&
1672             (vfsp->vfs_flag & MNT_UPDATE) == 0) {
1673                 char pname[MAXNAMELEN];
1674
1675                 error = getpoolname(osname, pname);
1676                 if (error == 0)
1677                         error = spa_import_rootpool(pname);
1678                 if (error)
1679                         goto out;
1680         }
1681         DROP_GIANT();
1682         error = zfs_domount(vfsp, osname);
1683         PICKUP_GIANT();
1684
1685 #ifdef illumos
1686         /*
1687          * Add an extra VFS_HOLD on our parent vfs so that it can't
1688          * disappear due to a forced unmount.
1689          */
1690         if (error == 0 && ((zfsvfs_t *)vfsp->vfs_data)->z_issnap)
1691                 VFS_HOLD(mvp->v_vfsp);
1692 #endif
1693
1694 out:
1695         return (error);
1696 }
1697
1698 static int
1699 zfs_statfs(vfs_t *vfsp, struct statfs *statp)
1700 {
1701         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1702         uint64_t refdbytes, availbytes, usedobjs, availobjs;
1703
1704         statp->f_version = STATFS_VERSION;
1705
1706         ZFS_ENTER(zfsvfs);
1707
1708         dmu_objset_space(zfsvfs->z_os,
1709             &refdbytes, &availbytes, &usedobjs, &availobjs);
1710
1711         /*
1712          * The underlying storage pool actually uses multiple block sizes.
1713          * We report the fragsize as the smallest block size we support,
1714          * and we report our blocksize as the filesystem's maximum blocksize.
1715          */
1716         statp->f_bsize = SPA_MINBLOCKSIZE;
1717         statp->f_iosize = zfsvfs->z_vfs->mnt_stat.f_iosize;
1718
1719         /*
1720          * The following report "total" blocks of various kinds in the
1721          * file system, but reported in terms of f_frsize - the
1722          * "fragment" size.
1723          */
1724
1725         statp->f_blocks = (refdbytes + availbytes) >> SPA_MINBLOCKSHIFT;
1726         statp->f_bfree = availbytes / statp->f_bsize;
1727         statp->f_bavail = statp->f_bfree; /* no root reservation */
1728
1729         /*
1730          * statvfs() should really be called statufs(), because it assumes
1731          * static metadata.  ZFS doesn't preallocate files, so the best
1732          * we can do is report the max that could possibly fit in f_files,
1733          * and that minus the number actually used in f_ffree.
1734          * For f_ffree, report the smaller of the number of object available
1735          * and the number of blocks (each object will take at least a block).
1736          */
1737         statp->f_ffree = MIN(availobjs, statp->f_bfree);
1738         statp->f_files = statp->f_ffree + usedobjs;
1739
1740         /*
1741          * We're a zfs filesystem.
1742          */
1743         (void) strlcpy(statp->f_fstypename, "zfs", sizeof(statp->f_fstypename));
1744
1745         strlcpy(statp->f_mntfromname, vfsp->mnt_stat.f_mntfromname,
1746             sizeof(statp->f_mntfromname));
1747         strlcpy(statp->f_mntonname, vfsp->mnt_stat.f_mntonname,
1748             sizeof(statp->f_mntonname));
1749
1750         statp->f_namemax = ZFS_MAXNAMELEN;
1751
1752         ZFS_EXIT(zfsvfs);
1753         return (0);
1754 }
1755
1756 static int
1757 zfs_root(vfs_t *vfsp, int flags, vnode_t **vpp)
1758 {
1759         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1760         znode_t *rootzp;
1761         int error;
1762
1763         ZFS_ENTER(zfsvfs);
1764
1765         error = zfs_zget(zfsvfs, zfsvfs->z_root, &rootzp);
1766         if (error == 0)
1767                 *vpp = ZTOV(rootzp);
1768
1769         ZFS_EXIT(zfsvfs);
1770
1771         if (error == 0) {
1772                 error = vn_lock(*vpp, flags);
1773                 if (error == 0)
1774                         (*vpp)->v_vflag |= VV_ROOT;
1775         }
1776         if (error != 0)
1777                 *vpp = NULL;
1778
1779         return (error);
1780 }
1781
1782 /*
1783  * Teardown the zfsvfs::z_os.
1784  *
1785  * Note, if 'unmounting' if FALSE, we return with the 'z_teardown_lock'
1786  * and 'z_teardown_inactive_lock' held.
1787  */
1788 static int
1789 zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting)
1790 {
1791         znode_t *zp;
1792
1793         rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1794
1795         if (!unmounting) {
1796                 /*
1797                  * We purge the parent filesystem's vfsp as the parent
1798                  * filesystem and all of its snapshots have their vnode's
1799                  * v_vfsp set to the parent's filesystem's vfsp.  Note,
1800                  * 'z_parent' is self referential for non-snapshots.
1801                  */
1802                 (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
1803 #ifdef FREEBSD_NAMECACHE
1804                 cache_purgevfs(zfsvfs->z_parent->z_vfs);
1805 #endif
1806         }
1807
1808         /*
1809          * Close the zil. NB: Can't close the zil while zfs_inactive
1810          * threads are blocked as zil_close can call zfs_inactive.
1811          */
1812         if (zfsvfs->z_log) {
1813                 zil_close(zfsvfs->z_log);
1814                 zfsvfs->z_log = NULL;
1815         }
1816
1817         rw_enter(&zfsvfs->z_teardown_inactive_lock, RW_WRITER);
1818
1819         /*
1820          * If we are not unmounting (ie: online recv) and someone already
1821          * unmounted this file system while we were doing the switcheroo,
1822          * or a reopen of z_os failed then just bail out now.
1823          */
1824         if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
1825                 rw_exit(&zfsvfs->z_teardown_inactive_lock);
1826                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1827                 return (SET_ERROR(EIO));
1828         }
1829
1830         /*
1831          * At this point there are no vops active, and any new vops will
1832          * fail with EIO since we have z_teardown_lock for writer (only
1833          * relavent for forced unmount).
1834          *
1835          * Release all holds on dbufs.
1836          */
1837         mutex_enter(&zfsvfs->z_znodes_lock);
1838         for (zp = list_head(&zfsvfs->z_all_znodes); zp != NULL;
1839             zp = list_next(&zfsvfs->z_all_znodes, zp))
1840                 if (zp->z_sa_hdl) {
1841                         ASSERT(ZTOV(zp)->v_count >= 0);
1842                         zfs_znode_dmu_fini(zp);
1843                 }
1844         mutex_exit(&zfsvfs->z_znodes_lock);
1845
1846         /*
1847          * If we are unmounting, set the unmounted flag and let new vops
1848          * unblock.  zfs_inactive will have the unmounted behavior, and all
1849          * other vops will fail with EIO.
1850          */
1851         if (unmounting) {
1852                 zfsvfs->z_unmounted = B_TRUE;
1853                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1854                 rw_exit(&zfsvfs->z_teardown_inactive_lock);
1855         }
1856
1857         /*
1858          * z_os will be NULL if there was an error in attempting to reopen
1859          * zfsvfs, so just return as the properties had already been
1860          * unregistered and cached data had been evicted before.
1861          */
1862         if (zfsvfs->z_os == NULL)
1863                 return (0);
1864
1865         /*
1866          * Unregister properties.
1867          */
1868         zfs_unregister_callbacks(zfsvfs);
1869
1870         /*
1871          * Evict cached data
1872          */
1873         if (dsl_dataset_is_dirty(dmu_objset_ds(zfsvfs->z_os)) &&
1874             !(zfsvfs->z_vfs->vfs_flag & VFS_RDONLY))
1875                 txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
1876         dmu_objset_evict_dbufs(zfsvfs->z_os);
1877
1878         return (0);
1879 }
1880
1881 /*ARGSUSED*/
1882 static int
1883 zfs_umount(vfs_t *vfsp, int fflag)
1884 {
1885         kthread_t *td = curthread;
1886         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1887         objset_t *os;
1888         cred_t *cr = td->td_ucred;
1889         int ret;
1890
1891         ret = secpolicy_fs_unmount(cr, vfsp);
1892         if (ret) {
1893                 if (dsl_deleg_access((char *)refstr_value(vfsp->vfs_resource),
1894                     ZFS_DELEG_PERM_MOUNT, cr))
1895                         return (ret);
1896         }
1897
1898         /*
1899          * We purge the parent filesystem's vfsp as the parent filesystem
1900          * and all of its snapshots have their vnode's v_vfsp set to the
1901          * parent's filesystem's vfsp.  Note, 'z_parent' is self
1902          * referential for non-snapshots.
1903          */
1904         (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
1905
1906         /*
1907          * Unmount any snapshots mounted under .zfs before unmounting the
1908          * dataset itself.
1909          */
1910         if (zfsvfs->z_ctldir != NULL) {
1911                 if ((ret = zfsctl_umount_snapshots(vfsp, fflag, cr)) != 0)
1912                         return (ret);
1913                 ret = vflush(vfsp, 0, 0, td);
1914                 ASSERT(ret == EBUSY);
1915                 if (!(fflag & MS_FORCE)) {
1916                         if (zfsvfs->z_ctldir->v_count > 1)
1917                                 return (EBUSY);
1918                         ASSERT(zfsvfs->z_ctldir->v_count == 1);
1919                 }
1920                 zfsctl_destroy(zfsvfs);
1921                 ASSERT(zfsvfs->z_ctldir == NULL);
1922         }
1923
1924         if (fflag & MS_FORCE) {
1925                 /*
1926                  * Mark file system as unmounted before calling
1927                  * vflush(FORCECLOSE). This way we ensure no future vnops
1928                  * will be called and risk operating on DOOMED vnodes.
1929                  */
1930                 rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1931                 zfsvfs->z_unmounted = B_TRUE;
1932                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1933         }
1934
1935         /*
1936          * Flush all the files.
1937          */
1938         ret = vflush(vfsp, 0, (fflag & MS_FORCE) ? FORCECLOSE : 0, td);
1939         if (ret != 0) {
1940                 if (!zfsvfs->z_issnap) {
1941                         zfsctl_create(zfsvfs);
1942                         ASSERT(zfsvfs->z_ctldir != NULL);
1943                 }
1944                 return (ret);
1945         }
1946
1947 #ifdef illumos
1948         if (!(fflag & MS_FORCE)) {
1949                 /*
1950                  * Check the number of active vnodes in the file system.
1951                  * Our count is maintained in the vfs structure, but the
1952                  * number is off by 1 to indicate a hold on the vfs
1953                  * structure itself.
1954                  *
1955                  * The '.zfs' directory maintains a reference of its
1956                  * own, and any active references underneath are
1957                  * reflected in the vnode count.
1958                  */
1959                 if (zfsvfs->z_ctldir == NULL) {
1960                         if (vfsp->vfs_count > 1)
1961                                 return (SET_ERROR(EBUSY));
1962                 } else {
1963                         if (vfsp->vfs_count > 2 ||
1964                             zfsvfs->z_ctldir->v_count > 1)
1965                                 return (SET_ERROR(EBUSY));
1966                 }
1967         }
1968 #endif
1969
1970         VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0);
1971         os = zfsvfs->z_os;
1972
1973         /*
1974          * z_os will be NULL if there was an error in
1975          * attempting to reopen zfsvfs.
1976          */
1977         if (os != NULL) {
1978                 /*
1979                  * Unset the objset user_ptr.
1980                  */
1981                 mutex_enter(&os->os_user_ptr_lock);
1982                 dmu_objset_set_user(os, NULL);
1983                 mutex_exit(&os->os_user_ptr_lock);
1984
1985                 /*
1986                  * Finally release the objset
1987                  */
1988                 dmu_objset_disown(os, zfsvfs);
1989         }
1990
1991         /*
1992          * We can now safely destroy the '.zfs' directory node.
1993          */
1994         if (zfsvfs->z_ctldir != NULL)
1995                 zfsctl_destroy(zfsvfs);
1996         if (zfsvfs->z_issnap) {
1997                 vnode_t *svp = vfsp->mnt_vnodecovered;
1998
1999                 if (svp->v_count >= 2)
2000                         VN_RELE(svp);
2001         }
2002         zfs_freevfs(vfsp);
2003
2004         return (0);
2005 }
2006
2007 static int
2008 zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp)
2009 {
2010         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2011         znode_t         *zp;
2012         int             err;
2013
2014         /*
2015          * zfs_zget() can't operate on virtual entries like .zfs/ or
2016          * .zfs/snapshot/ directories, that's why we return EOPNOTSUPP.
2017          * This will make NFS to switch to LOOKUP instead of using VGET.
2018          */
2019         if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR ||
2020             (zfsvfs->z_shares_dir != 0 && ino == zfsvfs->z_shares_dir))
2021                 return (EOPNOTSUPP);
2022
2023         ZFS_ENTER(zfsvfs);
2024         err = zfs_zget(zfsvfs, ino, &zp);
2025         if (err == 0 && zp->z_unlinked) {
2026                 VN_RELE(ZTOV(zp));
2027                 err = EINVAL;
2028         }
2029         if (err == 0)
2030                 *vpp = ZTOV(zp);
2031         ZFS_EXIT(zfsvfs);
2032         if (err == 0)
2033                 err = vn_lock(*vpp, flags);
2034         if (err != 0)
2035                 *vpp = NULL;
2036         return (err);
2037 }
2038
2039 static int
2040 zfs_checkexp(vfs_t *vfsp, struct sockaddr *nam, int *extflagsp,
2041     struct ucred **credanonp, int *numsecflavors, int **secflavors)
2042 {
2043         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2044
2045         /*
2046          * If this is regular file system vfsp is the same as
2047          * zfsvfs->z_parent->z_vfs, but if it is snapshot,
2048          * zfsvfs->z_parent->z_vfs represents parent file system
2049          * which we have to use here, because only this file system
2050          * has mnt_export configured.
2051          */
2052         return (vfs_stdcheckexp(zfsvfs->z_parent->z_vfs, nam, extflagsp,
2053             credanonp, numsecflavors, secflavors));
2054 }
2055
2056 CTASSERT(SHORT_FID_LEN <= sizeof(struct fid));
2057 CTASSERT(LONG_FID_LEN <= sizeof(struct fid));
2058
2059 static int
2060 zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
2061 {
2062         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2063         znode_t         *zp;
2064         uint64_t        object = 0;
2065         uint64_t        fid_gen = 0;
2066         uint64_t        gen_mask;
2067         uint64_t        zp_gen;
2068         int             i, err;
2069
2070         *vpp = NULL;
2071
2072         ZFS_ENTER(zfsvfs);
2073
2074         /*
2075          * On FreeBSD we can get snapshot's mount point or its parent file
2076          * system mount point depending if snapshot is already mounted or not.
2077          */
2078         if (zfsvfs->z_parent == zfsvfs && fidp->fid_len == LONG_FID_LEN) {
2079                 zfid_long_t     *zlfid = (zfid_long_t *)fidp;
2080                 uint64_t        objsetid = 0;
2081                 uint64_t        setgen = 0;
2082
2083                 for (i = 0; i < sizeof (zlfid->zf_setid); i++)
2084                         objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
2085
2086                 for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
2087                         setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i);
2088
2089                 ZFS_EXIT(zfsvfs);
2090
2091                 err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs);
2092                 if (err)
2093                         return (SET_ERROR(EINVAL));
2094                 ZFS_ENTER(zfsvfs);
2095         }
2096
2097         if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) {
2098                 zfid_short_t    *zfid = (zfid_short_t *)fidp;
2099
2100                 for (i = 0; i < sizeof (zfid->zf_object); i++)
2101                         object |= ((uint64_t)zfid->zf_object[i]) << (8 * i);
2102
2103                 for (i = 0; i < sizeof (zfid->zf_gen); i++)
2104                         fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i);
2105         } else {
2106                 ZFS_EXIT(zfsvfs);
2107                 return (SET_ERROR(EINVAL));
2108         }
2109
2110         /*
2111          * A zero fid_gen means we are in .zfs or the .zfs/snapshot
2112          * directory tree. If the object == zfsvfs->z_shares_dir, then
2113          * we are in the .zfs/shares directory tree.
2114          */
2115         if ((fid_gen == 0 &&
2116              (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) ||
2117             (zfsvfs->z_shares_dir != 0 && object == zfsvfs->z_shares_dir)) {
2118                 *vpp = zfsvfs->z_ctldir;
2119                 ASSERT(*vpp != NULL);
2120                 if (object == ZFSCTL_INO_SNAPDIR) {
2121                         VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL,
2122                             0, NULL, NULL, NULL, NULL, NULL) == 0);
2123                 } else if (object == zfsvfs->z_shares_dir) {
2124                         VERIFY(zfsctl_root_lookup(*vpp, "shares", vpp, NULL,
2125                             0, NULL, NULL, NULL, NULL, NULL) == 0);
2126                 } else {
2127                         VN_HOLD(*vpp);
2128                 }
2129                 ZFS_EXIT(zfsvfs);
2130                 err = vn_lock(*vpp, flags);
2131                 if (err != 0)
2132                         *vpp = NULL;
2133                 return (err);
2134         }
2135
2136         gen_mask = -1ULL >> (64 - 8 * i);
2137
2138         dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask);
2139         if (err = zfs_zget(zfsvfs, object, &zp)) {
2140                 ZFS_EXIT(zfsvfs);
2141                 return (err);
2142         }
2143         (void) sa_lookup(zp->z_sa_hdl, SA_ZPL_GEN(zfsvfs), &zp_gen,
2144             sizeof (uint64_t));
2145         zp_gen = zp_gen & gen_mask;
2146         if (zp_gen == 0)
2147                 zp_gen = 1;
2148         if (zp->z_unlinked || zp_gen != fid_gen) {
2149                 dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen);
2150                 VN_RELE(ZTOV(zp));
2151                 ZFS_EXIT(zfsvfs);
2152                 return (SET_ERROR(EINVAL));
2153         }
2154
2155         *vpp = ZTOV(zp);
2156         ZFS_EXIT(zfsvfs);
2157         err = vn_lock(*vpp, flags | LK_RETRY);
2158         if (err == 0)
2159                 vnode_create_vobject(*vpp, zp->z_size, curthread);
2160         else
2161                 *vpp = NULL;
2162         return (err);
2163 }
2164
2165 /*
2166  * Block out VOPs and close zfsvfs_t::z_os
2167  *
2168  * Note, if successful, then we return with the 'z_teardown_lock' and
2169  * 'z_teardown_inactive_lock' write held.  We leave ownership of the underlying
2170  * dataset and objset intact so that they can be atomically handed off during
2171  * a subsequent rollback or recv operation and the resume thereafter.
2172  */
2173 int
2174 zfs_suspend_fs(zfsvfs_t *zfsvfs)
2175 {
2176         int error;
2177
2178         if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0)
2179                 return (error);
2180
2181         return (0);
2182 }
2183
2184 /*
2185  * Rebuild SA and release VOPs.  Note that ownership of the underlying dataset
2186  * is an invariant across any of the operations that can be performed while the
2187  * filesystem was suspended.  Whether it succeeded or failed, the preconditions
2188  * are the same: the relevant objset and associated dataset are owned by
2189  * zfsvfs, held, and long held on entry.
2190  */
2191 int
2192 zfs_resume_fs(zfsvfs_t *zfsvfs, const char *osname)
2193 {
2194         int err;
2195         znode_t *zp;
2196         uint64_t sa_obj = 0;
2197
2198         ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
2199         ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock));
2200
2201         /*
2202          * We already own this, so just hold and rele it to update the
2203          * objset_t, as the one we had before may have been evicted.
2204          */
2205         VERIFY0(dmu_objset_hold(osname, zfsvfs, &zfsvfs->z_os));
2206         VERIFY3P(zfsvfs->z_os->os_dsl_dataset->ds_owner, ==, zfsvfs);
2207         VERIFY(dsl_dataset_long_held(zfsvfs->z_os->os_dsl_dataset));
2208         dmu_objset_rele(zfsvfs->z_os, zfsvfs);
2209
2210         /*
2211          * Make sure version hasn't changed
2212          */
2213
2214         err = zfs_get_zplprop(zfsvfs->z_os, ZFS_PROP_VERSION,
2215             &zfsvfs->z_version);
2216
2217         if (err)
2218                 goto bail;
2219
2220         err = zap_lookup(zfsvfs->z_os, MASTER_NODE_OBJ,
2221             ZFS_SA_ATTRS, 8, 1, &sa_obj);
2222
2223         if (err && zfsvfs->z_version >= ZPL_VERSION_SA)
2224                 goto bail;
2225
2226         if ((err = sa_setup(zfsvfs->z_os, sa_obj,
2227             zfs_attr_table,  ZPL_END, &zfsvfs->z_attr_table)) != 0)
2228                 goto bail;
2229
2230         if (zfsvfs->z_version >= ZPL_VERSION_SA)
2231                 sa_register_update_callback(zfsvfs->z_os,
2232                     zfs_sa_upgrade);
2233
2234         VERIFY(zfsvfs_setup(zfsvfs, B_FALSE) == 0);
2235
2236         zfs_set_fuid_feature(zfsvfs);
2237
2238         /*
2239          * Attempt to re-establish all the active znodes with
2240          * their dbufs.  If a zfs_rezget() fails, then we'll let
2241          * any potential callers discover that via ZFS_ENTER_VERIFY_VP
2242          * when they try to use their znode.
2243          */
2244         mutex_enter(&zfsvfs->z_znodes_lock);
2245         for (zp = list_head(&zfsvfs->z_all_znodes); zp;
2246             zp = list_next(&zfsvfs->z_all_znodes, zp)) {
2247                 (void) zfs_rezget(zp);
2248         }
2249         mutex_exit(&zfsvfs->z_znodes_lock);
2250
2251 bail:
2252         /* release the VOPs */
2253         rw_exit(&zfsvfs->z_teardown_inactive_lock);
2254         rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
2255
2256         if (err) {
2257                 /*
2258                  * Since we couldn't setup the sa framework, try to force
2259                  * unmount this file system.
2260                  */
2261                 if (vn_vfswlock(zfsvfs->z_vfs->vfs_vnodecovered) == 0) {
2262                         vfs_ref(zfsvfs->z_vfs);
2263                         (void) dounmount(zfsvfs->z_vfs, MS_FORCE, curthread);
2264                 }
2265         }
2266         return (err);
2267 }
2268
2269 static void
2270 zfs_freevfs(vfs_t *vfsp)
2271 {
2272         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2273
2274 #ifdef illumos
2275         /*
2276          * If this is a snapshot, we have an extra VFS_HOLD on our parent
2277          * from zfs_mount().  Release it here.  If we came through
2278          * zfs_mountroot() instead, we didn't grab an extra hold, so
2279          * skip the VFS_RELE for rootvfs.
2280          */
2281         if (zfsvfs->z_issnap && (vfsp != rootvfs))
2282                 VFS_RELE(zfsvfs->z_parent->z_vfs);
2283 #endif
2284
2285         zfsvfs_free(zfsvfs);
2286
2287         atomic_dec_32(&zfs_active_fs_count);
2288 }
2289
2290 #ifdef __i386__
2291 static int desiredvnodes_backup;
2292 #endif
2293
2294 static void
2295 zfs_vnodes_adjust(void)
2296 {
2297 #ifdef __i386__
2298         int newdesiredvnodes;
2299
2300         desiredvnodes_backup = desiredvnodes;
2301
2302         /*
2303          * We calculate newdesiredvnodes the same way it is done in
2304          * vntblinit(). If it is equal to desiredvnodes, it means that
2305          * it wasn't tuned by the administrator and we can tune it down.
2306          */
2307         newdesiredvnodes = min(maxproc + cnt.v_page_count / 4, 2 *
2308             vm_kmem_size / (5 * (sizeof(struct vm_object) +
2309             sizeof(struct vnode))));
2310         if (newdesiredvnodes == desiredvnodes)
2311                 desiredvnodes = (3 * newdesiredvnodes) / 4;
2312 #endif
2313 }
2314
2315 static void
2316 zfs_vnodes_adjust_back(void)
2317 {
2318
2319 #ifdef __i386__
2320         desiredvnodes = desiredvnodes_backup;
2321 #endif
2322 }
2323
2324 void
2325 zfs_init(void)
2326 {
2327
2328         printf("ZFS filesystem version: " ZPL_VERSION_STRING "\n");
2329
2330         /*
2331          * Initialize .zfs directory structures
2332          */
2333         zfsctl_init();
2334
2335         /*
2336          * Initialize znode cache, vnode ops, etc...
2337          */
2338         zfs_znode_init();
2339
2340         /*
2341          * Reduce number of vnodes. Originally number of vnodes is calculated
2342          * with UFS inode in mind. We reduce it here, because it's too big for
2343          * ZFS/i386.
2344          */
2345         zfs_vnodes_adjust();
2346
2347         dmu_objset_register_type(DMU_OST_ZFS, zfs_space_delta_cb);
2348 }
2349
2350 void
2351 zfs_fini(void)
2352 {
2353         zfsctl_fini();
2354         zfs_znode_fini();
2355         zfs_vnodes_adjust_back();
2356 }
2357
2358 int
2359 zfs_busy(void)
2360 {
2361         return (zfs_active_fs_count != 0);
2362 }
2363
2364 int
2365 zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers)
2366 {
2367         int error;
2368         objset_t *os = zfsvfs->z_os;
2369         dmu_tx_t *tx;
2370
2371         if (newvers < ZPL_VERSION_INITIAL || newvers > ZPL_VERSION)
2372                 return (SET_ERROR(EINVAL));
2373
2374         if (newvers < zfsvfs->z_version)
2375                 return (SET_ERROR(EINVAL));
2376
2377         if (zfs_spa_version_map(newvers) >
2378             spa_version(dmu_objset_spa(zfsvfs->z_os)))
2379                 return (SET_ERROR(ENOTSUP));
2380
2381         tx = dmu_tx_create(os);
2382         dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_FALSE, ZPL_VERSION_STR);
2383         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2384                 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE,
2385                     ZFS_SA_ATTRS);
2386                 dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
2387         }
2388         error = dmu_tx_assign(tx, TXG_WAIT);
2389         if (error) {
2390                 dmu_tx_abort(tx);
2391                 return (error);
2392         }
2393
2394         error = zap_update(os, MASTER_NODE_OBJ, ZPL_VERSION_STR,
2395             8, 1, &newvers, tx);
2396
2397         if (error) {
2398                 dmu_tx_commit(tx);
2399                 return (error);
2400         }
2401
2402         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2403                 uint64_t sa_obj;
2404
2405                 ASSERT3U(spa_version(dmu_objset_spa(zfsvfs->z_os)), >=,
2406                     SPA_VERSION_SA);
2407                 sa_obj = zap_create(os, DMU_OT_SA_MASTER_NODE,
2408                     DMU_OT_NONE, 0, tx);
2409
2410                 error = zap_add(os, MASTER_NODE_OBJ,
2411                     ZFS_SA_ATTRS, 8, 1, &sa_obj, tx);
2412                 ASSERT0(error);
2413
2414                 VERIFY(0 == sa_set_sa_object(os, sa_obj));
2415                 sa_register_update_callback(os, zfs_sa_upgrade);
2416         }
2417
2418         spa_history_log_internal_ds(dmu_objset_ds(os), "upgrade", tx,
2419             "from %llu to %llu", zfsvfs->z_version, newvers);
2420
2421         dmu_tx_commit(tx);
2422
2423         zfsvfs->z_version = newvers;
2424
2425         zfs_set_fuid_feature(zfsvfs);
2426
2427         return (0);
2428 }
2429
2430 /*
2431  * Read a property stored within the master node.
2432  */
2433 int
2434 zfs_get_zplprop(objset_t *os, zfs_prop_t prop, uint64_t *value)
2435 {
2436         const char *pname;
2437         int error = ENOENT;
2438
2439         /*
2440          * Look up the file system's value for the property.  For the
2441          * version property, we look up a slightly different string.
2442          */
2443         if (prop == ZFS_PROP_VERSION)
2444                 pname = ZPL_VERSION_STR;
2445         else
2446                 pname = zfs_prop_to_name(prop);
2447
2448         if (os != NULL)
2449                 error = zap_lookup(os, MASTER_NODE_OBJ, pname, 8, 1, value);
2450
2451         if (error == ENOENT) {
2452                 /* No value set, use the default value */
2453                 switch (prop) {
2454                 case ZFS_PROP_VERSION:
2455                         *value = ZPL_VERSION;
2456                         break;
2457                 case ZFS_PROP_NORMALIZE:
2458                 case ZFS_PROP_UTF8ONLY:
2459                         *value = 0;
2460                         break;
2461                 case ZFS_PROP_CASE:
2462                         *value = ZFS_CASE_SENSITIVE;
2463                         break;
2464                 default:
2465                         return (error);
2466                 }
2467                 error = 0;
2468         }
2469         return (error);
2470 }
2471
2472 #ifdef _KERNEL
2473 void
2474 zfsvfs_update_fromname(const char *oldname, const char *newname)
2475 {
2476         char tmpbuf[MAXPATHLEN];
2477         struct mount *mp;
2478         char *fromname;
2479         size_t oldlen;
2480
2481         oldlen = strlen(oldname);
2482
2483         mtx_lock(&mountlist_mtx);
2484         TAILQ_FOREACH(mp, &mountlist, mnt_list) {
2485                 fromname = mp->mnt_stat.f_mntfromname;
2486                 if (strcmp(fromname, oldname) == 0) {
2487                         (void)strlcpy(fromname, newname,
2488                             sizeof(mp->mnt_stat.f_mntfromname));
2489                         continue;
2490                 }
2491                 if (strncmp(fromname, oldname, oldlen) == 0 &&
2492                     (fromname[oldlen] == '/' || fromname[oldlen] == '@')) {
2493                         (void)snprintf(tmpbuf, sizeof(tmpbuf), "%s%s",
2494                             newname, fromname + oldlen);
2495                         (void)strlcpy(fromname, tmpbuf,
2496                             sizeof(mp->mnt_stat.f_mntfromname));
2497                         continue;
2498                 }
2499         }
2500         mtx_unlock(&mountlist_mtx);
2501 }
2502 #endif