]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
MFC r316858 7280 Allow changing global libzpool variables in zdb
[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 #else   /* !illumos */
1633         if (!prison_allow(td->td_ucred, PR_ALLOW_MOUNT_ZFS))
1634                 return (SET_ERROR(EPERM));
1635
1636         if (vfs_getopt(vfsp->mnt_optnew, "from", (void **)&osname, NULL))
1637                 return (SET_ERROR(EINVAL));
1638 #endif  /* illumos */
1639
1640         /*
1641          * If full-owner-access is enabled and delegated administration is
1642          * turned on, we must set nosuid.
1643          */
1644         if (zfs_super_owner &&
1645             dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr) != ECANCELED) {
1646                 secpolicy_fs_mount_clearopts(cr, vfsp);
1647         }
1648
1649         /*
1650          * Check for mount privilege?
1651          *
1652          * If we don't have privilege then see if
1653          * we have local permission to allow it
1654          */
1655         error = secpolicy_fs_mount(cr, mvp, vfsp);
1656         if (error) {
1657                 if (dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr) != 0)
1658                         goto out;
1659
1660                 if (!(vfsp->vfs_flag & MS_REMOUNT)) {
1661                         vattr_t         vattr;
1662
1663                         /*
1664                          * Make sure user is the owner of the mount point
1665                          * or has sufficient privileges.
1666                          */
1667
1668                         vattr.va_mask = AT_UID;
1669
1670                         vn_lock(mvp, LK_SHARED | LK_RETRY);
1671                         if (VOP_GETATTR(mvp, &vattr, cr)) {
1672                                 VOP_UNLOCK(mvp, 0);
1673                                 goto out;
1674                         }
1675
1676                         if (secpolicy_vnode_owner(mvp, cr, vattr.va_uid) != 0 &&
1677                             VOP_ACCESS(mvp, VWRITE, cr, td) != 0) {
1678                                 VOP_UNLOCK(mvp, 0);
1679                                 goto out;
1680                         }
1681                         VOP_UNLOCK(mvp, 0);
1682                 }
1683
1684                 secpolicy_fs_mount_clearopts(cr, vfsp);
1685         }
1686
1687         /*
1688          * Refuse to mount a filesystem if we are in a local zone and the
1689          * dataset is not visible.
1690          */
1691         if (!INGLOBALZONE(curthread) &&
1692             (!zone_dataset_visible(osname, &canwrite) || !canwrite)) {
1693                 error = SET_ERROR(EPERM);
1694                 goto out;
1695         }
1696
1697 #ifdef SECLABEL
1698         error = zfs_mount_label_policy(vfsp, osname);
1699         if (error)
1700                 goto out;
1701 #endif
1702
1703         vfsp->vfs_flag |= MNT_NFS4ACLS;
1704
1705         /*
1706          * When doing a remount, we simply refresh our temporary properties
1707          * according to those options set in the current VFS options.
1708          */
1709         if (vfsp->vfs_flag & MS_REMOUNT) {
1710                 zfsvfs_t *zfsvfs = vfsp->vfs_data;
1711
1712                 /*
1713                  * Refresh mount options with z_teardown_lock blocking I/O while
1714                  * the filesystem is in an inconsistent state.
1715                  * The lock also serializes this code with filesystem
1716                  * manipulations between entry to zfs_suspend_fs() and return
1717                  * from zfs_resume_fs().
1718                  */
1719                 rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1720                 zfs_unregister_callbacks(zfsvfs);
1721                 error = zfs_register_callbacks(vfsp);
1722                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1723                 goto out;
1724         }
1725
1726         /* Initial root mount: try hard to import the requested root pool. */
1727         if ((vfsp->vfs_flag & MNT_ROOTFS) != 0 &&
1728             (vfsp->vfs_flag & MNT_UPDATE) == 0) {
1729                 char pname[MAXNAMELEN];
1730
1731                 error = getpoolname(osname, pname);
1732                 if (error == 0)
1733                         error = spa_import_rootpool(pname);
1734                 if (error)
1735                         goto out;
1736         }
1737         DROP_GIANT();
1738         error = zfs_domount(vfsp, osname);
1739         PICKUP_GIANT();
1740
1741 #ifdef illumos
1742         /*
1743          * Add an extra VFS_HOLD on our parent vfs so that it can't
1744          * disappear due to a forced unmount.
1745          */
1746         if (error == 0 && ((zfsvfs_t *)vfsp->vfs_data)->z_issnap)
1747                 VFS_HOLD(mvp->v_vfsp);
1748 #endif
1749
1750 out:
1751         return (error);
1752 }
1753
1754 static int
1755 zfs_statfs(vfs_t *vfsp, struct statfs *statp)
1756 {
1757         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1758         uint64_t refdbytes, availbytes, usedobjs, availobjs;
1759
1760         statp->f_version = STATFS_VERSION;
1761
1762         ZFS_ENTER(zfsvfs);
1763
1764         dmu_objset_space(zfsvfs->z_os,
1765             &refdbytes, &availbytes, &usedobjs, &availobjs);
1766
1767         /*
1768          * The underlying storage pool actually uses multiple block sizes.
1769          * We report the fragsize as the smallest block size we support,
1770          * and we report our blocksize as the filesystem's maximum blocksize.
1771          */
1772         statp->f_bsize = SPA_MINBLOCKSIZE;
1773         statp->f_iosize = zfsvfs->z_vfs->mnt_stat.f_iosize;
1774
1775         /*
1776          * The following report "total" blocks of various kinds in the
1777          * file system, but reported in terms of f_frsize - the
1778          * "fragment" size.
1779          */
1780
1781         statp->f_blocks = (refdbytes + availbytes) >> SPA_MINBLOCKSHIFT;
1782         statp->f_bfree = availbytes / statp->f_bsize;
1783         statp->f_bavail = statp->f_bfree; /* no root reservation */
1784
1785         /*
1786          * statvfs() should really be called statufs(), because it assumes
1787          * static metadata.  ZFS doesn't preallocate files, so the best
1788          * we can do is report the max that could possibly fit in f_files,
1789          * and that minus the number actually used in f_ffree.
1790          * For f_ffree, report the smaller of the number of object available
1791          * and the number of blocks (each object will take at least a block).
1792          */
1793         statp->f_ffree = MIN(availobjs, statp->f_bfree);
1794         statp->f_files = statp->f_ffree + usedobjs;
1795
1796         /*
1797          * We're a zfs filesystem.
1798          */
1799         (void) strlcpy(statp->f_fstypename, "zfs", sizeof(statp->f_fstypename));
1800
1801         strlcpy(statp->f_mntfromname, vfsp->mnt_stat.f_mntfromname,
1802             sizeof(statp->f_mntfromname));
1803         strlcpy(statp->f_mntonname, vfsp->mnt_stat.f_mntonname,
1804             sizeof(statp->f_mntonname));
1805
1806         statp->f_namemax = MAXNAMELEN - 1;
1807
1808         ZFS_EXIT(zfsvfs);
1809         return (0);
1810 }
1811
1812 static int
1813 zfs_root(vfs_t *vfsp, int flags, vnode_t **vpp)
1814 {
1815         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1816         znode_t *rootzp;
1817         int error;
1818
1819         ZFS_ENTER(zfsvfs);
1820
1821         error = zfs_zget(zfsvfs, zfsvfs->z_root, &rootzp);
1822         if (error == 0)
1823                 *vpp = ZTOV(rootzp);
1824
1825         ZFS_EXIT(zfsvfs);
1826
1827         if (error == 0) {
1828                 error = vn_lock(*vpp, flags);
1829                 if (error != 0) {
1830                         VN_RELE(*vpp);
1831                         *vpp = NULL;
1832                 }
1833         }
1834         return (error);
1835 }
1836
1837 /*
1838  * Teardown the zfsvfs::z_os.
1839  *
1840  * Note, if 'unmounting' if FALSE, we return with the 'z_teardown_lock'
1841  * and 'z_teardown_inactive_lock' held.
1842  */
1843 static int
1844 zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting)
1845 {
1846         znode_t *zp;
1847
1848         rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1849
1850         if (!unmounting) {
1851                 /*
1852                  * We purge the parent filesystem's vfsp as the parent
1853                  * filesystem and all of its snapshots have their vnode's
1854                  * v_vfsp set to the parent's filesystem's vfsp.  Note,
1855                  * 'z_parent' is self referential for non-snapshots.
1856                  */
1857                 (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
1858 #ifdef FREEBSD_NAMECACHE
1859                 cache_purgevfs(zfsvfs->z_parent->z_vfs, true);
1860 #endif
1861         }
1862
1863         /*
1864          * Close the zil. NB: Can't close the zil while zfs_inactive
1865          * threads are blocked as zil_close can call zfs_inactive.
1866          */
1867         if (zfsvfs->z_log) {
1868                 zil_close(zfsvfs->z_log);
1869                 zfsvfs->z_log = NULL;
1870         }
1871
1872         rw_enter(&zfsvfs->z_teardown_inactive_lock, RW_WRITER);
1873
1874         /*
1875          * If we are not unmounting (ie: online recv) and someone already
1876          * unmounted this file system while we were doing the switcheroo,
1877          * or a reopen of z_os failed then just bail out now.
1878          */
1879         if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
1880                 rw_exit(&zfsvfs->z_teardown_inactive_lock);
1881                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1882                 return (SET_ERROR(EIO));
1883         }
1884
1885         /*
1886          * At this point there are no vops active, and any new vops will
1887          * fail with EIO since we have z_teardown_lock for writer (only
1888          * relavent for forced unmount).
1889          *
1890          * Release all holds on dbufs.
1891          */
1892         mutex_enter(&zfsvfs->z_znodes_lock);
1893         for (zp = list_head(&zfsvfs->z_all_znodes); zp != NULL;
1894             zp = list_next(&zfsvfs->z_all_znodes, zp))
1895                 if (zp->z_sa_hdl) {
1896                         ASSERT(ZTOV(zp)->v_count >= 0);
1897                         zfs_znode_dmu_fini(zp);
1898                 }
1899         mutex_exit(&zfsvfs->z_znodes_lock);
1900
1901         /*
1902          * If we are unmounting, set the unmounted flag and let new vops
1903          * unblock.  zfs_inactive will have the unmounted behavior, and all
1904          * other vops will fail with EIO.
1905          */
1906         if (unmounting) {
1907                 zfsvfs->z_unmounted = B_TRUE;
1908                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1909                 rw_exit(&zfsvfs->z_teardown_inactive_lock);
1910         }
1911
1912         /*
1913          * z_os will be NULL if there was an error in attempting to reopen
1914          * zfsvfs, so just return as the properties had already been
1915          * unregistered and cached data had been evicted before.
1916          */
1917         if (zfsvfs->z_os == NULL)
1918                 return (0);
1919
1920         /*
1921          * Unregister properties.
1922          */
1923         zfs_unregister_callbacks(zfsvfs);
1924
1925         /*
1926          * Evict cached data
1927          */
1928         if (dsl_dataset_is_dirty(dmu_objset_ds(zfsvfs->z_os)) &&
1929             !(zfsvfs->z_vfs->vfs_flag & VFS_RDONLY))
1930                 txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
1931         dmu_objset_evict_dbufs(zfsvfs->z_os);
1932
1933         return (0);
1934 }
1935
1936 /*ARGSUSED*/
1937 static int
1938 zfs_umount(vfs_t *vfsp, int fflag)
1939 {
1940         kthread_t *td = curthread;
1941         zfsvfs_t *zfsvfs = vfsp->vfs_data;
1942         objset_t *os;
1943         cred_t *cr = td->td_ucred;
1944         int ret;
1945
1946         ret = secpolicy_fs_unmount(cr, vfsp);
1947         if (ret) {
1948                 if (dsl_deleg_access((char *)refstr_value(vfsp->vfs_resource),
1949                     ZFS_DELEG_PERM_MOUNT, cr))
1950                         return (ret);
1951         }
1952
1953         /*
1954          * We purge the parent filesystem's vfsp as the parent filesystem
1955          * and all of its snapshots have their vnode's v_vfsp set to the
1956          * parent's filesystem's vfsp.  Note, 'z_parent' is self
1957          * referential for non-snapshots.
1958          */
1959         (void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
1960
1961         /*
1962          * Unmount any snapshots mounted under .zfs before unmounting the
1963          * dataset itself.
1964          */
1965         if (zfsvfs->z_ctldir != NULL) {
1966                 if ((ret = zfsctl_umount_snapshots(vfsp, fflag, cr)) != 0)
1967                         return (ret);
1968         }
1969
1970         if (fflag & MS_FORCE) {
1971                 /*
1972                  * Mark file system as unmounted before calling
1973                  * vflush(FORCECLOSE). This way we ensure no future vnops
1974                  * will be called and risk operating on DOOMED vnodes.
1975                  */
1976                 rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
1977                 zfsvfs->z_unmounted = B_TRUE;
1978                 rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
1979         }
1980
1981         /*
1982          * Flush all the files.
1983          */
1984         ret = vflush(vfsp, 0, (fflag & MS_FORCE) ? FORCECLOSE : 0, td);
1985         if (ret != 0)
1986                 return (ret);
1987
1988 #ifdef illumos
1989         if (!(fflag & MS_FORCE)) {
1990                 /*
1991                  * Check the number of active vnodes in the file system.
1992                  * Our count is maintained in the vfs structure, but the
1993                  * number is off by 1 to indicate a hold on the vfs
1994                  * structure itself.
1995                  *
1996                  * The '.zfs' directory maintains a reference of its
1997                  * own, and any active references underneath are
1998                  * reflected in the vnode count.
1999                  */
2000                 if (zfsvfs->z_ctldir == NULL) {
2001                         if (vfsp->vfs_count > 1)
2002                                 return (SET_ERROR(EBUSY));
2003                 } else {
2004                         if (vfsp->vfs_count > 2 ||
2005                             zfsvfs->z_ctldir->v_count > 1)
2006                                 return (SET_ERROR(EBUSY));
2007                 }
2008         }
2009 #endif
2010
2011         VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0);
2012         os = zfsvfs->z_os;
2013
2014         /*
2015          * z_os will be NULL if there was an error in
2016          * attempting to reopen zfsvfs.
2017          */
2018         if (os != NULL) {
2019                 /*
2020                  * Unset the objset user_ptr.
2021                  */
2022                 mutex_enter(&os->os_user_ptr_lock);
2023                 dmu_objset_set_user(os, NULL);
2024                 mutex_exit(&os->os_user_ptr_lock);
2025
2026                 /*
2027                  * Finally release the objset
2028                  */
2029                 dmu_objset_disown(os, zfsvfs);
2030         }
2031
2032         /*
2033          * We can now safely destroy the '.zfs' directory node.
2034          */
2035         if (zfsvfs->z_ctldir != NULL)
2036                 zfsctl_destroy(zfsvfs);
2037         zfs_freevfs(vfsp);
2038
2039         return (0);
2040 }
2041
2042 static int
2043 zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp)
2044 {
2045         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2046         znode_t         *zp;
2047         int             err;
2048
2049         /*
2050          * zfs_zget() can't operate on virtual entries like .zfs/ or
2051          * .zfs/snapshot/ directories, that's why we return EOPNOTSUPP.
2052          * This will make NFS to switch to LOOKUP instead of using VGET.
2053          */
2054         if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR ||
2055             (zfsvfs->z_shares_dir != 0 && ino == zfsvfs->z_shares_dir))
2056                 return (EOPNOTSUPP);
2057
2058         ZFS_ENTER(zfsvfs);
2059         err = zfs_zget(zfsvfs, ino, &zp);
2060         if (err == 0 && zp->z_unlinked) {
2061                 vrele(ZTOV(zp));
2062                 err = EINVAL;
2063         }
2064         if (err == 0)
2065                 *vpp = ZTOV(zp);
2066         ZFS_EXIT(zfsvfs);
2067         if (err == 0)
2068                 err = vn_lock(*vpp, flags);
2069         if (err != 0)
2070                 *vpp = NULL;
2071         return (err);
2072 }
2073
2074 static int
2075 zfs_checkexp(vfs_t *vfsp, struct sockaddr *nam, int *extflagsp,
2076     struct ucred **credanonp, int *numsecflavors, int **secflavors)
2077 {
2078         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2079
2080         /*
2081          * If this is regular file system vfsp is the same as
2082          * zfsvfs->z_parent->z_vfs, but if it is snapshot,
2083          * zfsvfs->z_parent->z_vfs represents parent file system
2084          * which we have to use here, because only this file system
2085          * has mnt_export configured.
2086          */
2087         return (vfs_stdcheckexp(zfsvfs->z_parent->z_vfs, nam, extflagsp,
2088             credanonp, numsecflavors, secflavors));
2089 }
2090
2091 CTASSERT(SHORT_FID_LEN <= sizeof(struct fid));
2092 CTASSERT(LONG_FID_LEN <= sizeof(struct fid));
2093
2094 static int
2095 zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
2096 {
2097         struct componentname cn;
2098         zfsvfs_t        *zfsvfs = vfsp->vfs_data;
2099         znode_t         *zp;
2100         vnode_t         *dvp;
2101         uint64_t        object = 0;
2102         uint64_t        fid_gen = 0;
2103         uint64_t        gen_mask;
2104         uint64_t        zp_gen;
2105         int             i, err;
2106
2107         *vpp = NULL;
2108
2109         ZFS_ENTER(zfsvfs);
2110
2111         /*
2112          * On FreeBSD we can get snapshot's mount point or its parent file
2113          * system mount point depending if snapshot is already mounted or not.
2114          */
2115         if (zfsvfs->z_parent == zfsvfs && fidp->fid_len == LONG_FID_LEN) {
2116                 zfid_long_t     *zlfid = (zfid_long_t *)fidp;
2117                 uint64_t        objsetid = 0;
2118                 uint64_t        setgen = 0;
2119
2120                 for (i = 0; i < sizeof (zlfid->zf_setid); i++)
2121                         objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
2122
2123                 for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
2124                         setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i);
2125
2126                 ZFS_EXIT(zfsvfs);
2127
2128                 err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs);
2129                 if (err)
2130                         return (SET_ERROR(EINVAL));
2131                 ZFS_ENTER(zfsvfs);
2132         }
2133
2134         if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) {
2135                 zfid_short_t    *zfid = (zfid_short_t *)fidp;
2136
2137                 for (i = 0; i < sizeof (zfid->zf_object); i++)
2138                         object |= ((uint64_t)zfid->zf_object[i]) << (8 * i);
2139
2140                 for (i = 0; i < sizeof (zfid->zf_gen); i++)
2141                         fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i);
2142         } else {
2143                 ZFS_EXIT(zfsvfs);
2144                 return (SET_ERROR(EINVAL));
2145         }
2146
2147         /*
2148          * A zero fid_gen means we are in .zfs or the .zfs/snapshot
2149          * directory tree. If the object == zfsvfs->z_shares_dir, then
2150          * we are in the .zfs/shares directory tree.
2151          */
2152         if ((fid_gen == 0 &&
2153              (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) ||
2154             (zfsvfs->z_shares_dir != 0 && object == zfsvfs->z_shares_dir)) {
2155                 ZFS_EXIT(zfsvfs);
2156                 VERIFY0(zfsctl_root(zfsvfs, LK_SHARED, &dvp));
2157                 if (object == ZFSCTL_INO_SNAPDIR) {
2158                         cn.cn_nameptr = "snapshot";
2159                         cn.cn_namelen = strlen(cn.cn_nameptr);
2160                         cn.cn_nameiop = LOOKUP;
2161                         cn.cn_flags = ISLASTCN | LOCKLEAF;
2162                         cn.cn_lkflags = flags;
2163                         VERIFY0(VOP_LOOKUP(dvp, vpp, &cn));
2164                         vput(dvp);
2165                 } else if (object == zfsvfs->z_shares_dir) {
2166                         /*
2167                          * XXX This branch must not be taken,
2168                          * if it is, then the lookup below will
2169                          * explode.
2170                          */
2171                         cn.cn_nameptr = "shares";
2172                         cn.cn_namelen = strlen(cn.cn_nameptr);
2173                         cn.cn_nameiop = LOOKUP;
2174                         cn.cn_flags = ISLASTCN;
2175                         cn.cn_lkflags = flags;
2176                         VERIFY0(VOP_LOOKUP(dvp, vpp, &cn));
2177                         vput(dvp);
2178                 } else {
2179                         *vpp = dvp;
2180                 }
2181                 return (err);
2182         }
2183
2184         gen_mask = -1ULL >> (64 - 8 * i);
2185
2186         dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask);
2187         if (err = zfs_zget(zfsvfs, object, &zp)) {
2188                 ZFS_EXIT(zfsvfs);
2189                 return (err);
2190         }
2191         (void) sa_lookup(zp->z_sa_hdl, SA_ZPL_GEN(zfsvfs), &zp_gen,
2192             sizeof (uint64_t));
2193         zp_gen = zp_gen & gen_mask;
2194         if (zp_gen == 0)
2195                 zp_gen = 1;
2196         if (zp->z_unlinked || zp_gen != fid_gen) {
2197                 dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen);
2198                 vrele(ZTOV(zp));
2199                 ZFS_EXIT(zfsvfs);
2200                 return (SET_ERROR(EINVAL));
2201         }
2202
2203         *vpp = ZTOV(zp);
2204         ZFS_EXIT(zfsvfs);
2205         err = vn_lock(*vpp, flags);
2206         if (err == 0)
2207                 vnode_create_vobject(*vpp, zp->z_size, curthread);
2208         else
2209                 *vpp = NULL;
2210         return (err);
2211 }
2212
2213 /*
2214  * Block out VOPs and close zfsvfs_t::z_os
2215  *
2216  * Note, if successful, then we return with the 'z_teardown_lock' and
2217  * 'z_teardown_inactive_lock' write held.  We leave ownership of the underlying
2218  * dataset and objset intact so that they can be atomically handed off during
2219  * a subsequent rollback or recv operation and the resume thereafter.
2220  */
2221 int
2222 zfs_suspend_fs(zfsvfs_t *zfsvfs)
2223 {
2224         int error;
2225
2226         if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0)
2227                 return (error);
2228
2229         return (0);
2230 }
2231
2232 /*
2233  * Rebuild SA and release VOPs.  Note that ownership of the underlying dataset
2234  * is an invariant across any of the operations that can be performed while the
2235  * filesystem was suspended.  Whether it succeeded or failed, the preconditions
2236  * are the same: the relevant objset and associated dataset are owned by
2237  * zfsvfs, held, and long held on entry.
2238  */
2239 int
2240 zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
2241 {
2242         int err;
2243         znode_t *zp;
2244
2245         ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
2246         ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock));
2247
2248         /*
2249          * We already own this, so just update the objset_t, as the one we
2250          * had before may have been evicted.
2251          */
2252         objset_t *os;
2253         VERIFY3P(ds->ds_owner, ==, zfsvfs);
2254         VERIFY(dsl_dataset_long_held(ds));
2255         VERIFY0(dmu_objset_from_ds(ds, &os));
2256
2257         err = zfsvfs_init(zfsvfs, os);
2258         if (err != 0)
2259                 goto bail;
2260
2261         VERIFY(zfsvfs_setup(zfsvfs, B_FALSE) == 0);
2262
2263         zfs_set_fuid_feature(zfsvfs);
2264
2265         /*
2266          * Attempt to re-establish all the active znodes with
2267          * their dbufs.  If a zfs_rezget() fails, then we'll let
2268          * any potential callers discover that via ZFS_ENTER_VERIFY_VP
2269          * when they try to use their znode.
2270          */
2271         mutex_enter(&zfsvfs->z_znodes_lock);
2272         for (zp = list_head(&zfsvfs->z_all_znodes); zp;
2273             zp = list_next(&zfsvfs->z_all_znodes, zp)) {
2274                 (void) zfs_rezget(zp);
2275         }
2276         mutex_exit(&zfsvfs->z_znodes_lock);
2277
2278 bail:
2279         /* release the VOPs */
2280         rw_exit(&zfsvfs->z_teardown_inactive_lock);
2281         rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
2282
2283         if (err) {
2284                 /*
2285                  * Since we couldn't setup the sa framework, try to force
2286                  * unmount this file system.
2287                  */
2288                 if (vn_vfswlock(zfsvfs->z_vfs->vfs_vnodecovered) == 0) {
2289                         vfs_ref(zfsvfs->z_vfs);
2290                         (void) dounmount(zfsvfs->z_vfs, MS_FORCE, curthread);
2291                 }
2292         }
2293         return (err);
2294 }
2295
2296 static void
2297 zfs_freevfs(vfs_t *vfsp)
2298 {
2299         zfsvfs_t *zfsvfs = vfsp->vfs_data;
2300
2301 #ifdef illumos
2302         /*
2303          * If this is a snapshot, we have an extra VFS_HOLD on our parent
2304          * from zfs_mount().  Release it here.  If we came through
2305          * zfs_mountroot() instead, we didn't grab an extra hold, so
2306          * skip the VFS_RELE for rootvfs.
2307          */
2308         if (zfsvfs->z_issnap && (vfsp != rootvfs))
2309                 VFS_RELE(zfsvfs->z_parent->z_vfs);
2310 #endif
2311
2312         zfsvfs_free(zfsvfs);
2313
2314         atomic_dec_32(&zfs_active_fs_count);
2315 }
2316
2317 #ifdef __i386__
2318 static int desiredvnodes_backup;
2319 #endif
2320
2321 static void
2322 zfs_vnodes_adjust(void)
2323 {
2324 #ifdef __i386__
2325         int newdesiredvnodes;
2326
2327         desiredvnodes_backup = desiredvnodes;
2328
2329         /*
2330          * We calculate newdesiredvnodes the same way it is done in
2331          * vntblinit(). If it is equal to desiredvnodes, it means that
2332          * it wasn't tuned by the administrator and we can tune it down.
2333          */
2334         newdesiredvnodes = min(maxproc + vm_cnt.v_page_count / 4, 2 *
2335             vm_kmem_size / (5 * (sizeof(struct vm_object) +
2336             sizeof(struct vnode))));
2337         if (newdesiredvnodes == desiredvnodes)
2338                 desiredvnodes = (3 * newdesiredvnodes) / 4;
2339 #endif
2340 }
2341
2342 static void
2343 zfs_vnodes_adjust_back(void)
2344 {
2345
2346 #ifdef __i386__
2347         desiredvnodes = desiredvnodes_backup;
2348 #endif
2349 }
2350
2351 void
2352 zfs_init(void)
2353 {
2354
2355         printf("ZFS filesystem version: " ZPL_VERSION_STRING "\n");
2356
2357         /*
2358          * Initialize .zfs directory structures
2359          */
2360         zfsctl_init();
2361
2362         /*
2363          * Initialize znode cache, vnode ops, etc...
2364          */
2365         zfs_znode_init();
2366
2367         /*
2368          * Reduce number of vnodes. Originally number of vnodes is calculated
2369          * with UFS inode in mind. We reduce it here, because it's too big for
2370          * ZFS/i386.
2371          */
2372         zfs_vnodes_adjust();
2373
2374         dmu_objset_register_type(DMU_OST_ZFS, zfs_space_delta_cb);
2375 }
2376
2377 void
2378 zfs_fini(void)
2379 {
2380         zfsctl_fini();
2381         zfs_znode_fini();
2382         zfs_vnodes_adjust_back();
2383 }
2384
2385 int
2386 zfs_busy(void)
2387 {
2388         return (zfs_active_fs_count != 0);
2389 }
2390
2391 int
2392 zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers)
2393 {
2394         int error;
2395         objset_t *os = zfsvfs->z_os;
2396         dmu_tx_t *tx;
2397
2398         if (newvers < ZPL_VERSION_INITIAL || newvers > ZPL_VERSION)
2399                 return (SET_ERROR(EINVAL));
2400
2401         if (newvers < zfsvfs->z_version)
2402                 return (SET_ERROR(EINVAL));
2403
2404         if (zfs_spa_version_map(newvers) >
2405             spa_version(dmu_objset_spa(zfsvfs->z_os)))
2406                 return (SET_ERROR(ENOTSUP));
2407
2408         tx = dmu_tx_create(os);
2409         dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_FALSE, ZPL_VERSION_STR);
2410         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2411                 dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE,
2412                     ZFS_SA_ATTRS);
2413                 dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
2414         }
2415         error = dmu_tx_assign(tx, TXG_WAIT);
2416         if (error) {
2417                 dmu_tx_abort(tx);
2418                 return (error);
2419         }
2420
2421         error = zap_update(os, MASTER_NODE_OBJ, ZPL_VERSION_STR,
2422             8, 1, &newvers, tx);
2423
2424         if (error) {
2425                 dmu_tx_commit(tx);
2426                 return (error);
2427         }
2428
2429         if (newvers >= ZPL_VERSION_SA && !zfsvfs->z_use_sa) {
2430                 uint64_t sa_obj;
2431
2432                 ASSERT3U(spa_version(dmu_objset_spa(zfsvfs->z_os)), >=,
2433                     SPA_VERSION_SA);
2434                 sa_obj = zap_create(os, DMU_OT_SA_MASTER_NODE,
2435                     DMU_OT_NONE, 0, tx);
2436
2437                 error = zap_add(os, MASTER_NODE_OBJ,
2438                     ZFS_SA_ATTRS, 8, 1, &sa_obj, tx);
2439                 ASSERT0(error);
2440
2441                 VERIFY(0 == sa_set_sa_object(os, sa_obj));
2442                 sa_register_update_callback(os, zfs_sa_upgrade);
2443         }
2444
2445         spa_history_log_internal_ds(dmu_objset_ds(os), "upgrade", tx,
2446             "from %llu to %llu", zfsvfs->z_version, newvers);
2447
2448         dmu_tx_commit(tx);
2449
2450         zfsvfs->z_version = newvers;
2451
2452         zfs_set_fuid_feature(zfsvfs);
2453
2454         return (0);
2455 }
2456
2457 /*
2458  * Read a property stored within the master node.
2459  */
2460 int
2461 zfs_get_zplprop(objset_t *os, zfs_prop_t prop, uint64_t *value)
2462 {
2463         const char *pname;
2464         int error = ENOENT;
2465
2466         /*
2467          * Look up the file system's value for the property.  For the
2468          * version property, we look up a slightly different string.
2469          */
2470         if (prop == ZFS_PROP_VERSION)
2471                 pname = ZPL_VERSION_STR;
2472         else
2473                 pname = zfs_prop_to_name(prop);
2474
2475         if (os != NULL) {
2476                 ASSERT3U(os->os_phys->os_type, ==, DMU_OST_ZFS);
2477                 error = zap_lookup(os, MASTER_NODE_OBJ, pname, 8, 1, value);
2478         }
2479
2480         if (error == ENOENT) {
2481                 /* No value set, use the default value */
2482                 switch (prop) {
2483                 case ZFS_PROP_VERSION:
2484                         *value = ZPL_VERSION;
2485                         break;
2486                 case ZFS_PROP_NORMALIZE:
2487                 case ZFS_PROP_UTF8ONLY:
2488                         *value = 0;
2489                         break;
2490                 case ZFS_PROP_CASE:
2491                         *value = ZFS_CASE_SENSITIVE;
2492                         break;
2493                 default:
2494                         return (error);
2495                 }
2496                 error = 0;
2497         }
2498         return (error);
2499 }
2500
2501 #ifdef _KERNEL
2502 void
2503 zfsvfs_update_fromname(const char *oldname, const char *newname)
2504 {
2505         char tmpbuf[MAXPATHLEN];
2506         struct mount *mp;
2507         char *fromname;
2508         size_t oldlen;
2509
2510         oldlen = strlen(oldname);
2511
2512         mtx_lock(&mountlist_mtx);
2513         TAILQ_FOREACH(mp, &mountlist, mnt_list) {
2514                 fromname = mp->mnt_stat.f_mntfromname;
2515                 if (strcmp(fromname, oldname) == 0) {
2516                         (void)strlcpy(fromname, newname,
2517                             sizeof(mp->mnt_stat.f_mntfromname));
2518                         continue;
2519                 }
2520                 if (strncmp(fromname, oldname, oldlen) == 0 &&
2521                     (fromname[oldlen] == '/' || fromname[oldlen] == '@')) {
2522                         (void)snprintf(tmpbuf, sizeof(tmpbuf), "%s%s",
2523                             newname, fromname + oldlen);
2524                         (void)strlcpy(fromname, tmpbuf,
2525                             sizeof(mp->mnt_stat.f_mntfromname));
2526                         continue;
2527                 }
2528         }
2529         mtx_unlock(&mountlist_mtx);
2530 }
2531 #endif