diff options
author | rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM> | 2008-09-25 14:01:48 +0800 |
---|---|---|
committer | rui zang - Sun Microsystems - Beijing China <Aaron.Zang@Sun.COM> | 2008-09-25 14:01:48 +0800 |
commit | aecfc01d1bad84e66649703f7fc2926ef70b34ba (patch) | |
tree | 30d7ae76f4cff7994f216c9e89819dda18b2ae63 /usr/src/uts/common/fs/dev/sdev_subr.c | |
parent | f4565e39fe75b2c28258c16bc697741760935002 (diff) | |
download | illumos-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.c | 34 |
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 |