usr/src/uts/common/fs/sharefs/sharefs_vfsops.c
author th199096
Mon, 02 Apr 2007 21:38:04 -0700
changeset 3957 86c9dda5df37
child 4995 3e3d6de427e8
permissions -rw-r--r--
PSARC/2007/052 In-kernel Sharetab 6371468 /etc/dfs/sharetab should be a mntfs style file
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3957
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     1
/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     2
 * CDDL HEADER START
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     3
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     7
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    11
 * and limitations under the License.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    12
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    18
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    19
 * CDDL HEADER END
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    20
 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    21
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    22
/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    23
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    24
 * Use is subject to license terms.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    25
 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    26
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    28
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    29
#include <sys/atomic.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    30
#include <sys/cmn_err.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    31
#include <sys/errno.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    32
#include <sys/mount.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    33
#include <sharefs/sharefs.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    34
#include <sys/vfs_opreg.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    35
#include <sys/policy.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    36
#include <sys/sunddi.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    37
#include <sys/sysmacros.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    38
#include <sys/systm.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    39
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    40
#include <sys/mntent.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    41
#include <sys/vfs.h>
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    42
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    43
/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    44
 * Kernel sharetab filesystem.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    45
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    46
 * This is a pseudo filesystem which exports information about shares currently
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    47
 * in kernel memory. The only element of the pseudo filesystem is a file.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    48
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    49
 * This file contains functions that interact with the VFS layer.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    50
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    51
 *	sharetab	sharefs_datanode_t	sharefs.c
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    52
 *
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    53
 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    54
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    55
vnodeops_t			*sharefs_ops_data;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    56
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    57
static const fs_operation_def_t	sharefs_vfstops[];
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    58
static gfs_opsvec_t		 sharefs_opsvec[];
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    59
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    60
static int sharefs_init(int, char *);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    61
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    62
/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    63
 * The sharefs system call.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    64
 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    65
static struct sysent sharefs_sysent = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    66
	3,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    67
	SE_32RVAL1 | SE_ARGC | SE_NOUNLOAD,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    68
	sharefs
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    69
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    70
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    71
static struct modlsys modlsys = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    72
	&mod_syscallops,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    73
	"sharefs syscall",
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    74
	&sharefs_sysent
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    75
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    76
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    77
#ifdef	_SYSCALL32_IMPL
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    78
static struct modlsys modlsys32 = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    79
	&mod_syscallops32,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    80
	"sharefs syscall (32-bit)",
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    81
	&sharefs_sysent
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    82
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    83
#endif /* _SYSCALL32_IMPL */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    84
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    85
/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    86
 * Module linkage
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    87
 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    88
static mntopts_t sharefs_mntopts = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    89
	0,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    90
	NULL
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    91
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    92
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    93
static vfsdef_t vfw = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    94
	VFSDEF_VERSION,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    95
	"sharefs",
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    96
	sharefs_init,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    97
	VSW_HASPROTO,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    98
	&sharefs_mntopts,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
    99
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   100
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   101
extern struct mod_ops	mod_fsops;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   102
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   103
static struct modlfs modlfs = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   104
	&mod_fsops,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   105
	"sharetab filesystem",
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   106
	&vfw
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   107
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   108
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   109
static struct modlinkage modlinkage = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   110
	MODREV_1,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   111
	&modlfs,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   112
	&modlsys,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   113
#ifdef	_SYSCALL32_IMPL
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   114
	&modlsys32,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   115
#endif
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   116
	NULL
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   117
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   118
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   119
int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   120
_init(void)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   121
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   122
	return (mod_install(&modlinkage));
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   123
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   124
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   125
int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   126
_info(struct modinfo *modinfop)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   127
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   128
	return (mod_info(&modlinkage, modinfop));
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   129
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   130
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   131
int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   132
_fini(void)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   133
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   134
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   135
	 * The sharetab filesystem cannot be unloaded.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   136
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   137
	return (EBUSY);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   138
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   139
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   140
/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   141
 * Filesystem initialization.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   142
 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   143
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   144
static int sharefs_fstype;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   145
static major_t sharefs_major;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   146
static minor_t sharefs_minor;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   147
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   148
static gfs_opsvec_t sharefs_opsvec[] = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   149
	{ "sharefs sharetab file", sharefs_tops_data, &sharefs_ops_data },
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   150
	{ NULL }
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   151
};
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   152
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   153
/* ARGSUSED */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   154
static int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   155
sharefs_init(int fstype, char *name)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   156
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   157
	vfsops_t	*vfsops;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   158
	int		error;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   159
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   160
	sharefs_fstype = fstype;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   161
	if (error = vfs_setfsops(fstype, sharefs_vfstops, &vfsops)) {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   162
		cmn_err(CE_WARN, "sharefs_init: bad vfs ops template");
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   163
		return (error);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   164
	}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   165
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   166
	if (error = gfs_make_opsvec(sharefs_opsvec)) {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   167
		(void) vfs_freevfsops(vfsops);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   168
		return (error);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   169
	}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   170
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   171
	if ((sharefs_major = getudev()) == (major_t)-1) {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   172
		cmn_err(CE_WARN,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   173
			"sharefs_init: can't get unique device number");
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   174
		sharefs_major = 0;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   175
	}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   176
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   177
	sharefs_sharetab_init();
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   178
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   179
	return (0);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   180
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   181
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   182
/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   183
 * VFS entry points
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   184
 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   185
