usr/src/uts/common/fs/dev/sdev_vtops.c
author Robert Mustacchi <rm@joyent.com>
Wed, 08 May 2013 01:46:41 +0000
changeset 14223 1652c59077c6
parent 12717 1cb0b42b763e
permissions -rw-r--r--
3978 renaming dynamic sdev nodes is problematic 3979 sdev dynamic directories can be created multiple times 3980 sdev vfs refcount assertion violation 3981 sdev backing store nodes not always present 3982 sdev could use some theory statements 3983 sdev_shadow_node slept through a vn_rele Reviewed by: Keith M Wesolowski <[email protected]> Reviewed by: Jerry Jelinek <[email protected]> Reviewed by: Gordon Ross <[email protected]> Reviewed by: Richard Lowe <[email protected]> Approved by: Garrett D'Amore <[email protected]>
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
/*
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
    22
 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    23
 */
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
 * 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
    27
 */
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
#include <sys/types.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    30
#include <sys/param.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    31
#include <sys/sysmacros.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    32
#include <sys/sunndi.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    33
#include <fs/fs_subr.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    34
#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
    35
#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
    36
#include <sys/policy.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    37
#include <sys/stat.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    38
#include <sys/vfs_opreg.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    39
#include <sys/tty.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    40
#include <sys/vt_impl.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    41
#include <sys/note.h>
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    42
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    43
/* 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
    44
_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
    45
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    46
#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
    47
#define	DEVVT_GID_DEFAULT	(0)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    48
#define	DEVVT_DEVMODE_DEFAULT	(0600)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    49
#define	DEVVT_ACTIVE_NAME	"active"
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
    50
#define	DEVVT_CONSUSER_NAME	"console_user"
7688
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
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
    91
/*
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
    92
 * Validate that a node is up-to-date and correct.
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
    93
 * A validator may not update the node state or
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
    94
 * contents as a read lock permits entry by
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
    95
 * multiple threads.
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
    96
 */
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    97
int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
    98
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
    99
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   100
	minor_t min;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   101
	char *nm = dv->sdev_name;
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   102
	int rval;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   103
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   104
	ASSERT(dv->sdev_state == SDEV_READY);
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   105
	ASSERT(RW_LOCK_HELD(&(dv->sdev_dotdot)->sdev_contents));
