diff options
author | dduvall <none@none> | 2005-09-29 19:45:30 -0700 |
---|---|---|
committer | dduvall <none@none> | 2005-09-29 19:45:30 -0700 |
commit | c5be2cb066a6f1b57e2f6197a5ba6120ceec5c98 (patch) | |
tree | 8e58b74d47a286e4484f8efdc76e73a9b1c6e08f /usr/src/uts/common/io/sysmsg.c | |
parent | 69cd775ffd53de411433f1f43de2b4f644793528 (diff) | |
download | illumos-joyent-c5be2cb066a6f1b57e2f6197a5ba6120ceec5c98.tar.gz |
backout 6305939: causes panics in PIT
Diffstat (limited to 'usr/src/uts/common/io/sysmsg.c')
-rw-r--r-- | usr/src/uts/common/io/sysmsg.c | 89 |
1 files changed, 53 insertions, 36 deletions
diff --git a/usr/src/uts/common/io/sysmsg.c b/usr/src/uts/common/io/sysmsg.c index 3f12dde131..085e27e4f2 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,6 +208,8 @@ 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: @@ -227,8 +229,20 @@ sysm_detach(dev_info_t *devi, ddi_detach_cmd_t cmd) case DDI_DETACH: ASSERT(sysm_dip == devi); - for (i = 0; i < MAXDEVS; i++) + 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; rw_destroy(&sysmcache[i].dca_lock); + } ddi_remove_minor_node(devi, NULL); sysm_dip = NULL; @@ -255,7 +269,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; } @@ -311,8 +325,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: @@ -339,16 +353,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 @@ -367,7 +381,6 @@ 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); @@ -376,21 +389,16 @@ 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 @@ -405,7 +413,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); @@ -420,15 +428,9 @@ 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. @@ -437,7 +439,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; } @@ -471,7 +473,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; @@ -572,7 +574,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; @@ -612,13 +614,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); @@ -626,7 +628,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; @@ -680,17 +682,32 @@ static int checkarg(dev_t devt) { int rval = 0; - dev_t sysmsg_dev, msglog_dev; + vnode_t *vp; extern dev_t rwsconsdev, rconsdev, uconsdev; if (devt == rconsdev || devt == rwsconsdev || devt == uconsdev) { rval = EBUSY; - } 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) + 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); rval = EINVAL; + goto err_exit; + } + VN_RELE(vp); } +err_exit: return (rval); } |