static int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   186
sharefs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   187
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   188
	sharefs_vfs_t	*data;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   189
	dev_t		dev;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   190
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   191
	if (secpolicy_fs_mount(cr, mvp, vfsp) != 0)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   192
		return (EPERM);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   193
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   194
	if ((uap->flags & MS_OVERLAY) == 0 &&
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   195
	    (mvp->v_count > 1 || (mvp->v_flag & VROOT)))
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   196
		return (EBUSY);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   197
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   198
	data = kmem_alloc(sizeof (sharefs_vfs_t), KM_SLEEP);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   199
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   200
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   201
	 * Initialize vfs fields
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   202
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   203
	vfsp->vfs_bsize = DEV_BSIZE;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   204
	vfsp->vfs_fstype = sharefs_fstype;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   205
	do {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   206
		dev = makedevice(sharefs_major,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   207
		    atomic_add_32_nv(&sharefs_minor, 1) & L_MAXMIN32);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   208
	} while (vfs_devismounted(dev));
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   209
	vfs_make_fsid(&vfsp->vfs_fsid, dev, sharefs_fstype);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   210
	vfsp->vfs_data = data;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   211
	vfsp->vfs_dev = dev;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   212
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   213
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   214
	 * Create root
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   215
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   216
	data->sharefs_vfs_root = sharefs_create_root_file(vfsp);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   217
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   218
	return (0);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   219
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   220
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   221
static int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   222
sharefs_unmount(vfs_t *vfsp, int flag, struct cred *cr)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   223
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   224
	sharefs_vfs_t	*data;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   225
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   226
	if (secpolicy_fs_unmount(cr, vfsp) != 0)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   227
		return (EPERM);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   228
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   229
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   230
	 * We do not currently support forced unmounts
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   231
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   232
	if (flag & MS_FORCE)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   233
		return (ENOTSUP);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   234
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   235
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   236
	 * We should never have a reference count of less than 2: one for the
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   237
	 * caller, one for the root vnode.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   238
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   239
	ASSERT(vfsp->vfs_count >= 2);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   240
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   241
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   242
	 * Any active vnodes will result in a hold on the root vnode
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   243
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   244
	data = vfsp->vfs_data;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   245
	if (data->sharefs_vfs_root->v_count > 1)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   246
		return (EBUSY);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   247
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   248
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   249
	 * Only allow an unmount iff there are no entries in memory.
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   250
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   251
	rw_enter(&sharetab_lock, RW_READER);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   252
	if (sharetab_size != 0) {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   253
		rw_exit(&sharetab_lock);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   254
		return (EBUSY);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   255
	}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   256
	rw_exit(&sharetab_lock);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   257
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   258
	/*
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   259
	 * Release the last hold on the root vnode
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   260
	 */
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   261
	VN_RELE(data->sharefs_vfs_root);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   262
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   263
	kmem_free(data, sizeof (sharefs_vfs_t));
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   264
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   265
	return (0);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   266
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   267
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   268
static int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   269
sharefs_root(vfs_t *vfsp, vnode_t **vpp)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   270
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   271
	sharefs_vfs_t	*data = vfsp->vfs_data;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   272
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   273
	*vpp = data->sharefs_vfs_root;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   274
	VN_HOLD(*vpp);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   275
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   276
	return (0);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   277
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   278
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   279
static int
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   280
sharefs_statvfs(vfs_t *vfsp, statvfs64_t *sp)
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   281
{
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   282
	dev32_t	d32;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   283
	int	total = 1;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   284
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   285
	bzero(sp, sizeof (*sp));
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   286
	sp->f_bsize = DEV_BSIZE;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   287
	sp->f_frsize = DEV_BSIZE;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   288
	sp->f_files = total;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   289
	sp->f_ffree = sp->f_favail = INT_MAX - total;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   290
	(void) cmpldev(&d32, vfsp->vfs_dev);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   291
	sp->f_fsid = d32;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   292
	(void) strlcpy(sp->f_basetype, vfssw[vfsp->vfs_fstype].vsw_name,
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   293
	    sizeof (sp->f_basetype));
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   294
	sp->f_flag = vf_to_stf(vfsp->vfs_flag);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   295
	sp->f_namemax = SHAREFS_NAME_MAX;
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   296
	(void) strlcpy(sp->f_fstr, "sharefs", sizeof (sp->f_fstr));
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   297
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   298
	return (0);
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   299
}
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   300
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   301
static const fs_operation_def_t sharefs_vfstops[] = {
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   302
	{ VFSNAME_MOUNT,	{ .vfs_mount = sharefs_mount } },
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   303
	{ VFSNAME_UNMOUNT,	{ .vfs_unmount = sharefs_unmount } },
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   304
	{ VFSNAME_ROOT,		{ .vfs_root = sharefs_root } },
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   305
	{ VFSNAME_STATVFS,	{ .vfs_statvfs = sharefs_statvfs } },
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   306
	{ NULL }
86c9dda5df37 PSARC/2007/052 In-kernel Sharetab
th199096
parents:
diff changeset
   307
};