usr/src/uts/common/fs/zfs/zfs_vfsops.c
author Tom Erickson <Tom.Erickson@Sun.COM>
Mon, 09 Nov 2009 20:45:32 -0800
changeset 11022 63ab26072e41
parent 10984 bf1fc133a515
child 11185 f0c31008e395
permissions -rw-r--r--
PSARC 2009/510 ZFS received properties 6850025 want to preserve local properties for zfs_recv 6839260 want zfs send with properties 6855486 zfs_receive should keep trying to set properties even after some fail 6850030 snapshots on read-only dataset shouldn't affect zfs_receive
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1484
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
     5
 * Common Development and Distribution License (the "License").
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
9030
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#include <sys/types.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#include <sys/param.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/systm.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/sysmacros.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/kmem.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/pathname.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/vnode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/vfs.h>
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    34
#include <sys/vfs_opreg.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/mntent.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/mount.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/cmn_err.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include "fs/fs_subr.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <sys/zfs_znode.h>
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
    40
#include <sys/zfs_dir.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include <sys/zil.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
#include <sys/dsl_prop.h>
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
    45
#include <sys/dsl_dataset.h>
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
    46
#include <sys/dsl_deleg.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
#include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
#include <sys/varargs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
#include <sys/policy.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
#include <sys/atomic.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
#include <sys/mkdev.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
#include <sys/modctl.h>
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
    54
#include <sys/refstr.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
#include <sys/zfs_ioctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
#include <sys/zfs_ctldir.h>
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
    57
#include <sys/zfs_fuid.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
    58
#include <sys/bootconf.h>
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
    59
#include <sys/sunddi.h>
1484
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
    60
#include <sys/dnlc.h>
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
    61
#include <sys/dmu_objset.h>
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
    62
#include <sys/spa_boot.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
int zfsfstype;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
vfsops_t *zfs_vfsops = NULL;
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
    66
static major_t zfs_major;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
static minor_t zfs_minor;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
static kmutex_t	zfs_dev_mtx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
    70
extern int sys_shutdown;
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
    71
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
static int zfs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
static int zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
    74
