usr/src/uts/common/fs/namefs/namevfs.c
author rsb
Mon, 26 Mar 2007 17:41:06 -0700
changeset 3898 c788126f2a20
parent 2678 57f378fe1506
child 5331 3047ad28a67b
permissions -rw-r--r--
PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism 6505923 Need better type checking for vnodeops 6531594 lxpr_readlink() is missing the "cred_t *cr" arg 6532559 vfs_strayops does not use the vnode/vfs operation registration mechanism
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
     5
 * Common Development and Distribution License (the "License").
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
    22
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#pragma ident	"%Z%%M%	%I%	%E% SMI" /* from S5R4 1.28 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * This file supports the vfs operations for the NAMEFS file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/inline.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/proc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/statvfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/mount.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <sys/var.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <sys/vfs.h>
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
    51
#include <sys/vfs_opreg.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/vnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <sys/mode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/pcb.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <sys/signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <sys/user.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <sys/uio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <sys/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <sys/fs/namenode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <sys/stream.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <sys/strsubr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <sys/modctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <fs/fs_subr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#include <sys/policy.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#include <sys/vmem.h>
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
    67
#include <sys/fs/sdev_impl.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#define	NM_INOQUANT		(64 * 1024)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 * Define global data structures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
dev_t	namedev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
int	namefstype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
struct	namenode *nm_filevp_hash[NM_FILEVP_HASH_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
struct	vfs namevfs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
kmutex_t ntable_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
static vmem_t	*nm_inoarena;	/* vmem arena to allocate inode no's from */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static kmutex_t	nm_inolock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 * Functions to allocate node id's starting from 1. Based on vmem routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 * The vmem arena is extended in NM_INOQUANT chunks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
uint64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
namenodeno_alloc(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	uint64_t nno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	mutex_enter(&nm_inolock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	nno = (uint64_t)(uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	    vmem_alloc(nm_inoarena, 1, VM_NOSLEEP + VM_FIRSTFIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	if (nno == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
		(void) vmem_add(nm_inoarena, (void *)(vmem_size(nm_inoarena,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
		    VMEM_ALLOC | VMEM_FREE) + 1), NM_INOQUANT, VM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		nno = (uint64_t)(uintptr_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		    vmem_alloc(nm_inoarena, 1, VM_SLEEP + VM_FIRSTFIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
		ASSERT(nno != 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	mutex_exit(&nm_inolock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	ASSERT32(nno <= ULONG_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	return (nno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
namenodeno_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	nm_inoarena = vmem_create("namefs_inodes", (void *)1, NM_INOQUANT, 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	    NULL, NULL, NULL, 1, VM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	mutex_init(&nm_inolock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
namenodeno_free(uint64_t nn)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	void *vaddr = (void *)(uintptr_t)nn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	ASSERT32((uint64_t)(uintptr_t)vaddr == nn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	mutex_enter(&nm_inolock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	vmem_free(nm_inoarena, vaddr, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	mutex_exit(&nm_inolock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 * Insert a namenode into the nm_filevp_hash table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 * Each link has a unique namenode with a unique nm_mountvp field.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
 * The nm_filevp field of the namenode need not be unique, since a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
 * file descriptor may be mounted to multiple nodes at the same time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
 * We hash on nm_filevp since that's what discriminates the searches
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
 * in namefind() and nm_unmountall().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
nameinsert(struct namenode *nodep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	struct namenode **bucket;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	ASSERT(MUTEX_HELD(&ntable_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	bucket = NM_FILEVP_HASH(nodep->nm_filevp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	nodep->nm_nextp = *bucket;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	*bucket = nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 * Remove a namenode from the hash table, if present.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
nameremove(struct namenode *nodep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	struct namenode *np, **npp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	ASSERT(MUTEX_HELD(&ntable_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	for (npp = NM_FILEVP_HASH(nodep->nm_filevp); (np = *npp) != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	    npp = &np->nm_nextp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		if (np == nodep) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
			*npp = np->nm_nextp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
 * Search for a namenode that has a nm_filevp == vp and nm_mountpt == mnt.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
 * If mnt is NULL, return the first link with nm_filevp of vp.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
 * Returns namenode pointer on success, NULL on failure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
struct namenode *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
namefind(vnode_t *vp, vnode_t *mnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	struct namenode *np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	ASSERT(MUTEX_HELD(&ntable_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	for (np = *NM_FILEVP_HASH(vp); np != NULL; np = np->nm_nextp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
		if (np->nm_filevp == vp &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		    (mnt == NULL || np->nm_mountpt == mnt))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	return (np);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
 * Force the unmouting of a file descriptor from ALL of the nodes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
 * that it was mounted to.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 * At the present time, the only usage for this routine is in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * event one end of a pipe was mounted. At the time the unmounted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 * end gets closed down, the mounted end is forced to be unmounted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
 * This routine searches the namenode hash list for all namenodes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
 * that have a nm_filevp field equal to vp. Each time one is found,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
 * the dounmount() routine is called. This causes the nm_unmount()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 * routine to be called and thus, the file descriptor is unmounted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
 * from the node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
 * At the start of this routine, the reference count for vp is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
 * incremented to protect the vnode from being released in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
 * event the mount was the only thing keeping the vnode active.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
 * If that is the case, the VOP_CLOSE operation is applied to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 * the vnode, prior to it being released.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
nm_umountall(vnode_t *vp, cred_t *crp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	vfs_t *vfsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	struct namenode *nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	int realerr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	 * For each namenode that is associated with the file:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	 * If the v_vfsp field is not namevfs, dounmount it.  Otherwise,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	 * it was created in nm_open() and will be released in time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	 * The following loop replicates some code from nm_find.  That
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	 * routine can't be used as is since the list isn't strictly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	 * consumed as it is traversed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	mutex_enter(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	nodep = *NM_FILEVP_HASH(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	while (nodep) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		if (nodep->nm_filevp == vp &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		    (vfsp = NMTOV(nodep)->v_vfsp) != NULL && vfsp != &namevfs) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
			/*
569
3b366c606430 PSARC 2005/287 obsolete and remove vn_vfslock interface
batschul
parents: 0
diff changeset
   227
			 * If the vn_vfswlock fails, skip the vfs since
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
			 * somebody else may be unmounting it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
			 */
569
3b366c606430 PSARC 2005/287 obsolete and remove vn_vfslock interface
batschul
parents: 0
diff changeset
   230
			if (vn_vfswlock(vfsp->vfs_vnodecovered)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
				realerr = EBUSY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
				nodep = nodep->nm_nextp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
			 * Can't hold ntable_lock across call to do_unmount
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
			 * because nm_unmount tries to acquire it.  This means
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			 * there is a window where another mount of vp can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
			 * happen so it is possible that after nm_unmountall
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			 * there are still some mounts.  This situation existed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
			 * without MT locking because dounmount can sleep
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
			 * so another mount could happen during that time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
			 * This situation is unlikely and doesn't really cause
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
			 * any problems.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
			mutex_exit(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
			if ((error = dounmount(vfsp, 0, crp)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
				realerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			mutex_enter(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
			 * Since we dropped the ntable_lock, we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
			 * have to start over from the beginning.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			 * If for some reasons dounmount() fails,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			 * start from beginning means that we will keep on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
			 * trying unless another thread unmounts it for us.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
			nodep = *NM_FILEVP_HASH(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
			nodep = nodep->nm_nextp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	mutex_exit(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	return (realerr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
 * Force the unmouting of a file descriptor from ALL of the nodes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
 * that it was mounted to.  XXX: fifo_close() calls this routine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
 * nm_umountall() may return EBUSY.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
 * nm_unmountall() will keep on trying until it succeeds.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
nm_unmountall(vnode_t *vp, cred_t *crp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	 * Nm_umuontall() returns only if it succeeds or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	 * return with error EBUSY.  If EBUSY, that means
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	 * it cannot acquire the lock on the covered vnode,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	 * and we will keep on trying.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		error = nm_umountall(vp, crp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		if (error != EBUSY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		delay(1);	/* yield cpu briefly, then try again */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
 * Mount a file descriptor onto the node in the file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
 * Create a new vnode, update the attributes with info from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
 * file descriptor and the mount point.  The mask, mode, uid, gid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
 * atime, mtime and ctime are taken from the mountpt.  Link count is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
 * set to one, the file system id is namedev and nodeid is unique
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
 * for each mounted object.  Other attributes are taken from mount point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
 * Make sure user is owner (or root) with write permissions on mount point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
 * Hash the new vnode and return 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
 * Upon entry to this routine, the file descriptor is in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
 * fd field of a struct namefd.  Copy that structure from user
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
 * space and retrieve the file descriptor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
nm_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *crp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	struct namefd namefdp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	struct vnode *filevp;		/* file descriptor vnode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	struct file *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	struct vnode *newvp;		/* vnode representing this mount */
2678
57f378fe1506 6467069 devfs doesn't clean up pts (and possible other devices)
vikram
parents: 2621
diff changeset
   313
	struct vnode *rvp;		/* realvp (if any) for the mountpt */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	struct namenode *nodep;		/* namenode for this mount */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	struct vattr filevattr;		/* attributes of file dec.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	struct vattr *vattrp;		/* attributes of this mount */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	char *resource_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	char *resource_nodetype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	statvfs64_t *svfsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	 * Get the file descriptor from user space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	 * Make sure the file descriptor is valid and has an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	 * associated file pointer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	 * If so, extract the vnode from the file pointer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	if (uap->datalen != sizeof (struct namefd))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	if (copyin(uap->dataptr, &namefdp, uap->datalen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		return (EFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	if ((fp = getf(namefdp.fd)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		return (EBADF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	 * If the mount point already has something mounted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	 * on it, disallow this mount.  (This restriction may
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	 * be removed in a later release).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	 * Or unmount has completed but the namefs ROOT vnode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	 * count has not decremented to zero, disallow this mount.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	mutex_enter(&mvp->v_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	if ((mvp->v_flag & VROOT) || (mvp->v_vfsp == &namevfs)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		mutex_exit(&mvp->v_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
		releasef(namefdp.fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
		return (EBUSY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	mutex_exit(&mvp->v_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   352
	/*
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   353
	 * Cannot allow users to fattach() in /dev/pts.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   354
	 * First, there is no need for doing so and secondly
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   355
	 * we cannot allow arbitrary users to park on a
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   356
	 * /dev/pts node.
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   357
	 */
2678
57f378fe1506 6467069 devfs doesn't clean up pts (and possible other devices)
vikram
parents: 2621
diff changeset
   358
	rvp = NULLVP;
57f378fe1506 6467069 devfs doesn't clean up pts (and possible other devices)
vikram
parents: 2621
diff changeset
   359
	if (vn_matchops(mvp, spec_getvnodeops()) &&
57f378fe1506 6467069 devfs doesn't clean up pts (and possible other devices)
vikram
parents: 2621
diff changeset
   360
	    VOP_REALVP(mvp, &rvp) == 0 && rvp &&
57f378fe1506 6467069 devfs doesn't clean up pts (and possible other devices)
vikram
parents: 2621
diff changeset
   361
	    vn_matchops(rvp, devpts_getvnodeops())) {
2621
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   362
		releasef(namefdp.fd);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   363
		return (ENOTSUP);
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   364
	}
4ea88858d952 PSARC/2003/246 Filesystem Driven Device Naming
llai1
parents: 569
diff changeset
   365
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	filevp = fp->f_vnode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	if (filevp->v_type == VDIR || filevp->v_type == VPORT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		releasef(namefdp.fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	 * If the fd being mounted refers to neither a door nor a stream,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	 * make sure the caller is privileged.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	if (filevp->v_type != VDOOR && filevp->v_stream == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		if (secpolicy_fs_mount(crp, filevp, vfsp) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
			/* fd is neither a stream nor a door */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
			releasef(namefdp.fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
			return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	 * Make sure the file descriptor is not the root of some
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	 * file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	 * If it's not, create a reference and allocate a namenode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	 * to represent this mount request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	if (filevp->v_flag & VROOT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		releasef(namefdp.fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		return (EBUSY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	nodep = kmem_zalloc(sizeof (struct namenode), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	mutex_init(&nodep->nm_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	vattrp = &nodep->nm_vattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	vattrp->va_mask = AT_ALL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	if (error = VOP_GETATTR(mvp, vattrp, 0, crp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	filevattr.va_mask = AT_ALL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	if (error = VOP_GETATTR(filevp, &filevattr, 0, crp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	 * Make sure the user is the owner of the mount point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	 * or has sufficient privileges.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	if (error = secpolicy_vnode_owner(crp, vattrp->va_uid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	 * Make sure the user has write permissions on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	 * mount point (or has sufficient privileges).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	if (!(vattrp->va_mode & VWRITE) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	    secpolicy_vnode_access(crp, mvp, vattrp->va_uid, VWRITE) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	 * If the file descriptor has file/record locking, don't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	 * allow the mount to succeed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	if (vn_has_flocks(filevp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		error = EACCES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	 * Initialize the namenode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	if (filevp->v_stream) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		struct stdata *stp = filevp->v_stream;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		mutex_enter(&stp->sd_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		stp->sd_flag |= STRMOUNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		mutex_exit(&stp->sd_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	nodep->nm_filevp = filevp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	mutex_enter(&fp->f_tlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	fp->f_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	mutex_exit(&fp->f_tlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	releasef(namefdp.fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	nodep->nm_filep = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	nodep->nm_mountpt = mvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	 * The attributes for the mounted file descriptor were initialized
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	 * above by applying VOP_GETATTR to the mount point.  Some of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	 * the fields of the attributes structure will be overwritten
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	 * by the attributes from the file descriptor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	vattrp->va_type    = filevattr.va_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	vattrp->va_fsid    = namedev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	vattrp->va_nodeid  = namenodeno_alloc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	vattrp->va_nlink   = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	vattrp->va_size    = filevattr.va_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	vattrp->va_rdev    = filevattr.va_rdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	vattrp->va_blksize = filevattr.va_blksize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	vattrp->va_nblocks = filevattr.va_nblocks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	vattrp->va_seq	   = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	 * Initialize new vnode structure for the mounted file descriptor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	nodep->nm_vnode = vn_alloc(KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	newvp = NMTOV(nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	newvp->v_flag = filevp->v_flag | VROOT | VNOMAP | VNOSWAP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	vn_setops(newvp, nm_vnodeops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	newvp->v_vfsp = vfsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	newvp->v_stream = filevp->v_stream;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	newvp->v_type = filevp->v_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	newvp->v_rdev = filevp->v_rdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	newvp->v_data = (caddr_t)nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	vn_exists(newvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	 * Initialize the vfs structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	vfsp->vfs_vnodecovered = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	vfsp->vfs_flag |= VFS_UNLINKABLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	vfsp->vfs_bsize = 1024;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	vfsp->vfs_fstype = namefstype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	vfs_make_fsid(&vfsp->vfs_fsid, namedev, namefstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	vfsp->vfs_data = (caddr_t)nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	vfsp->vfs_dev = namedev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	vfsp->vfs_bcount = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	 * Set the name we mounted from.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	switch (filevp->v_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	case VPROC:	/* VOP_GETATTR() translates this to VREG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	case VREG:	resource_nodetype = "file"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	case VDIR:	resource_nodetype = "directory"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	case VBLK:	resource_nodetype = "device"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	case VCHR:	resource_nodetype = "device"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	case VLNK:	resource_nodetype = "link"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
	case VFIFO:	resource_nodetype = "fifo"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
	case VDOOR:	resource_nodetype = "door"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
	case VSOCK:	resource_nodetype = "socket"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	default:	resource_nodetype = "resource"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
#define	RESOURCE_NAME_SZ 128 /* Maximum length of the resource name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	resource_name = kmem_alloc(RESOURCE_NAME_SZ, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	svfsp = kmem_alloc(sizeof (statvfs64_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	error = VFS_STATVFS(filevp->v_vfsp, svfsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	if (error == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
		(void) snprintf(resource_name, RESOURCE_NAME_SZ,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
		    "unspecified_%s_%s", svfsp->f_basetype, resource_nodetype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
		(void) snprintf(resource_name, RESOURCE_NAME_SZ,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		    "unspecified_%s", resource_nodetype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	vfs_setresource(vfsp, resource_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	kmem_free(svfsp, sizeof (statvfs64_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	kmem_free(resource_name, RESOURCE_NAME_SZ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
#undef RESOURCE_NAME_SZ
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	 * Insert the namenode.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	mutex_enter(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	nameinsert(nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	mutex_exit(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	releasef(namefdp.fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	kmem_free(nodep, sizeof (struct namenode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
 * Unmount a file descriptor from a node in the file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
 * If the user is not the owner of the file and is not privileged,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
 * the request is denied.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
 * Otherwise, remove the namenode from the hash list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
 * If the mounted file descriptor was that of a stream and this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
 * was the last mount of the stream, turn off the STRMOUNT flag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
 * If the rootvp is referenced other than through the mount,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
 * nm_inactive will clean up.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
nm_unmount(vfs_t *vfsp, int flag, cred_t *crp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	struct namenode *nodep = (struct namenode *)vfsp->vfs_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	vnode_t *vp, *thisvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	struct file *fp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	ASSERT((nodep->nm_flag & NMNMNT) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	 * forced unmount is not supported by this file system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	 * and thus, ENOTSUP, is being returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	if (flag & MS_FORCE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	vp = nodep->nm_filevp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	mutex_enter(&nodep->nm_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	if (secpolicy_vnode_owner(crp, nodep->nm_vattr.va_uid) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		mutex_exit(&nodep->nm_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		return (EPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	mutex_exit(&nodep->nm_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	mutex_enter(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	nameremove(nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	thisvp = NMTOV(nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	mutex_enter(&thisvp->v_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	if (thisvp->v_count-- == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
		fp = nodep->nm_filep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
		mutex_exit(&thisvp->v_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
		vn_invalid(thisvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
		vn_free(thisvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		namenodeno_free(nodep->nm_vattr.va_nodeid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		kmem_free(nodep, sizeof (struct namenode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		thisvp->v_flag &= ~VROOT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		thisvp->v_vfsp = &namevfs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		mutex_exit(&thisvp->v_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	if (namefind(vp, NULLVP) == NULL && vp->v_stream) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		struct stdata *stp = vp->v_stream;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
		mutex_enter(&stp->sd_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		stp->sd_flag &= ~STRMOUNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
		mutex_exit(&stp->sd_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
	mutex_exit(&ntable_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	if (fp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		(void) closef(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
 * Create a reference to the root of a mounted file descriptor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
 * This routine is called from lookupname() in the event a path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
 * is being searched that has a mounted file descriptor in it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
nm_root(vfs_t *vfsp, vnode_t **vpp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	struct namenode *nodep = (struct namenode *)vfsp->vfs_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	struct vnode *vp = NMTOV(nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	VN_HOLD(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	*vpp = vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
 * Return in sp the status of this file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
nm_statvfs(vfs_t *vfsp, struct statvfs64 *sp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	dev32_t d32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	bzero(sp, sizeof (*sp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	sp->f_bsize	= 1024;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	sp->f_frsize	= 1024;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	(void) cmpldev(&d32, vfsp->vfs_dev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	sp->f_fsid = d32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	(void) strcpy(sp->f_basetype, vfssw[vfsp->vfs_fstype].vsw_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	sp->f_flag	= vf_to_stf(vfsp->vfs_flag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
 * Since this file system has no disk blocks of its own, apply
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
 * the VOP_FSYNC operation on the mounted file descriptor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
nm_sync(vfs_t *vfsp, short flag, cred_t *crp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	struct namenode *nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	if (vfsp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	nodep = (struct namenode *)vfsp->vfs_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	if (flag & SYNC_CLOSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
		return (nm_umountall(nodep->nm_filevp, crp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	return (VOP_FSYNC(nodep->nm_filevp, FSYNC, crp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
 * File system initialization routine. Save the file system type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
 * establish a file system device number and initialize nm_filevp_hash[].
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
nameinit(int fstype, char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	static const fs_operation_def_t nm_vfsops_template[] = {
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   666
		VFSNAME_MOUNT,		{ .vfs_mount = nm_mount },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   667
		VFSNAME_UNMOUNT,	{ .vfs_unmount = nm_unmount },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   668
		VFSNAME_ROOT,		{ .vfs_root = nm_root },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   669
		VFSNAME_STATVFS,	{ .vfs_statvfs = nm_statvfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   670
		VFSNAME_SYNC,		{ .vfs_sync = nm_sync },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   671
		NULL,			NULL
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	static const fs_operation_def_t nm_dummy_vfsops_template[] = {
3898
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   674
		VFSNAME_STATVFS,	{ .vfs_statvfs = nm_statvfs },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   675
		VFSNAME_SYNC,		{ .vfs_sync = nm_sync },
c788126f2a20 PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism
rsb
parents: 2678
diff changeset
   676
		NULL,			NULL
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	int dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	vfsops_t *namefs_vfsops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	vfsops_t *dummy_vfsops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	error = vfs_setfsops(fstype, nm_vfsops_template, &namefs_vfsops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
		cmn_err(CE_WARN, "nameinit: bad vfs ops template");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	error = vfs_makefsops(nm_dummy_vfsops_template, &dummy_vfsops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
		(void) vfs_freevfsops_by_type(fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		cmn_err(CE_WARN, "nameinit: bad dummy vfs ops template");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	error = vn_make_ops(name, nm_vnodeops_template, &nm_vnodeops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		(void) vfs_freevfsops_by_type(fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		vfs_freevfsops(dummy_vfsops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		cmn_err(CE_WARN, "nameinit: bad vnode ops template");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	namefstype = fstype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	if ((dev = getudev()) == (major_t)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		cmn_err(CE_WARN, "nameinit: can't get unique device");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
		dev = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
	mutex_init(&ntable_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	namedev = makedevice(dev, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	bzero(nm_filevp_hash, sizeof (nm_filevp_hash));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	vfs_setops(&namevfs, dummy_vfsops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	namevfs.vfs_vnodecovered = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	namevfs.vfs_bsize = 1024;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
	namevfs.vfs_fstype = namefstype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	vfs_make_fsid(&namevfs.vfs_fsid, namedev, namefstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
	namevfs.vfs_dev = namedev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
static mntopts_t nm_mntopts = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
static vfsdef_t vfw = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	VFSDEF_VERSION,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
	"namefs",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
	nameinit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	VSW_HASPROTO,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
	&nm_mntopts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
 * Module linkage information for the kernel.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
static struct modlfs modlfs = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	&mod_fsops, "filesystem for namefs", &vfw
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
static struct modlinkage modlinkage = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	MODREV_1, (void *)&modlfs, NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	namenodeno_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	return (mod_install(&modlinkage));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
_fini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	return (EBUSY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
_info(struct modinfo *modinfop)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	return (mod_info(&modlinkage, modinfop));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
}