summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/sysmsg.c
diff options
context:
space:
mode:
authorfl147353 <none@none>2005-10-23 22:22:13 -0700
committerfl147353 <none@none>2005-10-23 22:22:13 -0700
commit83d132f8483f0e2ef2deb45970be251f34b6ee82 (patch)
treea939f20dd56c737dcf5c03fff41dcb09682d8dcd /usr/src/uts/common/io/sysmsg.c
parentff550d0e264b51131fb34e9e83163b348d916640 (diff)
downloadillumos-joyent-83d132f8483f0e2ef2deb45970be251f34b6ee82.tar.gz
6305939 configuring consadm panics system on boot
Diffstat (limited to 'usr/src/uts/common/io/sysmsg.c')
-rw-r--r--usr/src/uts/common/io/sysmsg.c111
1 files changed, 58 insertions, 53 deletions
diff --git a/usr/src/uts/common/io/sysmsg.c b/usr/src/uts/common/io/sysmsg.c
index 085e27e4f2..e91648b722 100644
--- a/usr/src/uts/common/io/sysmsg.c
+++ b/usr/src/uts/common/io/sysmsg.c
@@ -145,6 +145,8 @@ typedef struct {
static devicecache_t sysmcache[MAXDEVS];
static kmutex_t dcvp_mutex;
static vnode_t *dcvp = NULL;
+static boolean_t sysmsg_opened;
+static boolean_t msglog_opened;
/* flags for device cache */
#define SYSM_DISABLED 0x0
@@ -197,9 +199,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 +210,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 +229,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 +257,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 +313,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 +341,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 +369,7 @@ sysmopen(dev_t *dev, int flag, int state, cred_t *cred)
int i;
vnode_t *vp;
minor_t instance;
+ static boolean_t initialized;
instance = getminor(*dev);
@@ -389,16 +378,26 @@ 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);
}
+
+ if (instance == SYS_SYSMIN)
+ sysmsg_opened = B_TRUE;
+ else
+ msglog_opened = B_TRUE;
+
+ if (!initialized) {
+ bind_consadm_conf("/etc/consadm.conf");
+ initialized = B_TRUE;
+ }
mutex_exit(&dcvp_mutex);
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 +412,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);
@@ -427,10 +426,31 @@ static int
sysmclose(dev_t dev, int flag, int state, cred_t *cred)
{
int i;
+ minor_t instance;
+
+ ASSERT(dcvp != NULL);
if (state != OTYP_CHR)
return (ENXIO);
+ instance = getminor(dev);
+
+ mutex_enter(&dcvp_mutex);
+ if (instance == SYS_SYSMIN)
+ sysmsg_opened = B_FALSE;
+ else
+ msglog_opened = B_FALSE;
+
+ if (sysmsg_opened || msglog_opened) {
+ mutex_exit(&dcvp_mutex);
+ return (0);
+ }
+
+ (void) VOP_CLOSE(dcvp, FWRITE, 1, (offset_t)0, kcred);
+ VN_RELE(dcvp);
+ dcvp = NULL;
+ mutex_exit(&dcvp_mutex);
+
/*
* Close the auxiliary consoles, we're not concerned with
* passing up the errors.
@@ -439,7 +459,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 +493,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 +594,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 +634,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 +648,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 +702,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);
+ } 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);
- }
- 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);
}