7688
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
	/* validate only READY nodes */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   108
	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
   109
		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
   110
		    nm, (void *)dv));
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   111
		return (SDEV_VTOR_SKIP);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   112
	}
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
	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
   115
		return (SDEV_VTOR_INVALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   116
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   117
	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
   118
		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
   119
		(void) vt_getactive(link, MAXPATHLEN);
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   120
		rval = (strcmp(link, dv->sdev_symlink) == 0) ?
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   121
		    SDEV_VTOR_VALID : SDEV_VTOR_STALE;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   122
		kmem_free(link, MAXPATHLEN);
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   123
		return (rval);
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   124
	}
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   125
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   126
	if (strcmp(nm, DEVVT_CONSUSER_NAME) == 0) {
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   127
		char *link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   128
		(void) vt_getconsuser(link, MAXPATHLEN);
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   129
		rval = (strcmp(link, dv->sdev_symlink) == 0) ?
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   130
		    SDEV_VTOR_VALID : SDEV_VTOR_STALE;
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   131
		kmem_free(link, MAXPATHLEN);
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   132
		return (rval);
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   133
	}
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   134
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   135
	if (devvt_str2minor(nm, &min) != 0) {
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   136
		return (SDEV_VTOR_INVALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   137
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   138
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   139
	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
   140
		return (SDEV_VTOR_INVALID);
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
	return (SDEV_VTOR_VALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   143
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   144
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
 * 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
   147
 * 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
   148
 */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   149
/*ARGSUSED*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   150
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   151
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
   152
    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
   153
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   154
	minor_t min;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   155
	major_t maj;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   156
	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
   157
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   158
	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
   159
		return (SDEV_VTOR_INVALID);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   160
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   161
	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
   162
		(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
   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
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   166
	if (strcmp(nm, DEVVT_CONSUSER_NAME) == 0) {
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   167
		(void) vt_getconsuser((char *)*arg, MAXPATHLEN);
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   168
		return (0);
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   169
	}
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   170
	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
   171
		return (-1);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   172
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   173
	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
   174
		return (-1);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   175
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   176
	*vap = devvt_vattr;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   177
	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
   178
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   179
	return (0);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   180
}
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
/*ARGSUSED3*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   183
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   184
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
   185
    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
   186
    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
   187
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   188
	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
   189
	struct sdev_node *dv;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   190
	struct vnode *rvp = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   191
	int type, error;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   192
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   193
	if ((strcmp(nm, DEVVT_ACTIVE_NAME) == 0) ||
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   194
	    (strcmp(nm, DEVVT_CONSUSER_NAME) == 0)) {
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   195
		type = SDEV_VLINK;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   196
	} else {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   197
		type = SDEV_VATTR;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   198
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   199
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   200
/* 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
   201
#ifndef __lock_lint
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   202
	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
   203
	    devvt_create_rvp, type);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   204
#else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   205
	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
   206
#endif
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
	if (error == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   209
		switch ((*vpp)->v_type) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   210
		case VCHR:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   211
			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
   212
			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
   213
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   214
		case VDIR:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   215
		case VLNK:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   216
			dv = VTOSDEV(*vpp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   217
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   218
		default:
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   219
			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
   220
			    "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
   221
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   222
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   223
		ASSERT(SDEV_HELD(dv));
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   224
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   225
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   226
	return (error);
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
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   229
static void
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   230
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
   231
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   232
	int error;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   233
	struct sdev_node *sdv = NULL;
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 8023
diff changeset
   234
	struct vattr vattr;
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 8023
diff changeset
   235
	struct vattr *vap = &vattr;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   236
	major_t maj;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   237
	minor_t min;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   238
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   239
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   240
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   241
	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
   242
		return;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   243
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   244
	if (strcmp(nm, DEVVT_ACTIVE_NAME) != 0 &&
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   245
	    strcmp(nm, DEVVT_CONSUSER_NAME) != 0 &&
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   246
	    devvt_str2minor(nm, &min) != 0)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   247
		return;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   248
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   249
	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
   250
	if (error || !sdv) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   251
		return;
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_BLOCK_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
	if (type & SDEV_VATTR) {
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 8023
diff changeset
   259
		*vap = devvt_vattr;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   260
		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
   261
		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
   262
		    NULL, cred, SDEV_READY);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   263
	} else if (type & SDEV_VLINK) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   264
		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
   265
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   266
		(void) vt_getactive(link, MAXPATHLEN);
11279
b69054bce66e 6906514 sdev_attrinit ignores va_mask, leading to whacky /dev/zcons vattrs
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 8023
diff changeset
   267
		*vap = sdev_vattr_lnk;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   268
		vap->va_size = strlen(link);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   269
		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
   270
		    (void *)link, cred, SDEV_READY);
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
		kmem_free(link, MAXPATHLEN);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   273
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   274
14223
1652c59077c6 3978 renaming dynamic sdev nodes is problematic
Robert Mustacchi <rm@joyent.com>
parents: 12717
diff changeset
   275
	if (error != 0) {
1652c59077c6 3978 renaming dynamic sdev nodes is problematic
Robert Mustacchi <rm@joyent.com>
parents: 12717
diff changeset
   276
		SDEV_RELE(sdv);
1652c59077c6 3978 renaming dynamic sdev nodes is problematic
Robert Mustacchi <rm@joyent.com>
parents: 12717
diff changeset
   277
		return;
1652c59077c6 3978 renaming dynamic sdev nodes is problematic
Robert Mustacchi <rm@joyent.com>
parents: 12717
diff changeset
   278
	}
1652c59077c6 3978 renaming dynamic sdev nodes is problematic
Robert Mustacchi <rm@joyent.com>
parents: 12717
diff changeset
   279
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   280
	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
   281
	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
   282
	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
   283
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   284
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   285
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   286
static void
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   287
devvt_rebuild_stale_link(struct sdev_node *ddv, struct sdev_node *dv)
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   288
{
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   289
	char *link;
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   290
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   291
	ASSERT(RW_WRITE_HELD(&ddv->sdev_contents));
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   292
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   293
	ASSERT((strcmp(dv->sdev_name, DEVVT_ACTIVE_NAME) == 0) ||
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   294
	    (strcmp(dv->sdev_name, DEVVT_CONSUSER_NAME) == 0));
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   295
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   296
	link = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   297
	if (strcmp(dv->sdev_name, DEVVT_ACTIVE_NAME) == 0) {
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   298
		(void) vt_getactive(link, MAXPATHLEN);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   299
	} else if (strcmp(dv->sdev_name, DEVVT_CONSUSER_NAME) == 0) {
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   300
		(void) vt_getconsuser(link, MAXPATHLEN);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   301
	}
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   302
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   303
	if (strcmp(link, dv->sdev_symlink) != 0) {
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   304
		strfree(dv->sdev_symlink);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   305
		dv->sdev_symlink = strdup(link);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   306
		dv->sdev_attr->va_size = strlen(link);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   307
	}
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   308
	kmem_free(link, MAXPATHLEN);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   309
}
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   310
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   311
/*
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   312
 * First step in refreshing directory contents.
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   313
 * Remove each invalid entry and rebuild the link
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   314
 * reference for each stale entry.
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   315
 */
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   316
static void
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   317
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
   318
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   319
	struct vnode *vp;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   320
	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
   321
	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
   322
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   323
	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
   324
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   325
	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
   326
	ASSERT(vtor);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   327
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   328
	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
   329
		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
   330
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   331
		switch (vtor(dv)) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   332
		case SDEV_VTOR_VALID:
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   333
			break;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   334
		case SDEV_VTOR_SKIP:
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   335
			break;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   336
		case SDEV_VTOR_INVALID:
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   337
			vp = SDEVTOV(dv);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   338
			if (vp->v_count != 0)
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   339
				break;
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   340
			/* remove the cached node */
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   341
			SDEV_HOLD(dv);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   342
			(void) sdev_cache_update(ddv, &dv,
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   343
			    dv->sdev_name, SDEV_CACHE_DELETE);
14223
1652c59077c6 3978 renaming dynamic sdev nodes is problematic
Robert Mustacchi <rm@joyent.com>
parents: 12717
diff changeset
   344
			SDEV_RELE(dv);
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   345
			break;
8023
faf256d5c16c PSARC/2006/475 Clearview: IP Observability Devices
Philip Kirk <Phil.Kirk@Sun.COM>
parents: 7688
diff changeset
   346
		case SDEV_VTOR_STALE:
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   347
			devvt_rebuild_stale_link(ddv, dv);
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   348
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   349
		}
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
static void
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   354
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
   355
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   356
	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
   357
	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
   358
	int min, cnt;
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   359
	char found = 0;
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   360
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   361
	mutex_enter(&vc_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   362
	cnt = VC_INSTANCES_COUNT;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   363
	mutex_exit(&vc_lock);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   364
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   365
/* 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
   366
#ifndef	__lock_lint
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   367
	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
   368
		rw_exit(&sdvp->sdev_contents);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   369
		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
   370
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   371
#else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   372
	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
   373
#endif
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   374
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   375
	/* 1.  prune invalid nodes and rebuild stale symlinks */
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   376
	devvt_prunedir(sdvp);
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   377
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   378
	/* 2. create missing nodes */
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   379
	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
   380
		char nm[16];
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
		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
   383
			continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   384
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   385
		(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
   386
		found = 0;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   387
		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
   388
			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
   389
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   390
			/* validate only ready nodes */
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   391
			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
   392
				continue;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   393
			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
   394
				found = 1;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   395
				break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   396
			}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   397
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   398
		if (!found) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   399
			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
   400
		}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   401
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   402
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   403
	/* 3. create active link node and console user link node */
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   404
	found = 0;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   405
	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
   406
		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
   407
12717
1cb0b42b763e 6961039 /dev/vt: race in symlink updates can result in kernel heap corruption
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 12195
diff changeset
   408
		/* validate only ready nodes */
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   409
		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
   410
			continue;
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   411
		if ((strcmp(dv->sdev_name, DEVVT_ACTIVE_NAME) == NULL))
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   412
			found |= 0x01;
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   413
		if ((strcmp(dv->sdev_name, DEVVT_CONSUSER_NAME) == NULL))
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   414
			found |= 0x02;
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   415
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   416
		if ((found & 0x01) && (found & 0x02))
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   417
			break;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   418
	}
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   419
	if (!(found & 0x01))
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   420
		devvt_create_snode(sdvp, DEVVT_ACTIVE_NAME, cred, SDEV_VLINK);
12195
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   421
	if (!(found & 0x02))
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   422
		devvt_create_snode(sdvp, DEVVT_CONSUSER_NAME, cred, SDEV_VLINK);
cf3a8ea2dcfd PSARC/2010/119 "Console User" assignment, logindevperm and virtual console update
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents: 11279
diff changeset
   423
7688
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   424
#ifndef	__lock_lint
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   425
	rw_downgrade(&sdvp->sdev_contents);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   426
#else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   427
	rw_exit(&sdvp->sdev_contents);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   428
#endif
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
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   431
/*ARGSUSED4*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   432
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   433
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
   434
    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
   435
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   436
	if (uiop->uio_offset == 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   437
		devvt_cleandir(dvp, cred);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   438
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   439
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   440
	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
   441
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   442
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   443
/*
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   444
 * 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
   445
 *	- 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
   446
 *	- 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
   447
 *	- exclusive creates fail - EEXIST
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   448
 */
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   449
/*ARGSUSED2*/
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   450
static int
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   451
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
   452
    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
   453
    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
   454
{
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   455
	int error;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   456
	struct vnode *vp;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   457
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   458
	*vpp = NULL;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   459
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   460
	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
   461
	    NULL)) != 0) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   462
		if (error == ENOENT)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   463
			error = EROFS;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   464
		return (error);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   465
	}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   466
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   467
	if (excl == EXCL)
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   468
		error = EEXIST;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   469
	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
   470
		error = EISDIR;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   471
	else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   472
		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
   473
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   474
	if (error) {
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   475
		VN_RELE(vp);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   476
	} else
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   477
		*vpp = vp;
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   478
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   479
	return (error);
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   480
}
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   481
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   482
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
   483
	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
   484
	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
   485
	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
   486
	VOPNAME_REMOVE,		{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   487
	VOPNAME_MKDIR,		{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   488
	VOPNAME_RMDIR,		{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   489
	VOPNAME_SYMLINK,	{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   490
	VOPNAME_SETSECATTR,	{ .error = fs_nosys },
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   491
	NULL,			NULL
2757e6e1bb2a PSARC 2006/591 Virtual Console
rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>
parents:
diff changeset
   492
};