diff options
Diffstat (limited to 'usr/src/uts/common/io/sysmsg.c')
-rw-r--r-- | usr/src/uts/common/io/sysmsg.c | 89 |
1 files changed, 36 insertions, 53 deletions
diff --git a/usr/src/uts/common/io/sysmsg.c b/usr/src/uts/common/io/sysmsg.c index 085e27e4f2..3f12dde131 100644 --- a/usr/src/uts/common/io/sysmsg.c +++ b/usr/src/uts/common/io/sysmsg.c @@ -197,9 +197,9 @@ sysm_attach(dev_info_t *devi, ddi_attach_cmd_t cmd) ASSERT(sysm_dip == NULL); if (ddi_create_minor_node(devi, "sysmsg", S_IFCHR, - SYS_SYSMIN, DDI_PSEUDO, NULL) == DDI_FAILURE || - ddi_create_minor_node(devi, "msglog", S_IFCHR, - SYS_MSGMIN, DDI_PSEUDO, NULL) == DDI_FAILURE) { + SYS_SYSMIN, DDI_PSEUDO, NULL) == DDI_FAILURE || + ddi_create_minor_node(devi, "msglog", S_IFCHR, + SYS_MSGMIN, DDI_PSEUDO, NULL) == DDI_FAILURE) { ddi_remove_minor_node(devi, NULL); return (DDI_FAILURE); } @@ -208,8 +208,6 @@ sysm_attach(dev_info_t *devi, ddi_attach_cmd_t cmd) rw_init(&sysmcache[i].dca_lock, NULL, RW_DRIVER, NULL); } - /* set everything up .. */ - bind_consadm_conf("/etc/consadm.conf"); sysm_dip = devi; return (DDI_SUCCESS); case DDI_SUSPEND: @@ -229,20 +227,8 @@ sysm_detach(dev_info_t *devi, ddi_detach_cmd_t cmd) case DDI_DETACH: ASSERT(sysm_dip == devi); - if (dcvp) { - (void) VOP_CLOSE(dcvp, FWRITE, 1, (offset_t)0, kcred); - VN_RELE(dcvp); - dcvp = NULL; - } - for (i = 0; i < MAXDEVS; i++) { - if (sysmcache[i].dca_vp != NULL) { - (void) VOP_CLOSE(sysmcache[i].dca_vp, 0, - 1, (offset_t)0, 0); - VN_RELE(sysmcache[i].dca_vp); - } - sysmcache[i].dca_vp = NULL; + for (i = 0; i < MAXDEVS; i++) rw_destroy(&sysmcache[i].dca_lock); - } ddi_remove_minor_node(devi, NULL); sysm_dip = NULL; @@ -269,7 +255,7 @@ sysm_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result) switch (infocmd) { case DDI_INFO_DEVT2DEVINFO: if (sysm_dip != NULL && - (instance == SYS_SYSMIN || instance == SYS_MSGMIN)) { + (instance == SYS_SYSMIN || instance == SYS_MSGMIN)) { *result = sysm_dip; rval = DDI_SUCCESS; } @@ -325,8 +311,8 @@ parse_buffer(char *buf, ssize_t fsize) if (devname == NULL) break; (void) sysmioctl(NODEV, CIOCSETCONSOLE, - (intptr_t)devname, FNATIVE|FKIOCTL|FREAD|FWRITE, - kcred, NULL); + (intptr_t)devname, FNATIVE|FKIOCTL|FREAD|FWRITE, + kcred, NULL); devname = NULL; break; default: @@ -353,16 +339,16 @@ bind_consadm_conf(char *path) vattr.va_mask = AT_SIZE; if ((err = VOP_GETATTR(vp, &vattr, 0, kcred)) != 0) { cmn_err(CE_WARN, "sysmsg: getattr: '%s': error %d", - path, err); + path, err); goto closevp; } size = vattr.va_size > CNSADM_BYTES_MAX ? - CNSADM_BYTES_MAX : (ssize_t)vattr.va_size; + CNSADM_BYTES_MAX : (ssize_t)vattr.va_size; buf = kmem_alloc(size, KM_SLEEP); if ((err = vn_rdwr(UIO_READ, vp, buf, size, (offset_t)0, - UIO_SYSSPACE, 0, (rlim64_t)0, kcred, &resid)) != 0) + UIO_SYSSPACE, 0, (rlim64_t)0, kcred, &resid)) != 0) cmn_err(CE_WARN, "sysmsg: vn_rdwr: '%s': error %d", path, err); else @@ -381,6 +367,7 @@ sysmopen(dev_t *dev, int flag, int state, cred_t *cred) int i; vnode_t *vp; minor_t instance; + static boolean_t initialized = B_FALSE; instance = getminor(*dev); @@ -389,16 +376,21 @@ sysmopen(dev_t *dev, int flag, int state, cred_t *cred) mutex_enter(&dcvp_mutex); if ((dcvp == NULL) && (vn_open("/dev/console", - UIO_SYSSPACE, FWRITE, 0, &dcvp, 0, 0) != 0)) { + UIO_SYSSPACE, FWRITE, 0, &dcvp, 0, 0) != 0)) { mutex_exit(&dcvp_mutex); return (ENXIO); } mutex_exit(&dcvp_mutex); + if (!initialized) { + bind_consadm_conf("/etc/consadm.conf"); + initialized = B_TRUE; + } + for (i = 0; i < MAXDEVS; i++) { rw_enter(&sysmcache[i].dca_lock, RW_WRITER); if ((sysmcache[i].dca_flags & SYSM_ENABLED) && - sysmcache[i].dca_vp == NULL) { + sysmcache[i].dca_vp == NULL) { /* * 4196476 - FTRUNC was causing E10K to return EINVAL * on open @@ -413,7 +405,7 @@ sysmopen(dev_t *dev, int flag, int state, cred_t *cred) * Set NONBLOCK|NDELAY in case there's no carrier. */ if (vn_open(sysmcache[i].dca_name, UIO_SYSSPACE, - flag | FNONBLOCK | FNDELAY, 0, &vp, 0, 0) == 0) + flag | FNONBLOCK | FNDELAY, 0, &vp, 0, 0) == 0) sysmcache[i].dca_vp = vp; } rw_exit(&sysmcache[i].dca_lock); @@ -428,9 +420,15 @@ sysmclose(dev_t dev, int flag, int state, cred_t *cred) { int i; + ASSERT(dcvp != NULL); + if (state != OTYP_CHR) return (ENXIO); + (void) VOP_CLOSE(dcvp, FWRITE, 1, (offset_t)0, kcred); + VN_RELE(dcvp); + dcvp = NULL; + /* * Close the auxiliary consoles, we're not concerned with * passing up the errors. @@ -439,7 +437,7 @@ sysmclose(dev_t dev, int flag, int state, cred_t *cred) rw_enter(&sysmcache[i].dca_lock, RW_WRITER); if (sysmcache[i].dca_vp != NULL) { (void) VOP_CLOSE(sysmcache[i].dca_vp, flag, - 1, (offset_t)0, cred); + 1, (offset_t)0, cred); VN_RELE(sysmcache[i].dca_vp); sysmcache[i].dca_vp = NULL; } @@ -473,7 +471,7 @@ sysmwrite(dev_t dev, struct uio *uio, cred_t *cred) for (i = 0; i < MAXDEVS; i++) { rw_enter(&sysmcache[i].dca_lock, RW_READER); if (sysmcache[i].dca_vp != NULL && - (sysmcache[i].dca_flags & SYSM_ENABLED)) { + (sysmcache[i].dca_flags & SYSM_ENABLED)) { tuio = *uio; uio_iov = *(uio->uio_iov); tuio.uio_iov = &uio_iov; @@ -574,7 +572,7 @@ sysmioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred, int *rvalp) if (infop[0] != NULL) { if ((rval = lookupname(infop, UIO_SYSSPACE, FOLLOW, - NULLVPP, &vp)) == 0) { + NULLVPP, &vp)) == 0) { if (vp->v_type != VCHR) { VN_RELE(vp); rval = EINVAL; @@ -614,13 +612,13 @@ sysmioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred, int *rvalp) for (i = 0; i < MAXDEVS; i++) { rw_enter(&sysmcache[i].dca_lock, RW_WRITER); if (sysmcache[i].dca_devt == newdevt && - (sysmcache[i].dca_flags & SYSM_ENABLED)) { + (sysmcache[i].dca_flags & SYSM_ENABLED)) { (void) strcpy(sysmcache[i].dca_name, infop); rval = EEXIST; rw_exit(&sysmcache[i].dca_lock); break; } else if (sysmcache[i].dca_devt == newdevt && - sysmcache[i].dca_flags == SYSM_DISABLED) { + sysmcache[i].dca_flags == SYSM_DISABLED) { sysmcache[i].dca_flags |= SYSM_ENABLED; (void) strcpy(sysmcache[i].dca_name, infop); rw_exit(&sysmcache[i].dca_lock); @@ -628,7 +626,7 @@ sysmioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred, int *rvalp) break; } else if (sysmcache[i].dca_devt == 0) { ASSERT(sysmcache[i].dca_vp == NULL && - sysmcache[i].dca_flags == SYSM_DISABLED); + sysmcache[i].dca_flags == SYSM_DISABLED); (void) strcpy(sysmcache[i].dca_name, infop); sysmcache[i].dca_flags = SYSM_ENABLED; sysmcache[i].dca_devt = newdevt; @@ -682,32 +680,17 @@ static int checkarg(dev_t devt) { int rval = 0; - vnode_t *vp; + dev_t sysmsg_dev, msglog_dev; extern dev_t rwsconsdev, rconsdev, uconsdev; if (devt == rconsdev || devt == rwsconsdev || devt == uconsdev) { rval = EBUSY; - goto err_exit; - } - if ((rval = lookupname("/dev/sysmsg", UIO_SYSSPACE, FOLLOW, - NULLVPP, &vp)) == 0) { - if (devt == vp->v_rdev) { - VN_RELE(vp); - rval = EINVAL; - goto err_exit; - } - VN_RELE(vp); - } - if ((rval = lookupname("/dev/msglog", UIO_SYSSPACE, FOLLOW, - NULLVPP, &vp)) == 0) { - if (devt == vp->v_rdev) { - VN_RELE(vp); + } else { + sysmsg_dev = makedevice(ddi_driver_major(sysm_dip), SYS_SYSMIN); + msglog_dev = makedevice(ddi_driver_major(sysm_dip), SYS_MSGMIN); + if (devt == sysmsg_dev || devt == msglog_dev) rval = EINVAL; - goto err_exit; - } - VN_RELE(vp); } -err_exit: return (rval); } |