usr/src/uts/common/fs/dev/sdev_vtops.c
author Philip Kirk <Phil.Kirk@Sun.COM>
Thu, 06 Nov 2008 06:47:54 -0500
changeset 8023 faf256d5c16c
parent 7688 2757e6e1bb2a
child 11279 b69054bce66e
permissions -rw-r--r--
PSARC/2006/475 Clearview: IP Observability Devices 4085089 add a feature to enable 'snooping' of the loopback traffic 6753688 ip netinfo has no need for separate create and dispatch functions 6755448 ifconfig wedged in SIOCLIFREMOVEIF 6756483 incorrect ASSERT() in ip_delmulti[_v6]() 5092073 RFE: allow snoop to filter on zonename or zoneid 6606991 panic assertion failure !ill->ill_join_allmulti for multicast router 6760922 devname doesn't handle stale dev_t's in sdev_node cache entries
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     1
/*
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     2
 * CDDL HEADER START
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     3
 *
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     7
 *
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    11
 * and limitations under the License.
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    12
 *
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    18
 *
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    19
 * CDDL HEADER END
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    20
 */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    21
/*
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    23
 * Use is subject to license terms.
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    24
 */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    25
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    26
/*
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    27
 * vnode ops for the /dev/vt directory
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    28
 */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    29
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    30
#include <sys/types.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    31
#include <sys/param.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    32
#include <sys/sysmacros.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    33
#include <sys/sunndi.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    34
#include <fs/fs_subr.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    35
#include <sys/fs/dv_node.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    36
#include <sys/fs/sdev_impl.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    37
#include <sys/policy.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    38
#include <sys/stat.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    39
#include <sys/vfs_opreg.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    40
#include <sys/tty.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    41
#include <sys/vt_impl.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    42
#include <sys/note.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    43
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    44
/* warlock in this file only cares about variables shared by vt and devfs */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    45
_NOTE(SCHEME_PROTECTS_DATA("Do not care", sdev_node vattr vnode))
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    46
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    47
#define	DEVVT_UID_DEFAULT	SDEV_UID_DEFAULT
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    48
#define	DEVVT_GID_DEFAULT	(0)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    49
#define	DEVVT_DEVMODE_DEFAULT	(0600)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    50
#define	DEVVT_ACTIVE_NAME	"active"
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    51
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    52
#define	isdigit(ch)	((ch) >= '0' && (ch) <= '9')
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    53
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    54
/* attributes for VT nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    55
static vattr_t devvt_vattr = {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    56
	AT_TYPE|AT_MODE|AT_UID|AT_GID,		/* va_mask */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    57
	VCHR,					/* va_type */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    58
	S_IFCHR | DEVVT_DEVMODE_DEFAULT,	/* va_mode */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    59
	DEVVT_UID_DEFAULT,			/* va_uid */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    60
	DEVVT_GID_DEFAULT,			/* va_gid */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    61
	0					/* 0 hereafter */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    62
};
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    63
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    64
struct vnodeops		*devvt_vnodeops;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    65
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    66
struct vnodeops *
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    67
devvt_getvnodeops(void)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    68
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    69
	return (devvt_vnodeops);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    70
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    71
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    72
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    73
devvt_str2minor(const char *nm, minor_t *mp)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    74
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    75
	long uminor = 0;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    76
	char *endptr = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    77
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    78
	if (nm == NULL || !isdigit(*nm))
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    79
		return (EINVAL);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    80
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    81
	*mp = 0;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    82
	if (ddi_strtol(nm, &endptr, 10, &uminor) != 0 ||
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    83
	    *endptr != '\0' || uminor < 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    84
		return (EINVAL);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    85
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    86
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    87
	*mp = (minor_t)uminor;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    88
	return (0);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    89
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    90
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    91
/*ARGSUSED*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    92
int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    93
devvt_validate(struct sdev_node *dv)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    94
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    95
	minor_t min;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    96
	char *nm = dv->sdev_name;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    97
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    98
	ASSERT(!(dv->sdev_flags & SDEV_STALE));
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    99
	ASSERT(dv->sdev_state == SDEV_READY);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   100
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   101
	/* validate only READY nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   102
	if (dv->sdev_state != SDEV_READY) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   103
		sdcmn_err(("dev fs: skipping: node not ready %s(%p)",
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   104
		    nm, (void *)dv));
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   105
		return (SDEV_VTOR_SKIP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   106
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   107
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   108
	if (vt_wc_attached() == (major_t)-1)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   109
		return (SDEV_VTOR_INVALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   110
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   111
	if (strcmp(nm, DEVVT_ACTIVE_NAME) == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   112
		char *link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   113
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   114
		(void) vt_getactive(link, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   115
		if (strcmp(link, dv->sdev_symlink) != 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   116
			kmem_free(dv->sdev_symlink,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   117
			    strlen(dv->sdev_symlink) + 1);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   118
			dv->sdev_symlink = i_ddi_strdup(link, KM_SLEEP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   119
			dv->sdev_attr->va_size = strlen(link);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   120
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   121
		kmem_free(link, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   122
		return (SDEV_VTOR_VALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   123
	} else if (devvt_str2minor(nm, &min) != 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   124
		return (SDEV_VTOR_INVALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   125
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   126
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   127
	if (vt_minor_valid(min) == B_FALSE)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   128
		return (SDEV_VTOR_INVALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   129
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   130
	return (SDEV_VTOR_VALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   131
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   132
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   133
/*
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   134
 * This callback is invoked from devname_lookup_func() to create
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   135
 * a entry when the node is not found in the cache.
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   136
 */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   137
/*ARGSUSED*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   138
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   139
devvt_create_rvp(struct sdev_node *ddv, char *nm,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   140
    void **arg, cred_t *cred, void *whatever, char *whichever)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   141
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   142
	minor_t min;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   143
	major_t maj;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   144
	struct vattr *vap = (struct vattr *)arg;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   145
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   146
	if ((maj = vt_wc_attached()) == (major_t)-1)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   147
		return (SDEV_VTOR_INVALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   148
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   149
	if (strcmp(nm, DEVVT_ACTIVE_NAME) == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   150
		(void) vt_getactive((char *)*arg, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   151
		return (0);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   152
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   153
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   154
	if (devvt_str2minor(nm, &min) != 0)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   155
		return (-1);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   156
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   157
	if (vt_minor_valid(min) == B_FALSE)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   158
		return (-1);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   159
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   160
	*vap = devvt_vattr;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   161
	vap->va_rdev = makedevice(maj, min);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   162
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   163
	return (0);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   164
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   165
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   166
/*ARGSUSED3*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   167
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   168
devvt_lookup(struct vnode *dvp, char *nm, struct vnode **vpp,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   169
    struct pathname *pnp, int flags, struct vnode *rdir, struct cred *cred,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   170
    caller_context_t *ct, int *direntflags, pathname_t *realpnp)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   171
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   172
	struct sdev_node *sdvp = VTOSDEV(dvp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   173
	struct sdev_node *dv;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   174
	struct vnode *rvp = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   175
	int type, error;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   176
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   177
	if (strcmp(nm, DEVVT_ACTIVE_NAME) == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   178
		type = SDEV_VLINK;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   179
	} else {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   180
		type = SDEV_VATTR;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   181
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   182
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   183
/* Give warlock a more clear call graph */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   184
#ifndef __lock_lint
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   185
	error = devname_lookup_func(sdvp, nm, vpp, cred,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   186
	    devvt_create_rvp, type);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   187
#else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   188
	devvt_create_rvp(0, 0, 0, 0, 0, 0);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   189
#endif
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   190
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   191
	if (error == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   192
		switch ((*vpp)->v_type) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   193
		case VCHR:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   194
			dv = VTOSDEV(VTOS(*vpp)->s_realvp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   195
			ASSERT(VOP_REALVP(SDEVTOV(dv), &rvp, NULL) == ENOSYS);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   196
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   197
		case VDIR:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   198
		case VLNK:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   199
			dv = VTOSDEV(*vpp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   200
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   201
		default:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   202
			cmn_err(CE_PANIC, "devvt_lookup: Unsupported node "
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   203
			    "type: %p: %d", (void *)(*vpp), (*vpp)->v_type);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   204
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   205
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   206
		ASSERT(SDEV_HELD(dv));
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   207
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   208
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   209
	return (error);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   210
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   211
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   212
static void
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   213
devvt_create_snode(struct sdev_node *ddv, char *nm, struct cred *cred, int type)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   214
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   215
	int error;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   216
	struct sdev_node *sdv = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   217
	struct vattr *vap = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   218
	major_t maj;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   219
	minor_t min;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   220
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   221
	if ((maj = vt_wc_attached()) == (major_t)-1)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   222
		return;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   223
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   224
	if (strcmp(nm, DEVVT_ACTIVE_NAME) != 0 &&
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   225
	    devvt_str2minor(nm, &min) != 0)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   226
		return;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   227
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   228
	error = sdev_mknode(ddv, nm, &sdv, NULL, NULL, NULL, cred, SDEV_INIT);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   229
	if (error || !sdv) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   230
		return;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   231
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   232
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   233
	mutex_enter(&sdv->sdev_lookup_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   234
	SDEV_BLOCK_OTHERS(sdv, SDEV_LOOKUP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   235
	mutex_exit(&sdv->sdev_lookup_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   236
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   237
	if (type & SDEV_VATTR) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   238
		vap = &devvt_vattr;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   239
		vap->va_rdev = makedevice(maj, min);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   240
		error = sdev_mknode(ddv, nm, &sdv, vap, NULL,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   241
		    NULL, cred, SDEV_READY);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   242
	} else if (type & SDEV_VLINK) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   243
		char *link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   244
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   245
		(void) vt_getactive(link, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   246
		vap = &sdev_vattr_lnk;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   247
		vap->va_size = strlen(link);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   248
		error = sdev_mknode(ddv, nm, &sdv, vap, NULL,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   249
		    (void *)link, cred, SDEV_READY);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   250
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   251
		kmem_free(link, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   252
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   253
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   254
	mutex_enter(&sdv->sdev_lookup_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   255
	SDEV_UNBLOCK_OTHERS(sdv, SDEV_LOOKUP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   256
	mutex_exit(&sdv->sdev_lookup_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   257
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   258
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   259
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   260
static void
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   261
devvt_prunedir(struct sdev_node *ddv)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   262
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   263
	struct vnode *vp;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   264
	struct sdev_node *dv, *next = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   265
	int (*vtor)(struct sdev_node *) = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   266
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   267
	ASSERT(ddv->sdev_flags & SDEV_VTOR);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   268
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   269
	vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   270
	ASSERT(vtor);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   271
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   272
	for (dv = SDEV_FIRST_ENTRY(ddv); dv; dv = next) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   273
		next = SDEV_NEXT_ENTRY(ddv, dv);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   274
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   275
		/* skip stale nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   276
		if (dv->sdev_flags & SDEV_STALE)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   277
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   278
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   279
		/* validate and prune only ready nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   280
		if (dv->sdev_state != SDEV_READY)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   281
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   282
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   283
		switch (vtor(dv)) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   284
		case SDEV_VTOR_VALID:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   285
		case SDEV_VTOR_SKIP:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   286
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   287
		case SDEV_VTOR_INVALID:
8023
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7688
diff changeset
   288
		case SDEV_VTOR_STALE:
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   289
			sdcmn_err7(("destroy invalid "
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   290
			    "node: %s(%p)\n", dv->sdev_name, (void *)dv));
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   291
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   292
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   293
		vp = SDEVTOV(dv);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   294
		if (vp->v_count > 0)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   295
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   296
		SDEV_HOLD(dv);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   297
		/* remove the cache node */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   298
		(void) sdev_cache_update(ddv, &dv, dv->sdev_name,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   299
		    SDEV_CACHE_DELETE);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   300
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   301
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   302
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   303
static void
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   304
devvt_cleandir(struct vnode *dvp, struct cred *cred)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   305
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   306
	struct sdev_node *sdvp = VTOSDEV(dvp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   307
	struct sdev_node *dv, *next = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   308
	int min, cnt;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   309
	int found = 0;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   310
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   311
	mutex_enter(&vc_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   312
	cnt = VC_INSTANCES_COUNT;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   313
	mutex_exit(&vc_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   314
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   315
/* We have to fool warlock this way, otherwise it will complain */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   316
#ifndef	__lock_lint
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   317
	if (rw_tryupgrade(&sdvp->sdev_contents) == NULL) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   318
		rw_exit(&sdvp->sdev_contents);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   319
		rw_enter(&sdvp->sdev_contents, RW_WRITER);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   320
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   321
#else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   322
	rw_enter(&sdvp->sdev_contents, RW_WRITER);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   323
#endif
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   324
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   325
	/* 1. create missed nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   326
	for (min = 0; min < cnt; min++) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   327
		char nm[16];
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   328
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   329
		if (vt_minor_valid(min) == B_FALSE)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   330
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   331
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   332
		(void) snprintf(nm, sizeof (nm), "%d", min);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   333
		found = 0;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   334
		for (dv = SDEV_FIRST_ENTRY(sdvp); dv; dv = next) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   335
			next = SDEV_NEXT_ENTRY(sdvp, dv);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   336
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   337
			/* skip stale nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   338
			if (dv->sdev_flags & SDEV_STALE)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   339
				continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   340
			/* validate and prune only ready nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   341
			if (dv->sdev_state != SDEV_READY)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   342
				continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   343
			if (strcmp(nm, dv->sdev_name) == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   344
				found = 1;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   345
				break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   346
			}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   347
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   348
		if (!found) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   349
			devvt_create_snode(sdvp, nm, cred, SDEV_VATTR);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   350
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   351
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   352
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   353
	/* 2. create active link node */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   354
	found = 0;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   355
	for (dv = SDEV_FIRST_ENTRY(sdvp); dv; dv = next) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   356
		next = SDEV_NEXT_ENTRY(sdvp, dv);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   357
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   358
		/* skip stale nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   359
		if (dv->sdev_flags & SDEV_STALE)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   360
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   361
		/* validate and prune only ready nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   362
		if (dv->sdev_state != SDEV_READY)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   363
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   364
		if ((strcmp(dv->sdev_name, DEVVT_ACTIVE_NAME) == NULL)) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   365
			found = 1;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   366
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   367
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   368
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   369
	if (!found)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   370
		devvt_create_snode(sdvp, DEVVT_ACTIVE_NAME, cred, SDEV_VLINK);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   371
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   372
	/* 3. cleanup invalid nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   373
	devvt_prunedir(sdvp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   374
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   375
#ifndef	__lock_lint
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   376
	rw_downgrade(&sdvp->sdev_contents);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   377
#else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   378
	rw_exit(&sdvp->sdev_contents);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   379
#endif
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   380
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   381
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   382
/*ARGSUSED4*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   383
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   384
devvt_readdir(struct vnode *dvp, struct uio *uiop, struct cred *cred,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   385
    int *eofp, caller_context_t *ct, int flags)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   386
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   387
	if (uiop->uio_offset == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   388
		devvt_cleandir(dvp, cred);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   389
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   390
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   391
	return (devname_readdir_func(dvp, uiop, cred, eofp, 0));
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   392
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   393
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   394
/*
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   395
 * We allow create to find existing nodes
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   396
 *	- if the node doesn't exist - EROFS
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   397
 *	- creating an existing dir read-only succeeds, otherwise EISDIR
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   398
 *	- exclusive creates fail - EEXIST
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   399
 */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   400
/*ARGSUSED2*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   401
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   402
devvt_create(struct vnode *dvp, char *nm, struct vattr *vap, vcexcl_t excl,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   403
    int mode, struct vnode **vpp, struct cred *cred, int flag,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   404
    caller_context_t *ct, vsecattr_t *vsecp)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   405
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   406
	int error;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   407
	struct vnode *vp;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   408
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   409
	*vpp = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   410
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   411
	if ((error = devvt_lookup(dvp, nm, &vp, NULL, 0, NULL, cred, ct, NULL,
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   412
	    NULL)) != 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   413
		if (error == ENOENT)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   414
			error = EROFS;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   415
		return (error);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   416
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   417
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   418
	if (excl == EXCL)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   419
		error = EEXIST;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   420
	else if (vp->v_type == VDIR && (mode & VWRITE))
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   421
		error = EISDIR;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   422
	else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   423
		error = VOP_ACCESS(vp, mode, 0, cred, ct);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   424
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   425
	if (error) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   426
		VN_RELE(vp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   427
	} else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   428
		*vpp = vp;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   429
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   430
	return (error);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   431
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   432
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   433
const fs_operation_def_t devvt_vnodeops_tbl[] = {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   434
	VOPNAME_READDIR,	{ .vop_readdir = devvt_readdir },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   435
	VOPNAME_LOOKUP,		{ .vop_lookup = devvt_lookup },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   436
	VOPNAME_CREATE,		{ .vop_create = devvt_create },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   437
	VOPNAME_REMOVE,		{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   438
	VOPNAME_MKDIR,		{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   439
	VOPNAME_RMDIR,		{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   440
	VOPNAME_SYMLINK,	{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   441
	VOPNAME_SETSECATTR,	{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   442
	NULL,			NULL
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   443
};