summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/dev/sdev_subr.c
diff options
context:
space:
mode:
authorrui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>2008-09-25 14:01:48 +0800
committerrui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM>2008-09-25 14:01:48 +0800
commitaecfc01d1bad84e66649703f7fc2926ef70b34ba (patch)
tree30d7ae76f4cff7994f216c9e89819dda18b2ae63 /usr/src/uts/common/fs/dev/sdev_subr.c
parentf4565e39fe75b2c28258c16bc697741760935002 (diff)
downloadillumos-gate-aecfc01d1bad84e66649703f7fc2926ef70b34ba.tar.gz
PSARC 2006/591 Virtual Console
PSARC 2008/515 Virtual Console Update 4309501 Need additional local 'terminal' --HG-- rename : usr/src/uts/intel/sys/kd.h => usr/src/uts/common/sys/kd.h
Diffstat (limited to 'usr/src/uts/common/fs/dev/sdev_subr.c')
-rw-r--r--usr/src/uts/common/fs/dev/sdev_subr.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/usr/src/uts/common/fs/dev/sdev_subr.c b/usr/src/uts/common/fs/dev/sdev_subr.c
index 40d2b7962e..7a926cab67 100644
--- a/usr/src/uts/common/fs/dev/sdev_subr.c
+++ b/usr/src/uts/common/fs/dev/sdev_subr.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* utility routines for the /dev fs
*/
@@ -608,6 +606,9 @@ static struct sdev_vop_table vtab[] =
{ "pts", devpts_vnodeops_tbl, NULL, &devpts_vnodeops, devpts_validate,
SDEV_DYNAMIC | SDEV_VTOR },
+ { "vt", devvt_vnodeops_tbl, NULL, &devvt_vnodeops, devvt_validate,
+ SDEV_DYNAMIC | SDEV_VTOR },
+
{ "zcons", NULL, NULL, NULL, NULL, SDEV_NO_NCACHE },
{ "net", devnet_vnodeops_tbl, NULL, &devnet_vnodeops, devnet_validate,
@@ -1949,7 +1950,6 @@ sdev_call_dircallback(struct sdev_node *ddv, struct sdev_node **dvp, char *nm,
return (-1);
}
- ASSERT(physpath);
rvp = devname_configure_by_path(physpath, NULL);
if (rvp == NULL) {
sdcmn_err3(("devname_configure_by_path: "
@@ -1990,6 +1990,34 @@ sdev_call_dircallback(struct sdev_node *ddv, struct sdev_node **dvp, char *nm,
return (0);
}
}
+ } else if (flags & SDEV_VLINK) {
+ physpath = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
+ rv = callback(ddv, nm, (void *)&physpath, kcred, NULL,
+ NULL);
+ if (rv) {
+ kmem_free(physpath, MAXPATHLEN);
+ return (-1);
+ }
+
+ vap = sdev_getdefault_attr(VLNK);
+ vap->va_size = strlen(physpath);
+ ASSERT(RW_READ_HELD(&ddv->sdev_contents));
+
+ if (!rw_tryupgrade(&ddv->sdev_contents)) {
+ rw_exit(&ddv->sdev_contents);
+ rw_enter(&ddv->sdev_contents, RW_WRITER);
+ }
+ rv = sdev_mknode(ddv, nm, &dv, vap, NULL,
+ (void *)physpath, cred, SDEV_READY);
+ rw_downgrade(&ddv->sdev_contents);
+ kmem_free(physpath, MAXPATHLEN);
+ if (rv)
+ return (rv);
+
+ mutex_enter(&dv->sdev_lookup_lock);
+ SDEV_UNBLOCK_OTHERS(dv, SDEV_LOOKUP);
+ mutex_exit(&dv->sdev_lookup_lock);
+ return (0);
} else if (flags & SDEV_VNODE) {
/*
* DBNR has its own way to create the device