static int zfs_mountroot(vfs_t *vfsp, enum whymountroot);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
static int zfs_root(vfs_t *vfsp, vnode_t **vpp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
static int zfs_statvfs(vfs_t *vfsp, struct statvfs64 *statp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
static int zfs_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
static void zfs_freevfs(vfs_t *vfsp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
static const fs_operation_def_t zfs_vfsops_template[] = {
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    81
	VFSNAME_MOUNT,		{ .vfs_mount = zfs_mount },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    82
	VFSNAME_MOUNTROOT,	{ .vfs_mountroot = zfs_mountroot },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    83
	VFSNAME_UNMOUNT,	{ .vfs_unmount = zfs_umount },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    84
	VFSNAME_ROOT,		{ .vfs_root = zfs_root },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    85
	VFSNAME_STATVFS,	{ .vfs_statvfs = zfs_statvfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    86
	VFSNAME_SYNC,		{ .vfs_sync = zfs_sync },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    87
	VFSNAME_VGET,		{ .vfs_vget = zfs_vget },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    88
	VFSNAME_FREEVFS,	{ .vfs_freevfs = zfs_freevfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    89
	NULL,			NULL
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
static const fs_operation_def_t zfs_vfsops_eio_template[] = {
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    93
	VFSNAME_FREEVFS,	{ .vfs_freevfs =  zfs_freevfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 3461
diff changeset
    94
	NULL,			NULL
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
 * We need to keep a count of active fs's.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
 * This is necessary to prevent our module
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
 * from being unloaded after a umount -f
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
static uint32_t	zfs_active_fs_count = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
static char *noatime_cancel[] = { MNTOPT_ATIME, NULL };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
static char *atime_cancel[] = { MNTOPT_NOATIME, NULL };
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   106
static char *noxattr_cancel[] = { MNTOPT_XATTR, NULL };
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   107
static char *xattr_cancel[] = { MNTOPT_NOXATTR, NULL };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   109
/*
4596
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   110
 * MO_DEFAULT is not used since the default value is determined
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   111
 * by the equivalent property.
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   112
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
static mntopt_t mntopts[] = {
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   114
	{ MNTOPT_NOXATTR, noxattr_cancel, NULL, 0, NULL },
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   115
	{ MNTOPT_XATTR, xattr_cancel, NULL, 0, NULL },
4596
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   116
	{ MNTOPT_NOATIME, noatime_cancel, NULL, 0, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
	{ MNTOPT_ATIME, atime_cancel, NULL, 0, NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
static mntopts_t zfs_mntopts = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
	sizeof (mntopts) / sizeof (mntopt_t),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
	mntopts
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
zfs_sync(vfs_t *vfsp, short flag, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
	 * Data integrity is job one.  We don't want a compromised kernel
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
	 * writing to the storage pool, so we never sync during panic.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
	if (panicstr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
	 * SYNC_ATTR is used by fsflush() to force old filesystems like UFS
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
	 * to sync metadata, which they would otherwise cache indefinitely.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
	 * Semantically, the only requirement is that the sync be initiated.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
	 * The DMU syncs out txgs frequently, so there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
	if (flag & SYNC_ATTR)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
	if (vfsp != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
		 * Sync a specific filesystem.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
		zfsvfs_t *zfsvfs = vfsp->vfs_data;
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   150
		dsl_pool_t *dp;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
		ZFS_ENTER(zfsvfs);
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   153
		dp = dmu_objset_pool(zfsvfs->z_os);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   154
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   155
		/*
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   156
		 * If the system is shutting down, then skip any
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   157
		 * filesystems which may exist on a suspended pool.
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   158
		 */
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   159
		if (sys_shutdown && spa_suspended(dp->dp_spa)) {
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   160
			ZFS_EXIT(zfsvfs);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   161
			return (0);
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   162
		}
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   163
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
		if (zfsvfs->z_log != NULL)
2638
4f583dfeae92 6413510 zfs: writing to ZFS filesystem slows down fsync() on other files in the same FS
perrin
parents: 2474
diff changeset
   165
			zil_commit(zfsvfs->z_log, UINT64_MAX, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
		else
9234
bffdc4fc05c4 6792139 recovering from a suspended pool needs some work
George Wilson <George.Wilson@Sun.COM>
parents: 9214
diff changeset
   167
			txg_wait_synced(dp, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
		ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
		 * Sync all ZFS filesystems.  This is what happens when you
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
		 * run sync(1M).  Unlike other filesystems, ZFS honors the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
		 * request by waiting for all pools to commit all dirty data.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
		spa_sync_allpools();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   176
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   177
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   181
static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   182
zfs_create_unique_device(dev_t *dev)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   183
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   184
	major_t new_major;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   185
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   186
	do {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   187
		ASSERT3U(zfs_minor, <=, MAXMIN32);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   188
		minor_t start = zfs_minor;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   189
		do {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   190
			mutex_enter(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   191
			if (zfs_minor >= MAXMIN32) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   192
				/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   193
				 * If we're still using the real major
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   194
				 * keep out of /dev/zfs and /dev/zvol minor
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   195
				 * number space.  If we're using a getudev()'ed
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   196
				 * major number, we can use all of its minors.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   197
				 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   198
				if (zfs_major == ddi_name_to_major(ZFS_DRIVER))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   199
					zfs_minor = ZFS_MIN_MINOR;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   200
				else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   201
					zfs_minor = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   202
			} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   203
				zfs_minor++;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   204
			}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   205
			*dev = makedevice(zfs_major, zfs_minor);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   206
			mutex_exit(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   207
		} while (vfs_devismounted(*dev) && zfs_minor != start);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   208
		if (zfs_minor == start) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   209
			/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   210
			 * We are using all ~262,000 minor numbers for the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   211
			 * current major number.  Create a new major number.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   212
			 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   213
			if ((new_major = getudev()) == (major_t)-1) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   214
				cmn_err(CE_WARN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   215
				    "zfs_mount: Can't get unique major "
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   216
				    "device number.");
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   217
				return (-1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   218
			}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   219
			mutex_enter(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   220
			zfs_major = new_major;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   221
			zfs_minor = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   222
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   223
			mutex_exit(&zfs_dev_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   224
		} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   225
			break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   226
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   227
		/* CONSTANTCONDITION */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   228
	} while (1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   229
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   230
	return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   231
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   232
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
atime_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
	if (newval == TRUE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
		zfsvfs->z_atime = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_ATIME, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
		zfsvfs->z_atime = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_ATIME);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
static void
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   250
xattr_changed_cb(void *arg, uint64_t newval)
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   251
{
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   252
	zfsvfs_t *zfsvfs = arg;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   253
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   254
	if (newval == TRUE) {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   255
		/* XXX locking on vfs_flag? */
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   256
		zfsvfs->z_vfs->vfs_flag |= VFS_XATTR;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   257
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   258
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_XATTR, NULL, 0);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   259
	} else {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   260
		/* XXX locking on vfs_flag? */
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   261
		zfsvfs->z_vfs->vfs_flag &= ~VFS_XATTR;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   262
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_XATTR);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   263
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR, NULL, 0);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   264
	}
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   265
}
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   266
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   267
static void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
blksz_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
	if (newval < SPA_MINBLOCKSIZE ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
	    newval > SPA_MAXBLOCKSIZE || !ISP2(newval))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
		newval = SPA_MAXBLOCKSIZE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
	zfsvfs->z_max_blksz = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
	zfsvfs->z_vfs->vfs_bsize = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
readonly_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   283
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
	if (newval) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
		/* XXX locking on vfs_flag? */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
		zfsvfs->z_vfs->vfs_flag |= VFS_RDONLY;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   288
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RW);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RO, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
		/* XXX locking on vfs_flag? */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
		zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RO);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RW, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
devices_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
	if (newval == FALSE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
		zfsvfs->z_vfs->vfs_flag |= VFS_NODEVICES;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_DEVICES);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NODEVICES, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
		zfsvfs->z_vfs->vfs_flag &= ~VFS_NODEVICES;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NODEVICES);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_DEVICES, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   313
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
setuid_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   316
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
	if (newval == FALSE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
		zfsvfs->z_vfs->vfs_flag |= VFS_NOSETUID;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_SETUID);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
		zfsvfs->z_vfs->vfs_flag &= ~VFS_NOSETUID;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_SETUID, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
exec_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   334
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
	if (newval == FALSE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
		zfsvfs->z_vfs->vfs_flag |= VFS_NOEXEC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_EXEC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   338
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
		zfsvfs->z_vfs->vfs_flag &= ~VFS_NOEXEC;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_EXEC, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   344
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   346
/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   347
 * The nbmand mount option can be changed at mount time.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   348
 * We can't allow it to be toggled on live file systems or incorrect
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   349
 * behavior may be seen from cifs clients
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   350
 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   351
 * This property isn't registered via dsl_prop_register(), but this callback
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   352
 * will be called when a file system is first mounted
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   353
 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   354
static void
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   355
nbmand_changed_cb(void *arg, uint64_t newval)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   356
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   357
	zfsvfs_t *zfsvfs = arg;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   358
	if (newval == FALSE) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   359
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NBMAND);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   360
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NONBMAND, NULL, 0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   361
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   362
		vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NONBMAND);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   363
		vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NBMAND, NULL, 0);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   364
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   365
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   366
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   367
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
snapdir_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   369
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   370
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   371
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   372
	zfsvfs->z_show_ctldir = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   374
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
static void
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   376
vscan_changed_cb(void *arg, uint64_t newval)
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   377
{
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   378
	zfsvfs_t *zfsvfs = arg;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   379
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   380
	zfsvfs->z_vscan = newval;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   381
}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   382
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   383
static void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   384
acl_mode_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   386
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   387
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   388
	zfsvfs->z_acl_mode = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   389
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   390
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   391
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   392
acl_inherit_changed_cb(void *arg, uint64_t newval)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   393
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   394
	zfsvfs_t *zfsvfs = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   396
	zfsvfs->z_acl_inherit = newval;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   399
static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   400
zfs_register_callbacks(vfs_t *vfsp)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   401
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   402
	struct dsl_dataset *ds = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   403
	objset_t *os = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   404
	zfsvfs_t *zfsvfs = NULL;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   405
	uint64_t nbmand;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   406
	int readonly, do_readonly = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   407
	int setuid, do_setuid = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   408
	int exec, do_exec = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   409
	int devices, do_devices = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   410
	int xattr, do_xattr = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   411
	int atime, do_atime = B_FALSE;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   412
	int error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   413
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   414
	ASSERT(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   415
	zfsvfs = vfsp->vfs_data;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   416
	ASSERT(zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   417
	os = zfsvfs->z_os;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   418
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   419
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   420
	 * The act of registering our callbacks will destroy any mount
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   421
	 * options we may have.  In order to enable temporary overrides
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   422
	 * of mount options, we stash away the current values and
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   423
	 * restore them after we register the callbacks.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   424
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   425
	if (vfs_optionisset(vfsp, MNTOPT_RO, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   426
		readonly = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   427
		do_readonly = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   428
	} else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   429
		readonly = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   430
		do_readonly = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   431
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   432
	if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   433
		devices = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   434
		setuid = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   435
		do_devices = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   436
		do_setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   437
	} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   438
		if (vfs_optionisset(vfsp, MNTOPT_NODEVICES, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   439
			devices = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   440
			do_devices = B_TRUE;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
   441
		} else if (vfs_optionisset(vfsp, MNTOPT_DEVICES, NULL)) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   442
			devices = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   443
			do_devices = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   444
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   445
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   446
		if (vfs_optionisset(vfsp, MNTOPT_NOSETUID, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   447
			setuid = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   448
			do_setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   449
		} else if (vfs_optionisset(vfsp, MNTOPT_SETUID, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   450
			setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   451
			do_setuid = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   452
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   453
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   454
	if (vfs_optionisset(vfsp, MNTOPT_NOEXEC, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   455
		exec = B_FALSE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   456
		do_exec = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   457
	} else if (vfs_optionisset(vfsp, MNTOPT_EXEC, NULL)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   458
		exec = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   459
		do_exec = B_TRUE;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   460
	}
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   461
	if (vfs_optionisset(vfsp, MNTOPT_NOXATTR, NULL)) {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   462
		xattr = B_FALSE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   463
		do_xattr = B_TRUE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   464
	} else if (vfs_optionisset(vfsp, MNTOPT_XATTR, NULL)) {
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   465
		xattr = B_TRUE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   466
		do_xattr = B_TRUE;
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   467
	}
4596
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   468
	if (vfs_optionisset(vfsp, MNTOPT_NOATIME, NULL)) {
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   469
		atime = B_FALSE;
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   470
		do_atime = B_TRUE;
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   471
	} else if (vfs_optionisset(vfsp, MNTOPT_ATIME, NULL)) {
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   472
		atime = B_TRUE;
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   473
		do_atime = B_TRUE;
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   474
	}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   475
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   476
	/*
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   477
	 * nbmand is a special property.  It can only be changed at
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   478
	 * mount time.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   479
	 *
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   480
	 * This is weird, but it is documented to only be changeable
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   481
	 * at mount time.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   482
	 */
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   483
	if (vfs_optionisset(vfsp, MNTOPT_NONBMAND, NULL)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   484
		nbmand = B_FALSE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   485
	} else if (vfs_optionisset(vfsp, MNTOPT_NBMAND, NULL)) {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   486
		nbmand = B_TRUE;
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   487
	} else {
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   488
		char osname[MAXNAMELEN];
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   489
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   490
		dmu_objset_name(os, osname);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   491
		if (error = dsl_prop_get_integer(osname, "nbmand", &nbmand,
7265
cc18862247da PSARC/2008/483 ZFS clone -o
ahrens
parents: 7184
diff changeset
   492
		    NULL)) {
cc18862247da PSARC/2008/483 ZFS clone -o
ahrens
parents: 7184
diff changeset
   493
			return (error);
cc18862247da PSARC/2008/483 ZFS clone -o
ahrens
parents: 7184
diff changeset
   494
		}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   495
	}
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   496
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   497
	/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   498
	 * Register property callbacks.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   499
	 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   500
	 * It would probably be fine to just check for i/o error from
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   501
	 * the first prop_register(), but I guess I like to go
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   502
	 * overboard...
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   503
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   504
	ds = dmu_objset_ds(os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   505
	error = dsl_prop_register(ds, "atime", atime_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   506
	error = error ? error : dsl_prop_register(ds,
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   507
	    "xattr", xattr_changed_cb, zfsvfs);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   508
	error = error ? error : dsl_prop_register(ds,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   509
	    "recordsize", blksz_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   510
	error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   511
	    "readonly", readonly_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   512
	error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   513
	    "devices", devices_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   514
	error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   515
	    "setuid", setuid_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   516
	error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   517
	    "exec", exec_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   518
	error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   519
	    "snapdir", snapdir_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   520
	error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   521
	    "aclmode", acl_mode_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   522
	error = error ? error : dsl_prop_register(ds,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   523
	    "aclinherit", acl_inherit_changed_cb, zfsvfs);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   524
	error = error ? error : dsl_prop_register(ds,
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   525
	    "vscan", vscan_changed_cb, zfsvfs);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   526
	if (error)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   527
		goto unregister;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   528
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   529
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   530
	 * Invoke our callbacks to restore temporary mount options.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   531
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   532
	if (do_readonly)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   533
		readonly_changed_cb(zfsvfs, readonly);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   534
	if (do_setuid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   535
		setuid_changed_cb(zfsvfs, setuid);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   536
	if (do_exec)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   537
		exec_changed_cb(zfsvfs, exec);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   538
	if (do_devices)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   539
		devices_changed_cb(zfsvfs, devices);
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   540
	if (do_xattr)
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   541
		xattr_changed_cb(zfsvfs, xattr);
4596
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   542
	if (do_atime)
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
   543
		atime_changed_cb(zfsvfs, atime);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   544
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   545
	nbmand_changed_cb(zfsvfs, nbmand);
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   546
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   547
	return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   548
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   549
unregister:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   550
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   551
	 * We may attempt to unregister some callbacks that are not
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   552
	 * registered, but this is OK; it will simply return ENOMSG,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   553
	 * which we will ignore.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   554
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   555
	(void) dsl_prop_unregister(ds, "atime", atime_changed_cb, zfsvfs);
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
   556
	(void) dsl_prop_unregister(ds, "xattr", xattr_changed_cb, zfsvfs);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   557
	(void) dsl_prop_unregister(ds, "recordsize", blksz_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   558
	(void) dsl_prop_unregister(ds, "readonly", readonly_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   559
	(void) dsl_prop_unregister(ds, "devices", devices_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   560
	(void) dsl_prop_unregister(ds, "setuid", setuid_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   561
	(void) dsl_prop_unregister(ds, "exec", exec_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   562
	(void) dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   563
	(void) dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb, zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   564
	(void) dsl_prop_unregister(ds, "aclinherit", acl_inherit_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   565
	    zfsvfs);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
   566
	(void) dsl_prop_unregister(ds, "vscan", vscan_changed_cb, zfsvfs);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   567
	return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   568
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   569
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   570
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   571
static void
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   572
uidacct(objset_t *os, boolean_t isgroup, uint64_t fuid,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   573
    int64_t delta, dmu_tx_t *tx)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   574
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   575
	uint64_t used = 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   576
	char buf[32];
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   577
	int err;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   578
	uint64_t obj = isgroup ? DMU_GROUPUSED_OBJECT : DMU_USERUSED_OBJECT;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   579
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   580
	if (delta == 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   581
		return;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   582
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   583
	(void) snprintf(buf, sizeof (buf), "%llx", (longlong_t)fuid);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   584
	err = zap_lookup(os, obj, buf, 8, 1, &used);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   585
	ASSERT(err == 0 || err == ENOENT);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   586
	/* no underflow/overflow */
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   587
	ASSERT(delta > 0 || used >= -delta);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   588
	ASSERT(delta < 0 || used + delta > used);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   589
	used += delta;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   590
	if (used == 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   591
		err = zap_remove(os, obj, buf, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   592
	else
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   593
		err = zap_update(os, obj, buf, 8, 1, &used, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   594
	ASSERT(err == 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   595
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   596
10407
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   597
static int
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   598
zfs_space_delta_cb(dmu_object_type_t bonustype, void *bonus,
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   599
    uint64_t *userp, uint64_t *groupp)
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   600
{
10407
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   601
	znode_phys_t *znp = bonus;
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   602
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   603
	if (bonustype != DMU_OT_ZNODE)
10407
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   604
		return (ENOENT);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   605
10407
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   606
	*userp = znp->zp_uid;
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   607
	*groupp = znp->zp_gid;
34e10c4af053 6875779 zfs user accounting callbacks can be simplified
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10342
diff changeset
   608
	return (0);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   609
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   610
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   611
static void
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   612
fuidstr_to_sid(zfsvfs_t *zfsvfs, const char *fuidstr,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   613
    char *domainbuf, int buflen, uid_t *ridp)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   614
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   615
	uint64_t fuid;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   616
	const char *domain;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   617
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   618
	fuid = strtonum(fuidstr, NULL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   619
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   620
	domain = zfs_fuid_find_by_idx(zfsvfs, FUID_INDEX(fuid));
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   621
	if (domain)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   622
		(void) strlcpy(domainbuf, domain, buflen);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   623
	else
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   624
		domainbuf[0] = '\0';
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   625
	*ridp = FUID_RID(fuid);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   626
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   627
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   628
static uint64_t
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   629
zfs_userquota_prop_to_obj(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   630
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   631
	switch (type) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   632
	case ZFS_PROP_USERUSED:
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   633
		return (DMU_USERUSED_OBJECT);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   634
	case ZFS_PROP_GROUPUSED:
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   635
		return (DMU_GROUPUSED_OBJECT);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   636
	case ZFS_PROP_USERQUOTA:
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   637
		return (zfsvfs->z_userquota_obj);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   638
	case ZFS_PROP_GROUPQUOTA:
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   639
		return (zfsvfs->z_groupquota_obj);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   640
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   641
	return (0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   642
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   643
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   644
int
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   645
zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   646
    uint64_t *cookiep, void *vbuf, uint64_t *bufsizep)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   647
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   648
	int error;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   649
	zap_cursor_t zc;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   650
	zap_attribute_t za;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   651
	zfs_useracct_t *buf = vbuf;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   652
	uint64_t obj;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   653
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   654
	if (!dmu_objset_userspace_present(zfsvfs->z_os))
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   655
		return (ENOTSUP);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   656
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   657
	obj = zfs_userquota_prop_to_obj(zfsvfs, type);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   658
	if (obj == 0) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   659
		*bufsizep = 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   660
		return (0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   661
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   662
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   663
	for (zap_cursor_init_serialized(&zc, zfsvfs->z_os, obj, *cookiep);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   664
	    (error = zap_cursor_retrieve(&zc, &za)) == 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   665
	    zap_cursor_advance(&zc)) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   666
		if ((uintptr_t)buf - (uintptr_t)vbuf + sizeof (zfs_useracct_t) >
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   667
		    *bufsizep)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   668
			break;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   669
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   670
		fuidstr_to_sid(zfsvfs, za.za_name,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   671
		    buf->zu_domain, sizeof (buf->zu_domain), &buf->zu_rid);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   672
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   673
		buf->zu_space = za.za_first_integer;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   674
		buf++;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   675
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   676
	if (error == ENOENT)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   677
		error = 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   678
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   679
	ASSERT3U((uintptr_t)buf - (uintptr_t)vbuf, <=, *bufsizep);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   680
	*bufsizep = (uintptr_t)buf - (uintptr_t)vbuf;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   681
	*cookiep = zap_cursor_serialize(&zc);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   682
	zap_cursor_fini(&zc);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   683
	return (error);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   684
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   685
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   686
/*
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   687
 * buf must be big enough (eg, 32 bytes)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   688
 */
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   689
static int
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   690
id_to_fuidstr(zfsvfs_t *zfsvfs, const char *domain, uid_t rid,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   691
    char *buf, boolean_t addok)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   692
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   693
	uint64_t fuid;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   694
	int domainid = 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   695
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   696
	if (domain && domain[0]) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   697
		domainid = zfs_fuid_find_by_domain(zfsvfs, domain, NULL, addok);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   698
		if (domainid == -1)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   699
			return (ENOENT);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   700
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   701
	fuid = FUID_ENCODE(domainid, rid);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   702
	(void) sprintf(buf, "%llx", (longlong_t)fuid);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   703
	return (0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   704
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   705
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   706
int
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   707
zfs_userspace_one(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   708
    const char *domain, uint64_t rid, uint64_t *valp)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   709
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   710
	char buf[32];
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   711
	int err;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   712
	uint64_t obj;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   713
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   714
	*valp = 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   715
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   716
	if (!dmu_objset_userspace_present(zfsvfs->z_os))
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   717
		return (ENOTSUP);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   718
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   719
	obj = zfs_userquota_prop_to_obj(zfsvfs, type);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   720
	if (obj == 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   721
		return (0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   722
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   723
	err = id_to_fuidstr(zfsvfs, domain, rid, buf, B_FALSE);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   724
	if (err)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   725
		return (err);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   726
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   727
	err = zap_lookup(zfsvfs->z_os, obj, buf, 8, 1, valp);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   728
	if (err == ENOENT)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   729
		err = 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   730
	return (err);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   731
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   732
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   733
int
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   734
zfs_set_userquota(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   735
    const char *domain, uint64_t rid, uint64_t quota)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   736
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   737
	char buf[32];
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   738
	int err;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   739
	dmu_tx_t *tx;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   740
	uint64_t *objp;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   741
	boolean_t fuid_dirtied;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   742
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   743
	if (type != ZFS_PROP_USERQUOTA && type != ZFS_PROP_GROUPQUOTA)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   744
		return (EINVAL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   745
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   746
	if (zfsvfs->z_version < ZPL_VERSION_USERSPACE)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   747
		return (ENOTSUP);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   748
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   749
	objp = (type == ZFS_PROP_USERQUOTA) ? &zfsvfs->z_userquota_obj :
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   750
	    &zfsvfs->z_groupquota_obj;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   751
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   752
	err = id_to_fuidstr(zfsvfs, domain, rid, buf, B_TRUE);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   753
	if (err)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   754
		return (err);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   755
	fuid_dirtied = zfsvfs->z_fuid_dirty;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   756
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   757
	tx = dmu_tx_create(zfsvfs->z_os);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   758
	dmu_tx_hold_zap(tx, *objp ? *objp : DMU_NEW_OBJECT, B_TRUE, NULL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   759
	if (*objp == 0) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   760
		dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_TRUE,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   761
		    zfs_userquota_prop_prefixes[type]);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   762
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   763
	if (fuid_dirtied)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   764
		zfs_fuid_txhold(zfsvfs, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   765
	err = dmu_tx_assign(tx, TXG_WAIT);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   766
	if (err) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   767
		dmu_tx_abort(tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   768
		return (err);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   769
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   770
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   771
	mutex_enter(&zfsvfs->z_lock);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   772
	if (*objp == 0) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   773
		*objp = zap_create(zfsvfs->z_os, DMU_OT_USERGROUP_QUOTA,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   774
		    DMU_OT_NONE, 0, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   775
		VERIFY(0 == zap_add(zfsvfs->z_os, MASTER_NODE_OBJ,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   776
		    zfs_userquota_prop_prefixes[type], 8, 1, objp, tx));
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   777
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   778
	mutex_exit(&zfsvfs->z_lock);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   779
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   780
	if (quota == 0) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   781
		err = zap_remove(zfsvfs->z_os, *objp, buf, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   782
		if (err == ENOENT)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   783
			err = 0;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   784
	} else {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   785
		err = zap_update(zfsvfs->z_os, *objp, buf, 8, 1, &quota, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   786
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   787
	ASSERT(err == 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   788
	if (fuid_dirtied)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   789
		zfs_fuid_sync(zfsvfs, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   790
	dmu_tx_commit(tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   791
	return (err);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   792
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   793
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   794
boolean_t
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   795
zfs_usergroup_overquota(zfsvfs_t *zfsvfs, boolean_t isgroup, uint64_t fuid)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   796
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   797
	char buf[32];
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   798
	uint64_t used, quota, usedobj, quotaobj;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   799
	int err;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   800
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   801
	usedobj = isgroup ? DMU_GROUPUSED_OBJECT : DMU_USERUSED_OBJECT;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   802
	quotaobj = isgroup ? zfsvfs->z_groupquota_obj : zfsvfs->z_userquota_obj;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   803
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   804
	if (quotaobj == 0 || zfsvfs->z_replay)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   805
		return (B_FALSE);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   806
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   807
	(void) sprintf(buf, "%llx", (longlong_t)fuid);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   808
	err = zap_lookup(zfsvfs->z_os, quotaobj, buf, 8, 1, &quota);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   809
	if (err != 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   810
		return (B_FALSE);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   811
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   812
	err = zap_lookup(zfsvfs->z_os, usedobj, buf, 8, 1, &used);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   813
	if (err != 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   814
		return (B_FALSE);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   815
	return (used >= quota);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   816
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   817
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   818
int
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   819
zfsvfs_create(const char *osname, zfsvfs_t **zvp)
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   820
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   821
	objset_t *os;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   822
	zfsvfs_t *zfsvfs;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   823
	uint64_t zval;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   824
	int i, error;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   825
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   826
	zfsvfs = kmem_zalloc(sizeof (zfsvfs_t), KM_SLEEP);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   827
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   828
	/*
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   829
	 * We claim to always be readonly so we can open snapshots;
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   830
	 * other ZPL code will prevent us from writing to snapshots.
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   831
	 */
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   832
	error = dmu_objset_own(osname, DMU_OST_ZFS, B_TRUE, zfsvfs, &os);
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   833
	if (error) {
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   834
		kmem_free(zfsvfs, sizeof (zfsvfs_t));
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   835
		return (error);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   836
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   837
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   838
	/*
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   839
	 * Initialize the zfs-specific filesystem structure.
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   840
	 * Should probably make this a kmem cache, shuffle fields,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   841
	 * and just bzero up to z_hold_mtx[].
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   842
	 */
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   843
	zfsvfs->z_vfs = NULL;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   844
	zfsvfs->z_parent = zfsvfs;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   845
	zfsvfs->z_max_blksz = SPA_MAXBLOCKSIZE;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   846
	zfsvfs->z_show_ctldir = ZFS_SNAPDIR_VISIBLE;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   847
	zfsvfs->z_os = os;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   848
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   849
	error = zfs_get_zplprop(os, ZFS_PROP_VERSION, &zfsvfs->z_version);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   850
	if (error) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   851
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   852
	} else if (zfsvfs->z_version > ZPL_VERSION) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   853
		(void) printf("Mismatched versions:  File system "
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   854
		    "is version %llu on-disk format, which is "
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   855
		    "incompatible with this software version %lld!",
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   856
		    (u_longlong_t)zfsvfs->z_version, ZPL_VERSION);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   857
		error = ENOTSUP;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   858
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   859
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   860
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   861
	if ((error = zfs_get_zplprop(os, ZFS_PROP_NORMALIZE, &zval)) != 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   862
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   863
	zfsvfs->z_norm = (int)zval;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   864
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   865
	if ((error = zfs_get_zplprop(os, ZFS_PROP_UTF8ONLY, &zval)) != 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   866
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   867
	zfsvfs->z_utf8 = (zval != 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   868
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   869
	if ((error = zfs_get_zplprop(os, ZFS_PROP_CASE, &zval)) != 0)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   870
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   871
	zfsvfs->z_case = (uint_t)zval;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   872
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   873
	/*
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   874
	 * Fold case on file systems that are always or sometimes case
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   875
	 * insensitive.
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   876
	 */
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   877
	if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE ||
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   878
	    zfsvfs->z_case == ZFS_CASE_MIXED)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   879
		zfsvfs->z_norm |= U8_TEXTPREP_TOUPPER;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   880
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   881
	zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   882
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   883
	error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_ROOT_OBJ, 8, 1,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   884
	    &zfsvfs->z_root);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   885
	if (error)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   886
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   887
	ASSERT(zfsvfs->z_root != 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   888
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   889
	error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_UNLINKED_SET, 8, 1,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   890
	    &zfsvfs->z_unlinkedobj);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   891
	if (error)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   892
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   893
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   894
	error = zap_lookup(os, MASTER_NODE_OBJ,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   895
	    zfs_userquota_prop_prefixes[ZFS_PROP_USERQUOTA],
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   896
	    8, 1, &zfsvfs->z_userquota_obj);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   897
	if (error && error != ENOENT)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   898
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   899
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   900
	error = zap_lookup(os, MASTER_NODE_OBJ,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   901
	    zfs_userquota_prop_prefixes[ZFS_PROP_GROUPQUOTA],
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   902
	    8, 1, &zfsvfs->z_groupquota_obj);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   903
	if (error && error != ENOENT)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   904
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   905
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   906
	error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_FUID_TABLES, 8, 1,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   907
	    &zfsvfs->z_fuid_obj);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   908
	if (error && error != ENOENT)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   909
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   910
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   911
	error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_SHARES_DIR, 8, 1,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   912
	    &zfsvfs->z_shares_dir);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   913
	if (error && error != ENOENT)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   914
		goto out;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   915
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   916
	mutex_init(&zfsvfs->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   917
	mutex_init(&zfsvfs->z_lock, NULL, MUTEX_DEFAULT, NULL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   918
	list_create(&zfsvfs->z_all_znodes, sizeof (znode_t),
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   919
	    offsetof(znode_t, z_link_node));
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   920
	rrw_init(&zfsvfs->z_teardown_lock);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   921
	rw_init(&zfsvfs->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   922
	rw_init(&zfsvfs->z_fuid_lock, NULL, RW_DEFAULT, NULL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   923
	for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   924
		mutex_init(&zfsvfs->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   925
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   926
	*zvp = zfsvfs;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   927
	return (0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   928
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   929
out:
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   930
	dmu_objset_disown(os, zfsvfs);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   931
	*zvp = NULL;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   932
	kmem_free(zfsvfs, sizeof (zfsvfs_t));
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   933
	return (error);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   934
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
   935
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
   936
static int
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   937
zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   938
{
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   939
	int error;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   940
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   941
	error = zfs_register_callbacks(zfsvfs->z_vfs);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   942
	if (error)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   943
		return (error);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   944
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   945
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   946
	 * Set the objset user_ptr to track its zfsvfs.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   947
	 */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   948
	mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   949
	dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
   950
	mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   951
9292
e112194b5b73 6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9246
diff changeset
   952
	zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
e112194b5b73 6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9246
diff changeset
   953
	if (zil_disable) {
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10407
diff changeset
   954
		zil_destroy(zfsvfs->z_log, B_FALSE);
9292
e112194b5b73 6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9246
diff changeset
   955
		zfsvfs->z_log = NULL;
e112194b5b73 6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9246
diff changeset
   956
	}
e112194b5b73 6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9246
diff changeset
   957
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   958
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   959
	 * If we are not mounting (ie: online recv), then we don't
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   960
	 * have to worry about replaying the log as we blocked all
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   961
	 * operations out since we closed the ZIL.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   962
	 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   963
	if (mounting) {
7638
5505e89fa6c8 6741237 zfs hang in txg_wait_open() on boot
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7265
diff changeset
   964
		boolean_t readonly;
5505e89fa6c8 6741237 zfs hang in txg_wait_open() on boot
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7265
diff changeset
   965
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   966
		/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   967
		 * During replay we remove the read only flag to
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   968
		 * allow replays to succeed.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   969
		 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   970
		readonly = zfsvfs->z_vfs->vfs_flag & VFS_RDONLY;
8227
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   971
		if (readonly != 0)
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   972
			zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY;
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   973
		else
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   974
			zfs_unlinked_drain(zfsvfs);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
   975
9292
e112194b5b73 6798298 zfs rollback or incremental zfs recv results in intent log being closed
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9246
diff changeset
   976
		if (zfsvfs->z_log) {
8227
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   977
			/*
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   978
			 * Parse and replay the intent log.
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   979
			 *
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   980
			 * Because of ziltest, this must be done after
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   981
			 * zfs_unlinked_drain().  (Further note: ziltest
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   982
			 * doesn't use readonly mounts, where
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   983
			 * zfs_unlinked_drain() isn't called.)  This is because
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   984
			 * ziltest causes spa_sync() to think it's committed,
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   985
			 * but actually it is not, so the intent log contains
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   986
			 * many txg's worth of changes.
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   987
			 *
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   988
			 * In particular, if object N is in the unlinked set in
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   989
			 * the last txg to actually sync, then it could be
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   990
			 * actually freed in a later txg and then reallocated
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   991
			 * in a yet later txg.  This would write a "create
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   992
			 * object N" record to the intent log.  Normally, this
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   993
			 * would be fine because the spa_sync() would have
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   994
			 * written out the fact that object N is free, before
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   995
			 * we could write the "create object N" intent log
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   996
			 * record.
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   997
			 *
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   998
			 * But when we are in ziltest mode, we advance the "open
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
   999
			 * txg" without actually spa_sync()-ing the changes to
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1000
			 * disk.  So we would see that object N is still
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1001
			 * allocated and in the unlinked set, and there is an
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1002
			 * intent log record saying to allocate it.
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1003
			 */
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1004
			zfsvfs->z_replay = B_TRUE;
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1005
			zil_replay(zfsvfs->z_os, zfsvfs, zfs_replay_vector);
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1006
			zfsvfs->z_replay = B_FALSE;
f7d7be9b1f56 6765294 Refactor replay
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 7757
diff changeset
  1007
		}
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1008
		zfsvfs->z_vfs->vfs_flag |= readonly; /* restore readonly bit */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1009
	}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1010
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1011
	return (0);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1012
}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1013
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1014
void
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1015
zfsvfs_free(zfsvfs_t *zfsvfs)
6083
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1016
{
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1017
	int i;
9788
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1018
	extern krwlock_t zfsvfs_lock; /* in zfs_znode.c */
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1019
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1020
	/*
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1021
	 * This is a barrier to prevent the filesystem from going away in
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1022
	 * zfs_znode_move() until we can safely ensure that the filesystem is
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1023
	 * not unmounted. We consider the filesystem valid before the barrier
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1024
	 * and invalid after the barrier.
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1025
	 */
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1026
	rw_enter(&zfsvfs_lock, RW_READER);
f660bc44f2e8 6843700 zfs_znode_move() does not ensure valid file system pointer
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 9749
diff changeset
  1027
	rw_exit(&zfsvfs_lock);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1028
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1029
	zfs_fuid_destroy(zfsvfs);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1030
6083
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1031
	mutex_destroy(&zfsvfs->z_znodes_lock);
9030
243fd360d81f 6815893 hang mounting a dataset after booting into a new boot environment
Mark Shellenbaum <Mark.Shellenbaum@Sun.COM>
parents: 8227
diff changeset
  1032
	mutex_destroy(&zfsvfs->z_lock);
6083
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1033
	list_destroy(&zfsvfs->z_all_znodes);
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1034
	rrw_destroy(&zfsvfs->z_teardown_lock);
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1035
	rw_destroy(&zfsvfs->z_teardown_inactive_lock);
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1036
	rw_destroy(&zfsvfs->z_fuid_lock);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1037
	for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1038
		mutex_destroy(&zfsvfs->z_hold_mtx[i]);
6083
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1039
	kmem_free(zfsvfs, sizeof (zfsvfs_t));
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1040
}
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1041
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1042
static void
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1043
zfs_set_fuid_feature(zfsvfs_t *zfsvfs)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1044
{
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1045
	zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1046
	if (zfsvfs->z_use_fuids && zfsvfs->z_vfs) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1047
		vfs_set_feature(zfsvfs->z_vfs, VFSFT_XVATTR);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1048
		vfs_set_feature(zfsvfs->z_vfs, VFSFT_SYSATTR_VIEWS);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1049
		vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACEMASKONACCESS);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1050
		vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACLONCREATE);
9749
105f407a2680 PSARC 2009/246 ZFS support for Access Based Enumeration
Tim Haley <Tim.Haley@Sun.COM>
parents: 9688
diff changeset
  1051
		vfs_set_feature(zfsvfs->z_vfs, VFSFT_ACCESS_FILTER);
10793
34709091de6d 6886081 Solaris needs reparse point support (PSARC 2009/387)
Dai Ngo <dai.ngo@sun.com>
parents: 10685
diff changeset
  1052
		vfs_set_feature(zfsvfs->z_vfs, VFSFT_REPARSE);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1053
	}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1054
}
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1055
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1056
static int
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6689
diff changeset
  1057
zfs_domount(vfs_t *vfsp, char *osname)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1058
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1059
	dev_t mount_dev;
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1060
	uint64_t recordsize, fsid_guid;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1061
	int error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1062
	zfsvfs_t *zfsvfs;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1063
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1064
	ASSERT(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1065
	ASSERT(osname);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1066
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1067
	error = zfsvfs_create(osname, &zfsvfs);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1068
	if (error)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1069
		return (error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1070
	zfsvfs->z_vfs = vfsp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1071
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1072
	/* Initialize the generic filesystem structure. */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1073
	vfsp->vfs_bcount = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1074
	vfsp->vfs_data = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1075
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1076
	if (zfs_create_unique_device(&mount_dev) == -1) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1077
		error = ENODEV;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1078
		goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1079
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1080
	ASSERT(vfs_devismounted(mount_dev) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1081
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1082
	if (error = dsl_prop_get_integer(osname, "recordsize", &recordsize,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1083
	    NULL))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1084
		goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1085
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1086
	vfsp->vfs_dev = mount_dev;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1087
	vfsp->vfs_fstype = zfsfstype;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1088
	vfsp->vfs_bsize = recordsize;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1089
	vfsp->vfs_flag |= VFS_NOTRUNC;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1090
	vfsp->vfs_data = zfsvfs;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1091
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1092
	/*
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1093
	 * The fsid is 64 bits, composed of an 8-bit fs type, which
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1094
	 * separates our fsid from any other filesystem types, and a
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1095
	 * 56-bit objset unique ID.  The objset unique ID is unique to
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1096
	 * all objsets open on this system, provided by unique_create().
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1097
	 * The 8-bit fs type must be put in the low bits of fsid[1]
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1098
	 * because that's where other Solaris filesystems put it.
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1099
	 */
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1100
	fsid_guid = dmu_objset_fsid_guid(zfsvfs->z_os);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1101
	ASSERT((fsid_guid & ~((1ULL<<56)-1)) == 0);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1102
	vfsp->vfs_fsid.val[0] = fsid_guid;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1103
	vfsp->vfs_fsid.val[1] = ((fsid_guid>>32) << 8) |
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1104
	    zfsfstype & 0xFF;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1105
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1106
	/*
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1107
	 * Set features for file system.
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1108
	 */
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1109
	zfs_set_fuid_feature(zfsvfs);
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1110
	if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1111
		vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS);
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1112
		vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE);
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1113
		vfs_set_feature(vfsp, VFSFT_NOCASESENSITIVE);
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1114
	} else if (zfsvfs->z_case == ZFS_CASE_MIXED) {
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1115
		vfs_set_feature(vfsp, VFSFT_DIRENTFLAGS);
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1116
		vfs_set_feature(vfsp, VFSFT_CASEINSENSITIVE);
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  1117
	}
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1118
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1119
	if (dmu_objset_is_snapshot(zfsvfs->z_os)) {
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1120
		uint64_t pval;
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
  1121
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1122
		atime_changed_cb(zfsvfs, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1123
		readonly_changed_cb(zfsvfs, B_TRUE);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1124
		if (error = dsl_prop_get_integer(osname, "xattr", &pval, NULL))
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
  1125
			goto out;
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1126
		xattr_changed_cb(zfsvfs, pval);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1127
		zfsvfs->z_issnap = B_TRUE;
9688
127be1845343 6841321 zfs userspace / zfs get userused@ doesn't work on mounted snapshot
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9396
diff changeset
  1128
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1129
		mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
9688
127be1845343 6841321 zfs userspace / zfs get userused@ doesn't work on mounted snapshot
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9396
diff changeset
  1130
		dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1131
		mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1132
	} else {
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1133
		error = zfsvfs_setup(zfsvfs, B_TRUE);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1134
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1135
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1136
	if (!zfsvfs->z_issnap)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1137
		zfsctl_create(zfsvfs);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1138
out:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1139
	if (error) {
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1140
		dmu_objset_disown(zfsvfs->z_os, zfsvfs);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  1141
		zfsvfs_free(zfsvfs);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1142
	} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1143
		atomic_add_32(&zfs_active_fs_count, 1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1144
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1145
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1146
	return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1147
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1148
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1149
void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1150
zfs_unregister_callbacks(zfsvfs_t *zfsvfs)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1151
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1152
	objset_t *os = zfsvfs->z_os;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1153
	struct dsl_dataset *ds;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1154
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1155
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1156
	 * Unregister properties.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1157
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1158
	if (!dmu_objset_is_snapshot(os)) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1159
		ds = dmu_objset_ds(os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1160
		VERIFY(dsl_prop_unregister(ds, "atime", atime_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1161
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1162
3234
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
  1163
		VERIFY(dsl_prop_unregister(ds, "xattr", xattr_changed_cb,
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
  1164
		    zfsvfs) == 0);
28b36f7bbd7e PSARC/2006/638 noxattr ZFS property
ck153898
parents: 2885
diff changeset
  1165
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1166
		VERIFY(dsl_prop_unregister(ds, "recordsize", blksz_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1167
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1168
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1169
		VERIFY(dsl_prop_unregister(ds, "readonly", readonly_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1170
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1171
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1172
		VERIFY(dsl_prop_unregister(ds, "devices", devices_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1173
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1174
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1175
		VERIFY(dsl_prop_unregister(ds, "setuid", setuid_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1176
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1177
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1178
		VERIFY(dsl_prop_unregister(ds, "exec", exec_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1179
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1180
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1181
		VERIFY(dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1182
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1183
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1184
		VERIFY(dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1185
		    zfsvfs) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1186
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1187
		VERIFY(dsl_prop_unregister(ds, "aclinherit",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1188
		    acl_inherit_changed_cb, zfsvfs) == 0);
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1189
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1190
		VERIFY(dsl_prop_unregister(ds, "vscan",
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1191
		    vscan_changed_cb, zfsvfs) == 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1192
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1193
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1194
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1195
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1196
 * Convert a decimal digit string to a uint64_t integer.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1197
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1198
static int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1199
str_to_uint64(char *str, uint64_t *objnum)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1200
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1201
	uint64_t num = 0;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1202
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1203
	while (*str) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1204
		if (*str < '0' || *str > '9')
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1205
			return (EINVAL);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1206
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1207
		num = num*10 + *str++ - '0';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1208
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1209
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1210
	*objnum = num;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1211
	return (0);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1212
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1213
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1214
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1215
 * The boot path passed from the boot loader is in the form of
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1216
 * "rootpool-name/root-filesystem-object-number'. Convert this
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1217
 * string to a dataset name: "rootpool-name/root-filesystem-name".
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1218
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1219
static int
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1220
zfs_parse_bootfs(char *bpath, char *outpath)
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1221
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1222
	char *slashp;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1223
	uint64_t objnum;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1224
	int error;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1225
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1226
	if (*bpath == 0 || *bpath == '/')
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1227
		return (EINVAL);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1228
7656
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 7638
diff changeset
  1229
	(void) strcpy(outpath, bpath);
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 7638
diff changeset
  1230
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1231
	slashp = strchr(bpath, '/');
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1232
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1233
	/* if no '/', just return the pool name */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1234
	if (slashp == NULL) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1235
		return (0);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1236
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1237
7656
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 7638
diff changeset
  1238
	/* if not a number, just return the root dataset name */
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 7638
diff changeset
  1239
	if (str_to_uint64(slashp+1, &objnum)) {
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 7638
diff changeset
  1240
		return (0);
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 7638
diff changeset
  1241
	}
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1242
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1243
	*slashp = '\0';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1244
	error = dsl_dsobj_to_dsname(bpath, objnum, outpath);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1245
	*slashp = '/';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1246
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1247
	return (error);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1248
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1249
10972
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1250
/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1251
 * zfs_check_global_label:
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1252
 *	Check that the hex label string is appropriate for the dataset
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1253
 *	being mounted into the global_zone proper.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1254
 *
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1255
 *	Return an error if the hex label string is not default or
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1256
 *	admin_low/admin_high.  For admin_low labels, the corresponding
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1257
 *	dataset must be readonly.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1258
 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1259
int
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1260
zfs_check_global_label(const char *dsname, const char *hexsl)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1261
{
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1262
	if (strcasecmp(hexsl, ZFS_MLSLABEL_DEFAULT) == 0)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1263
		return (0);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1264
	if (strcasecmp(hexsl, ADMIN_HIGH) == 0)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1265
		return (0);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1266
	if (strcasecmp(hexsl, ADMIN_LOW) == 0) {
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1267
		/* must be readonly */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1268
		uint64_t rdonly;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1269
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1270
		if (dsl_prop_get_integer(dsname,
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1271
		    zfs_prop_to_name(ZFS_PROP_READONLY), &rdonly, NULL))
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1272
			return (EACCES);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1273
		return (rdonly ? 0 : EACCES);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1274
	}
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1275
	return (EACCES);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1276
}
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1277
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1278
/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1279
 * zfs_mount_label_policy:
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1280
 *	Determine whether the mount is allowed according to MAC check.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1281
 *	by comparing (where appropriate) label of the dataset against
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1282
 *	the label of the zone being mounted into.  If the dataset has
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1283
 *	no label, create one.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1284
 *
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1285
 *	Returns:
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1286
 *		 0 :	access allowed
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1287
 *		>0 :	error code, such as EACCES
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1288
 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1289
static int
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1290
zfs_mount_label_policy(vfs_t *vfsp, char *osname)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1291
{
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1292
	int		error, retv;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1293
	zone_t		*mntzone = NULL;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1294
	ts_label_t	*mnt_tsl;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1295
	bslabel_t	*mnt_sl;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1296
	bslabel_t	ds_sl;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1297
	char		ds_hexsl[MAXNAMELEN];
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1298
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1299
	retv = EACCES;				/* assume the worst */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1300
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1301
	/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1302
	 * Start by getting the dataset label if it exists.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1303
	 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1304
	error = dsl_prop_get(osname, zfs_prop_to_name(ZFS_PROP_MLSLABEL),
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1305
	    1, sizeof (ds_hexsl), &ds_hexsl, NULL);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1306
	if (error)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1307
		return (EACCES);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1308
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1309
	/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1310
	 * If labeling is NOT enabled, then disallow the mount of datasets
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1311
	 * which have a non-default label already.  No other label checks
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1312
	 * are needed.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1313
	 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1314
	if (!is_system_labeled()) {
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1315
		if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1316
			return (0);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1317
		return (EACCES);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1318
	}
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1319
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1320
	/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1321
	 * Get the label of the mountpoint.  If mounting into the global
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1322
	 * zone (i.e. mountpoint is not within an active zone and the
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1323
	 * zoned property is off), the label must be default or
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1324
	 * admin_low/admin_high only; no other checks are needed.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1325
	 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1326
	mntzone = zone_find_by_any_path(refstr_value(vfsp->vfs_mntpt), B_FALSE);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1327
	if (mntzone->zone_id == GLOBAL_ZONEID) {
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1328
		uint64_t zoned;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1329
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1330
		zone_rele(mntzone);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1331
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1332
		if (dsl_prop_get_integer(osname,
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1333
		    zfs_prop_to_name(ZFS_PROP_ZONED), &zoned, NULL))
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1334
			return (EACCES);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1335
		if (!zoned)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1336
			return (zfs_check_global_label(osname, ds_hexsl));
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1337
		else
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1338
			/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1339
			 * This is the case of a zone dataset being mounted
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1340
			 * initially, before the zone has been fully created;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1341
			 * allow this mount into global zone.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1342
			 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1343
			return (0);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1344
	}
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1345
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1346
	mnt_tsl = mntzone->zone_slabel;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1347
	ASSERT(mnt_tsl != NULL);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1348
	label_hold(mnt_tsl);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1349
	mnt_sl = label2bslabel(mnt_tsl);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1350
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1351
	if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) == 0) {
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1352
		/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1353
		 * The dataset doesn't have a real label, so fabricate one.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1354
		 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1355
		char *str = NULL;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1356
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1357
		if (l_to_str_internal(mnt_sl, &str) == 0 &&
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1358
		    dsl_prop_set(osname, zfs_prop_to_name(ZFS_PROP_MLSLABEL),
11022
63ab26072e41 PSARC 2009/510 ZFS received properties
Tom Erickson <Tom.Erickson@Sun.COM>
parents: 10984
diff changeset
  1359
		    ZPROP_SRC_LOCAL, 1, strlen(str) + 1, str) == 0)
10972
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1360
			retv = 0;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1361
		if (str != NULL)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1362
			kmem_free(str, strlen(str) + 1);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1363
	} else if (hexstr_to_label(ds_hexsl, &ds_sl) == 0) {
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1364
		/*
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1365
		 * Now compare labels to complete the MAC check.  If the
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1366
		 * labels are equal then allow access.  If the mountpoint
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1367
		 * label dominates the dataset label, allow readonly access.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1368
		 * Otherwise, access is denied.
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1369
		 */
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1370
		if (blequal(mnt_sl, &ds_sl))
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1371
			retv = 0;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1372
		else if (bldominates(mnt_sl, &ds_sl)) {
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1373
			vfs_setmntopt(vfsp, MNTOPT_RO, NULL, 0);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1374
			retv = 0;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1375
		}
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1376
	}
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1377
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1378
	label_rele(mnt_tsl);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1379
	zone_rele(mntzone);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1380
	return (retv);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1381
}
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1382
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1383
static int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1384
zfs_mountroot(vfs_t *vfsp, enum whymountroot why)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1385
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1386
	int error = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1387
	static int zfsrootdone = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1388
	zfsvfs_t *zfsvfs = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1389
	znode_t *zp = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1390
	vnode_t *vp = NULL;
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1391
	char *zfs_bootfs;
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1392
	char *zfs_devid;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1393
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1394
	ASSERT(vfsp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1395
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1396
	/*
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1397
	 * The filesystem that we mount as root is defined in the
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1398
	 * boot property "zfs-bootfs" with a format of
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1399
	 * "poolname/root-dataset-objnum".
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1400
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1401
	if (why == ROOT_INIT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1402
		if (zfsrootdone++)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1403
			return (EBUSY);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1404
		/*
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1405
		 * the process of doing a spa_load will require the
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1406
		 * clock to be set before we could (for example) do
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1407
		 * something better by looking at the timestamp on
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1408
		 * an uberblock, so just set it to -1.
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1409
		 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1410
		clkset(-1);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1411
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1412
		if ((zfs_bootfs = spa_get_bootprop("zfs-bootfs")) == NULL) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1413
			cmn_err(CE_NOTE, "spa_get_bootfs: can not get "
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1414
			    "bootfs name");
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1415
			return (EINVAL);
5648
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 5642
diff changeset
  1416
		}
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1417
		zfs_devid = spa_get_bootprop("diskdevid");
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1418
		error = spa_import_rootpool(rootfs.bo_name, zfs_devid);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1419
		if (zfs_devid)
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1420
			spa_free_bootprop(zfs_devid);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1421
		if (error) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1422
			spa_free_bootprop(zfs_bootfs);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1423
			cmn_err(CE_NOTE, "spa_import_rootpool: error %d",
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1424
			    error);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1425
			return (error);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1426
		}
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1427
		if (error = zfs_parse_bootfs(zfs_bootfs, rootfs.bo_name)) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1428
			spa_free_bootprop(zfs_bootfs);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1429
			cmn_err(CE_NOTE, "zfs_parse_bootfs: error %d",
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1430
			    error);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1431
			return (error);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1432
		}
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1433
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1434
		spa_free_bootprop(zfs_bootfs);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1435
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1436
		if (error = vfs_lock(vfsp))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1437
			return (error);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1438
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6689
diff changeset
  1439
		if (error = zfs_domount(vfsp, rootfs.bo_name)) {
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1440
			cmn_err(CE_NOTE, "zfs_domount: error %d", error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1441
			goto out;
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1442
		}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1443
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1444
		zfsvfs = (zfsvfs_t *)vfsp->vfs_data;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1445
		ASSERT(zfsvfs);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1446
		if (error = zfs_zget(zfsvfs, zfsvfs->z_root, &zp)) {
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 7046
diff changeset
  1447
			cmn_err(CE_NOTE, "zfs_zget: error %d", error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1448
			goto out;
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1449
		}
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1450
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1451
		vp = ZTOV(zp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1452
		mutex_enter(&vp->v_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1453
		vp->v_flag |= VROOT;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1454
		mutex_exit(&vp->v_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1455
		rootvp = vp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1456
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1457
		/*
6570
bbfcb773718e 6698415 on zfs root, ace_walk oversteps its bounds, causing panic when kmem_flags is set to 0x4f
marks
parents: 6423
diff changeset
  1458
		 * Leave rootvp held.  The root file system is never unmounted.
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1459
		 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1460
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1461
		vfs_add((struct vnode *)0, vfsp,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1462
		    (vfsp->vfs_flag & VFS_RDONLY) ? MS_RDONLY : 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1463
out:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1464
		vfs_unlock(vfsp);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 6404
diff changeset
  1465
		return (error);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1466
	} else if (why == ROOT_REMOUNT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1467
		readonly_changed_cb(vfsp->vfs_data, B_FALSE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1468
		vfsp->vfs_flag |= VFS_REMOUNT;
4596
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1469
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1470
		/* refresh mount options */
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1471
		zfs_unregister_callbacks(vfsp->vfs_data);
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1472
		return (zfs_register_callbacks(vfsp));
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1473
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1474
	} else if (why == ROOT_UNMOUNT) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1475
		zfs_unregister_callbacks((zfsvfs_t *)vfsp->vfs_data);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1476
		(void) zfs_sync(vfsp, 0, 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1477
		return (0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1478
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1479
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1480
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1481
	 * if "why" is equal to anything else other than ROOT_INIT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1482
	 * ROOT_REMOUNT, or ROOT_UNMOUNT, we do not support it.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1483
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1484
	return (ENOTSUP);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1485
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1488
diff changeset
  1486
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1487
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1488
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1489
zfs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1490
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1491
	char		*osname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1492
	pathname_t	spn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1493
	int		error = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1494
	uio_seg_t	fromspace = (uap->flags & MS_SYSSPACE) ?
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3898
diff changeset
  1495
	    UIO_SYSSPACE : UIO_USERSPACE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1496
	int		canwrite;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1497
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1498
	if (mvp->v_type != VDIR)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1499
		return (ENOTDIR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1500
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1501
	mutex_enter(&mvp->v_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1502
	if ((uap->flags & MS_REMOUNT) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1503
	    (uap->flags & MS_OVERLAY) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1504
	    (mvp->v_count != 1 || (mvp->v_flag & VROOT))) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1505
		mutex_exit(&mvp->v_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1506
		return (EBUSY);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1507
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
	mutex_exit(&mvp->v_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1509
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1510
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1511
	 * ZFS does not support passing unparsed data in via MS_DATA.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1512
	 * Users should use the MS_OPTIONSTR interface; this means
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1513
	 * that all option parsing is already done and the options struct
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1514
	 * can be interrogated.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1515
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1516
	if ((uap->flags & MS_DATA) && uap->datalen > 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1517
		return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1519
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1520
	 * Get the objset name (the "special" mount argument).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1521
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
	if (error = pn_get(uap->spec, fromspace, &spn))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1523
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1524
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1525
	osname = spn.pn_path;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1526
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1527
	/*
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1528
	 * Check for mount privilege?
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1529
	 *
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1530
	 * If we don't have privilege then see if
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1531
	 * we have local permission to allow it
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1532
	 */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1533
	error = secpolicy_fs_mount(cr, mvp, vfsp);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1534
	if (error) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1535
		error = dsl_deleg_access(osname, ZFS_DELEG_PERM_MOUNT, cr);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1536
		if (error == 0) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1537
			vattr_t		vattr;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1538
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1539
			/*
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1540
			 * Make sure user is the owner of the mount point
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1541
			 * or has sufficient privileges.
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1542
			 */
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1544
			vattr.va_mask = AT_UID;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1545
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1546
			if (error = VOP_GETATTR(mvp, &vattr, 0, cr, NULL)) {
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1547
				goto out;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1548
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1549
5489
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5446
diff changeset
  1550
			if (secpolicy_vnode_owner(cr, vattr.va_uid) != 0 &&
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5446
diff changeset
  1551
			    VOP_ACCESS(mvp, VWRITE, 0, cr, NULL) != 0) {
25bfaf065197 6601830 mismatch between zfs_mount() behavior and comment
marks
parents: 5446
diff changeset
  1552
				error = EPERM;
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1553
				goto out;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1554
			}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1555
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1556
			secpolicy_fs_mount_clearopts(cr, vfsp);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1557
		} else {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1558
			goto out;
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1559
		}
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1560
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1561
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1562
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1563
	 * Refuse to mount a filesystem if we are in a local zone and the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1564
	 * dataset is not visible.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1565
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1566
	if (!INGLOBALZONE(curproc) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1567
	    (!zone_dataset_visible(osname, &canwrite) || !canwrite)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1568
		error = EPERM;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1569
		goto out;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1570
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1571
10972
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1572
	error = zfs_mount_label_policy(vfsp, osname);
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1573
	if (error)
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1574
		goto out;
807794d41b3a PSARC 2009/348 Security Labels for ZFS
Ric Aleshire <Ric.Aleshire@Sun.COM>
parents: 10793
diff changeset
  1575
4596
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1576
	/*
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1577
	 * When doing a remount, we simply refresh our temporary properties
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1578
	 * according to those options set in the current VFS options.
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1579
	 */
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1580
	if (uap->flags & MS_REMOUNT) {
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1581
		/* refresh mount options */
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1582
		zfs_unregister_callbacks(vfsp->vfs_data);
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1583
		error = zfs_register_callbacks(vfsp);
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1584
		goto out;
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1585
	}
3aa6e3b5dfca 6561658 xattrs aren't enabled on zfs root filesystem, weirdness with mount output
lling
parents: 4577
diff changeset
  1586
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 6689
diff changeset
  1587
	error = zfs_domount(vfsp, osname);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1588
9214
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  1589
	/*
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  1590
	 * Add an extra VFS_HOLD on our parent vfs so that it can't
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  1591
	 * disappear due to a forced unmount.
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  1592
	 */
9246
67c03c93c071 6824062 System panicked in zfs_mount due to NULL pointer dereference when running btts and svvs tests
Chris Kirby <chris.kirby@sun.com>
parents: 9234
diff changeset
  1593
	if (error == 0 && ((zfsvfs_t *)vfsp->vfs_data)->z_issnap)
9214
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  1594
		VFS_HOLD(mvp->v_vfsp);
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  1595
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1596
out:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1597
	pn_free(&spn);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1598
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1599
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1600
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1601
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1602
zfs_statvfs(vfs_t *vfsp, struct statvfs64 *statp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1603
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1604
	zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1605
	dev32_t d32;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
  1606
	uint64_t refdbytes, availbytes, usedobjs, availobjs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1607
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1608
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1609
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
  1610
	dmu_objset_space(zfsvfs->z_os,
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
  1611
	    &refdbytes, &availbytes, &usedobjs, &availobjs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1612
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1613
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1614
	 * The underlying storage pool actually uses multiple block sizes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1615
	 * We report the fragsize as the smallest block size we support,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1616
	 * and we report our blocksize as the filesystem's maximum blocksize.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1617
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1618
	statp->f_frsize = 1UL << SPA_MINBLOCKSHIFT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1619
	statp->f_bsize = zfsvfs->z_max_blksz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1620
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1621
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1622
	 * The following report "total" blocks of various kinds in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1623
	 * file system, but reported in terms of f_frsize - the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1624
	 * "fragment" size.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1625
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1626
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
  1627
	statp->f_blocks = (refdbytes + availbytes) >> SPA_MINBLOCKSHIFT;
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
  1628
	statp->f_bfree = availbytes >> SPA_MINBLOCKSHIFT;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1629
	statp->f_bavail = statp->f_bfree; /* no root reservation */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1630
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1631
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1632
	 * statvfs() should really be called statufs(), because it assumes
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1633
	 * static metadata.  ZFS doesn't preallocate files, so the best
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1634
	 * we can do is report the max that could possibly fit in f_files,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1635
	 * and that minus the number actually used in f_ffree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1636
	 * For f_ffree, report the smaller of the number of object available
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1637
	 * and the number of blocks (each object will take at least a block).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1638
	 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
  1639
	statp->f_ffree = MIN(availobjs, statp->f_bfree);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1640
	statp->f_favail = statp->f_ffree;	/* no "root reservation" */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2676
diff changeset
  1641
	statp->f_files = statp->f_ffree + usedobjs;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1642
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1643
	(void) cmpldev(&d32, vfsp->vfs_dev);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1644
	statp->f_fsid = d32;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1645
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1646
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1647
	 * We're a zfs filesystem.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1648
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1649
	(void) strcpy(statp->f_basetype, vfssw[vfsp->vfs_fstype].vsw_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1650
1123
02a0390fbc7d 6363529 UNIX03/UNIX98 *vsx* CAPI.os/files/fstatvfs/T.fstatvfs 11 FAILS
marks
parents: 849
diff changeset
  1651
	statp->f_flag = vf_to_stf(vfsp->vfs_flag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1652
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1653
	statp->f_namemax = ZFS_MAXNAMELEN;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1654
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1655
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1656
	 * We have all of 32 characters to stuff a string here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1657
	 * Is there anything useful we could/should provide?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1658
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1659
	bzero(statp->f_fstr, sizeof (statp->f_fstr));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1660
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1661
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1662
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1663
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1664
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1665
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1666
zfs_root(vfs_t *vfsp, vnode_t **vpp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1667
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1668
	zfsvfs_t *zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1669
	znode_t *rootzp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1670
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1671
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1672
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1673
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1674
	error = zfs_zget(zfsvfs, zfsvfs->z_root, &rootzp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1675
	if (error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1676
		*vpp = ZTOV(rootzp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1677
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1678
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1679
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1680
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1681
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1682
/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1683
 * Teardown the zfsvfs::z_os.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1684
 *
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1685
 * Note, if 'unmounting' if FALSE, we return with the 'z_teardown_lock'
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1686
 * and 'z_teardown_inactive_lock' held.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1687
 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1688
static int
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1689
zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1690
{
5642
504c84876fda 6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents: 5498
diff changeset
  1691
	znode_t	*zp;
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1692
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1693
	rrw_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1694
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1695
	if (!unmounting) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1696
		/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1697
		 * We purge the parent filesystem's vfsp as the parent
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1698
		 * filesystem and all of its snapshots have their vnode's
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1699
		 * v_vfsp set to the parent's filesystem's vfsp.  Note,
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1700
		 * 'z_parent' is self referential for non-snapshots.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1701
		 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1702
		(void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1703
	}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1704
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1705
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1706
	 * Close the zil. NB: Can't close the zil while zfs_inactive
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1707
	 * threads are blocked as zil_close can call zfs_inactive.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1708
	 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1709
	if (zfsvfs->z_log) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1710
		zil_close(zfsvfs->z_log);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1711
		zfsvfs->z_log = NULL;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1712
	}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1713
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1714
	rw_enter(&zfsvfs->z_teardown_inactive_lock, RW_WRITER);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1715
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1716
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1717
	 * If we are not unmounting (ie: online recv) and someone already
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1718
	 * unmounted this file system while we were doing the switcheroo,
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1719
	 * or a reopen of z_os failed then just bail out now.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1720
	 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1721
	if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1722
		rw_exit(&zfsvfs->z_teardown_inactive_lock);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1723
		rrw_exit(&zfsvfs->z_teardown_lock, FTAG);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1724
		return (EIO);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1725
	}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1726
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1727
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1728
	 * At this point there are no vops active, and any new vops will
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1729
	 * fail with EIO since we have z_teardown_lock for writer (only
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1730
	 * relavent for forced unmount).
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1731
	 *
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1732
	 * Release all holds on dbufs.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1733
	 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1734
	mutex_enter(&zfsvfs->z_znodes_lock);
5642
504c84876fda 6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents: 5498
diff changeset
  1735
	for (zp = list_head(&zfsvfs->z_all_znodes); zp != NULL;
504c84876fda 6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents: 5498
diff changeset
  1736
	    zp = list_next(&zfsvfs->z_all_znodes, zp))
5446
51fbc14b301d 6421210 zfs rollback without unmounting
ahrens
parents: 5429
diff changeset
  1737
		if (zp->z_dbuf) {
5642
504c84876fda 6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents: 5498
diff changeset
  1738
			ASSERT(ZTOV(zp)->v_count > 0);
504c84876fda 6513209 Destroying pools under stress caused a hang in arc_flush
maybee
parents: 5498
diff changeset
  1739
			zfs_znode_dmu_fini(zp);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1740
		}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1741
	mutex_exit(&zfsvfs->z_znodes_lock);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1742
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1743
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1744
	 * If we are unmounting, set the unmounted flag and let new vops
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1745
	 * unblock.  zfs_inactive will have the unmounted behavior, and all
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1746
	 * other vops will fail with EIO.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1747
	 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1748
	if (unmounting) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1749
		zfsvfs->z_unmounted = B_TRUE;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1750
		rrw_exit(&zfsvfs->z_teardown_lock, FTAG);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1751
		rw_exit(&zfsvfs->z_teardown_inactive_lock);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1752
	}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1753
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1754
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1755
	 * z_os will be NULL if there was an error in attempting to reopen
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1756
	 * zfsvfs, so just return as the properties had already been
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1757
	 * unregistered and cached data had been evicted before.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1758
	 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1759
	if (zfsvfs->z_os == NULL)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1760
		return (0);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1761
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1762
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1763
	 * Unregister properties.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1764
	 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1765
	zfs_unregister_callbacks(zfsvfs);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1766
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1767
	/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1768
	 * Evict cached data
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1769
	 */
6083
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1770
	if (dmu_objset_evict_dbufs(zfsvfs->z_os)) {
5429
f0cb3b884d95 6597432 cannot rename filesystem and return busy at the first time
maybee
parents: 5331
diff changeset
  1771
		txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
6083
23e77aa611b1 6655963 Panic: 0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj, name, sizeof (uint64_t), 1, &ddobj, tx)
ek110237
parents: 5648
diff changeset
  1772
		(void) dmu_objset_evict_dbufs(zfsvfs->z_os);
5429
f0cb3b884d95 6597432 cannot rename filesystem and return busy at the first time
maybee
parents: 5331
diff changeset
  1773
	}
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1774
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1775
	return (0);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1776
}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1777
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1778
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1779
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1780
zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1781
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1782
	zfsvfs_t *zfsvfs = vfsp->vfs_data;
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1783
	objset_t *os;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1784
	int ret;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1785
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1786
	ret = secpolicy_fs_unmount(cr, vfsp);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1787
	if (ret) {
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1788
		ret = dsl_deleg_access((char *)refstr_value(vfsp->vfs_resource),
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1789
		    ZFS_DELEG_PERM_MOUNT, cr);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1790
		if (ret)
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1791
			return (ret);
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1792
	}
1484
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
  1793
4736
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4614
diff changeset
  1794
	/*
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4614
diff changeset
  1795
	 * We purge the parent filesystem's vfsp as the parent filesystem
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4614
diff changeset
  1796
	 * and all of its snapshots have their vnode's v_vfsp set to the
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4614
diff changeset
  1797
	 * parent's filesystem's vfsp.  Note, 'z_parent' is self
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4614
diff changeset
  1798
	 * referential for non-snapshots.
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4614
diff changeset
  1799
	 */
f8714efb3e12 6509628 unmount of a snapshot (from 'zfs destroy') is slow
ek110237
parents: 4614
diff changeset
  1800
	(void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
1484
d330e98f8ed7 6350001 ZFS lookup performance still much slower than UFS : help tar : help spec SFS
ek110237
parents: 1298
diff changeset
  1801
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1802
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1803
	 * Unmount any snapshots mounted under .zfs before unmounting the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1804
	 * dataset itself.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1805
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1806
	if (zfsvfs->z_ctldir != NULL &&
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1807
	    (ret = zfsctl_umount_snapshots(vfsp, fflag, cr)) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1808
		return (ret);
4543
12bb2876a62e PSARC/2006/465 ZFS Delegated Administration
marks
parents: 4480
diff changeset
  1809
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1810
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1811
	if (!(fflag & MS_FORCE)) {
4480
0976678e58c5 6544140 assertion failed: err == 0 (0x11 == 0x0), file: ../../common/fs/zfs/zfs_znode.c, line: 555
gw25295
parents: 3912
diff changeset
  1812
		/*
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1813
		 * Check the number of active vnodes in the file system.
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1814
		 * Our count is maintained in the vfs structure, but the
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1815
		 * number is off by 1 to indicate a hold on the vfs
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1816
		 * structure itself.
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1817
		 *
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1818
		 * The '.zfs' directory maintains a reference of its
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1819
		 * own, and any active references underneath are
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1820
		 * reflected in the vnode count.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1821
		 */
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1822
		if (zfsvfs->z_ctldir == NULL) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1823
			if (vfsp->vfs_count > 1)
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1824
				return (EBUSY);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1825
		} else {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1826
			if (vfsp->vfs_count > 2 ||
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1827
			    zfsvfs->z_ctldir->v_count > 1)
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1828
				return (EBUSY);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1829
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1830
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1831
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1832
	vfsp->vfs_flag |= VFS_UNMOUNTED;
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1833
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1834
	VERIFY(zfsvfs_teardown(zfsvfs, B_TRUE) == 0);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1835
	os = zfsvfs->z_os;
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1836
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1837
	/*
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1838
	 * z_os will be NULL if there was an error in
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1839
	 * attempting to reopen zfsvfs.
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1840
	 */
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1841
	if (os != NULL) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1842
		/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1843
		 * Unset the objset user_ptr.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1844
		 */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1845
		mutex_enter(&os->os_user_ptr_lock);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1846
		dmu_objset_set_user(os, NULL);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1847
		mutex_exit(&os->os_user_ptr_lock);
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1848
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1849
		/*
6689
47572a2f5e73 6610506 Eliminate or improve retry logic from callers of dmu_objset_open()
maybee
parents: 6570
diff changeset
  1850
		 * Finally release the objset
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1851
		 */
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1852
		dmu_objset_disown(os, zfsvfs);
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1853
	}
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1854
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1855
	/*
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1856
	 * We can now safely destroy the '.zfs' directory node.
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1857
	 */
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1858
	if (zfsvfs->z_ctldir != NULL)
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4736
diff changeset
  1859
		zfsctl_destroy(zfsvfs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1860
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1861
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1862
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1863
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1864
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1865
zfs_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1866
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1867
	zfsvfs_t	*zfsvfs = vfsp->vfs_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1868
	znode_t		*zp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1869
	uint64_t	object = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1870
	uint64_t	fid_gen = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1871
	uint64_t	gen_mask;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1872
	uint64_t	zp_gen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1873
	int 		i, err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1874
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1875
	*vpp = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1876
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1877
	ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1878
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1879
	if (fidp->fid_len == LONG_FID_LEN) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1880
		zfid_long_t	*zlfid = (zfid_long_t *)fidp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1881
		uint64_t	objsetid = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1882
		uint64_t	setgen = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1883
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1884
		for (i = 0; i < sizeof (zlfid->zf_setid); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1885
			objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1886
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1887
		for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1888
			setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1889
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1890
		ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1891
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1892
		err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1893
		if (err)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1894
			return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1895
		ZFS_ENTER(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1896
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1897
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1898
	if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1899
		zfid_short_t	*zfid = (zfid_short_t *)fidp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1900
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1901
		for (i = 0; i < sizeof (zfid->zf_object); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1902
			object |= ((uint64_t)zfid->zf_object[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1903
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1904
		for (i = 0; i < sizeof (zfid->zf_gen); i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1905
			fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1906
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1907
		ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1908
		return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1909
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1910
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1911
	/* A zero fid_gen means we are in the .zfs control directories */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1912
	if (fid_gen == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1913
	    (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1914
		*vpp = zfsvfs->z_ctldir;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1915
		ASSERT(*vpp != NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1916
		if (object == ZFSCTL_INO_SNAPDIR) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1917
			VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  1918
			    0, NULL, NULL, NULL, NULL, NULL) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1919
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1920
			VN_HOLD(*vpp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1921
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1922
		ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1923
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1924
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1925
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1926
	gen_mask = -1ULL >> (64 - 8 * i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1927
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1928
	dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1929
	if (err = zfs_zget(zfsvfs, object, &zp)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1930
		ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1931
		return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1932
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1933
	zp_gen = zp->z_phys->zp_gen & gen_mask;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1934
	if (zp_gen == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1935
		zp_gen = 1;
3461
c19b22f347d6 6514331 in-memory delete queue is not needed
ahrens
parents: 3265
diff changeset
  1936
	if (zp->z_unlinked || zp_gen != fid_gen) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1937
		dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1938
		VN_RELE(ZTOV(zp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1939
		ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1940
		return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1941
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1942
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1943
	*vpp = ZTOV(zp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1944
	ZFS_EXIT(zfsvfs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1945
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1946
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1947
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1948
/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1949
 * Block out VOPs and close zfsvfs_t::z_os
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1950
 *
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1951
 * Note, if successful, then we return with the 'z_teardown_lock' and
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1952
 * 'z_teardown_inactive_lock' write held.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1953
 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1954
int
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1955
zfs_suspend_fs(zfsvfs_t *zfsvfs)
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1956
{
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1957
	int error;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1958
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1959
	if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1960
		return (error);
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1961
	dmu_objset_disown(zfsvfs->z_os, zfsvfs);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1962
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1963
	return (0);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1964
}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1965
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1966
/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1967
 * Reopen zfsvfs_t::z_os and release VOPs.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1968
 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1969
int
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1970
zfs_resume_fs(zfsvfs_t *zfsvfs, const char *osname)
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1971
{
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1972
	int err;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1973
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1974
	ASSERT(RRW_WRITE_HELD(&zfsvfs->z_teardown_lock));
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1975
	ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock));
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1976
10298
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1977
	err = dmu_objset_own(osname, DMU_OST_ZFS, B_FALSE, zfsvfs,
a0d52501437c 6860996 %temporary clones are not automatically destroyed on error
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 10204
diff changeset
  1978
	    &zfsvfs->z_os);
5326
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1979
	if (err) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1980
		zfsvfs->z_os = NULL;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1981
	} else {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1982
		znode_t *zp;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1983
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1984
		VERIFY(zfsvfs_setup(zfsvfs, B_FALSE) == 0);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1985
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1986
		/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1987
		 * Attempt to re-establish all the active znodes with
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1988
		 * their dbufs.  If a zfs_rezget() fails, then we'll let
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1989
		 * any potential callers discover that via ZFS_ENTER_VERIFY_VP
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1990
		 * when they try to use their znode.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1991
		 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1992
		mutex_enter(&zfsvfs->z_znodes_lock);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1993
		for (zp = list_head(&zfsvfs->z_all_znodes); zp;
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1994
		    zp = list_next(&zfsvfs->z_all_znodes, zp)) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1995
			(void) zfs_rezget(zp);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1996
		}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1997
		mutex_exit(&zfsvfs->z_znodes_lock);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1998
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  1999
	}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2000
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2001
	/* release the VOPs */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2002
	rw_exit(&zfsvfs->z_teardown_inactive_lock);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2003
	rrw_exit(&zfsvfs->z_teardown_lock, FTAG);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2004
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2005
	if (err) {
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2006
		/*
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2007
		 * Since we couldn't reopen zfsvfs::z_os, force
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2008
		 * unmount this file system.
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2009
		 */
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2010
		if (vn_vfswlock(zfsvfs->z_vfs->vfs_vnodecovered) == 0)
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2011
			(void) dounmount(zfsvfs->z_vfs, MS_FORCE, CRED());
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2012
	}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2013
	return (err);
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2014
}
6752aa2bd5bc 6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents: 5147
diff changeset
  2015
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2016
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2017
zfs_freevfs(vfs_t *vfsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2018
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2019
	zfsvfs_t *zfsvfs = vfsp->vfs_data;
9214
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2020
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2021
	/*
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2022
	 * If this is a snapshot, we have an extra VFS_HOLD on our parent
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2023
	 * from zfs_mount().  Release it here.
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2024
	 */
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2025
	if (zfsvfs->z_issnap)
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2026
		VFS_RELE(zfsvfs->z_parent->z_vfs);
8d350e5d04aa 6604992 forced unmount + being in .zfs/snapshot/<snap1> = not happy
Chris Kirby <chris.kirby@sun.com>
parents: 9179
diff changeset
  2027
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2028
	zfsvfs_free(zfsvfs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2029
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2030
	atomic_add_32(&zfs_active_fs_count, -1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2031
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2032
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2033
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2034
 * VFS_INIT() initialization.  Note that there is no VFS_FINI(),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2035
 * so we can't safely do any non-idempotent initialization here.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2036
 * Leave that to zfs_init() and zfs_fini(), which are called
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2037
 * from the module's _init() and _fini() entry points.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2038
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2039
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2040
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2041
zfs_vfsinit(int fstype, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2042
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2043
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2044
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2045
	zfsfstype = fstype;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2046
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2047
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2048
	 * Setup vfsops and vnodeops tables.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2049
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2050
	error = vfs_setfsops(fstype, zfs_vfsops_template, &zfs_vfsops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2051
	if (error != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2052
		cmn_err(CE_WARN, "zfs: bad vfs ops template");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2053
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2054
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2055
	error = zfs_create_op_tables();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2056
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2057
		zfs_remove_op_tables();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2058
		cmn_err(CE_WARN, "zfs: bad vnode ops template");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2059
		(void) vfs_freevfsops_by_type(zfsfstype);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2060
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2061
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2062
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2063
	mutex_init(&zfs_dev_mtx, NULL, MUTEX_DEFAULT, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2064
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2065
	/*
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
  2066
	 * Unique major number for all zfs mounts.
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
  2067
	 * If we run out of 32-bit minors, we'll getudev() another major.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2068
	 */
849
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
  2069
	zfs_major = ddi_name_to_major(ZFS_DRIVER);
8d799fd81a9b 6345023 /dev/zfs fails to open once ZFS module is unloaded
bonwick
parents: 789
diff changeset
  2070
	zfs_minor = ZFS_MIN_MINOR;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2071
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2072
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2073
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2074
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2075
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2076
zfs_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2077
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2078
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2079
	 * Initialize .zfs directory structures
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2080
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2081
	zfsctl_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2082
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2083
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2084
	 * Initialize znode cache, vnode ops, etc...
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2085
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2086
	zfs_znode_init();
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2087
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2088
	dmu_objset_register_type(DMU_OST_ZFS, zfs_space_delta_cb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2089
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2090
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2091
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2092
zfs_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2093
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2094
	zfsctl_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2095
	zfs_znode_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2096
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2097
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2098
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2099
zfs_busy(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2100
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2101
	return (zfs_active_fs_count != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2102
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2103
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2104
int
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2105
zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers)
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2106
{
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2107
	int error;
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2108
	objset_t *os = zfsvfs->z_os;
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2109
	dmu_tx_t *tx;
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2110
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2111
	if (newvers < ZPL_VERSION_INITIAL || newvers > ZPL_VERSION)
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2112
		return (EINVAL);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2113
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2114
	if (newvers < zfsvfs->z_version)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2115
		return (EINVAL);
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2116
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2117
	tx = dmu_tx_create(os);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2118
	dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, B_FALSE, ZPL_VERSION_STR);
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2119
	error = dmu_tx_assign(tx, TXG_WAIT);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2120
	if (error) {
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2121
		dmu_tx_abort(tx);
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2122
		return (error);
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2123
	}
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2124
	error = zap_update(os, MASTER_NODE_OBJ, ZPL_VERSION_STR,
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2125
	    8, 1, &newvers, tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2126
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2127
	if (error) {
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2128
		dmu_tx_commit(tx);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2129
		return (error);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2130
	}
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2131
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2132
	spa_history_internal_log(LOG_DS_UPGRADE,
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2133
	    dmu_objset_spa(os), tx, CRED(),
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2134
	    "oldver=%llu newver=%llu dataset = %llu",
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2135
	    zfsvfs->z_version, newvers, dmu_objset_id(os));
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2136
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2137
	dmu_tx_commit(tx);
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2138
9396
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2139
	zfsvfs->z_version = newvers;
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2140
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2141
	if (zfsvfs->z_version >= ZPL_VERSION_FUID)
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2142
		zfs_set_fuid_feature(zfsvfs);
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2143
f41cf682d0d3 PSARC/2009/204 ZFS user/group quotas & space accounting
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 9292
diff changeset
  2144
	return (0);
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2145
}
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2146
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2147
/*
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2148
 * Read a property stored within the master node.
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2149
 */
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2150
int
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2151
zfs_get_zplprop(objset_t *os, zfs_prop_t prop, uint64_t *value)
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2152
{
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2153
	const char *pname;
7184
9508660f9c27 PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents: 7147
diff changeset
  2154
	int error = ENOENT;
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2155
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2156
	/*
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2157
	 * Look up the file system's value for the property.  For the
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2158
	 * version property, we look up a slightly different string.
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2159
	 */
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2160
	if (prop == ZFS_PROP_VERSION)
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2161
		pname = ZPL_VERSION_STR;
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2162
	else
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2163
		pname = zfs_prop_to_name(prop);
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2164
7184
9508660f9c27 PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents: 7147
diff changeset
  2165
	if (os != NULL)
9508660f9c27 PSARC 2008/223 Pool root file system properties via zpool(1M)
timh
parents: 7147
diff changeset
  2166
		error = zap_lookup(os, MASTER_NODE_OBJ, pname, 8, 1, value);
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2167
6404
6377536e1718 6668659 zfs send/recv loses properties
maybee
parents: 6083
diff changeset
  2168
	if (error == ENOENT) {
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2169
		/* No value set, use the default value */
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2170
		switch (prop) {
6404
6377536e1718 6668659 zfs send/recv loses properties
maybee
parents: 6083
diff changeset
  2171
		case ZFS_PROP_VERSION:
6377536e1718 6668659 zfs send/recv loses properties
maybee
parents: 6083
diff changeset
  2172
			*value = ZPL_VERSION;
6377536e1718 6668659 zfs send/recv loses properties
maybee
parents: 6083
diff changeset
  2173
			break;
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2174
		case ZFS_PROP_NORMALIZE:
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2175
		case ZFS_PROP_UTF8ONLY:
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2176
			*value = 0;
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2177
			break;
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2178
		case ZFS_PROP_CASE:
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2179
			*value = ZFS_CASE_SENSITIVE;
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2180
			break;
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2181
		default:
6404
6377536e1718 6668659 zfs send/recv loses properties
maybee
parents: 6083
diff changeset
  2182
			return (error);
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2183
		}
6404
6377536e1718 6668659 zfs send/recv loses properties
maybee
parents: 6083
diff changeset
  2184
		error = 0;
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2185
	}
6404
6377536e1718 6668659 zfs send/recv loses properties
maybee
parents: 6083
diff changeset
  2186
	return (error);
5498
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2187
}
334b476844ca 6622831 normalization properties are not preserved by "zfs send"
timh
parents: 5489
diff changeset
  2188
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2189
static vfsdef_t vfw = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2190
	VFSDEF_VERSION,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2191
	MNTTYPE_ZFS,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2192
	zfs_vfsinit,
5331
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  2193
	VSW_HASPROTO|VSW_CANRWRO|VSW_CANREMOUNT|VSW_VOLATILEDEV|VSW_STATS|
3047ad28a67b PSARC/2007/218 caller_context_t in all VOPs
amw
parents: 5326
diff changeset
  2194
	    VSW_XID,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2195
	&zfs_mntopts
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2196
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2197
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2198
struct modlfs zfs_modlfs = {
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4543
diff changeset
  2199
	&mod_fsops, "ZFS filesystem version " SPA_VERSION_STRING, &vfw
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2200
};