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