summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorad <ad@NetBSD.org>2003-12-09 19:51:23 +0000
committerad <ad@NetBSD.org>2003-12-09 19:51:23 +0000
commit243b868f659aba45e5c46416d08d75844752e98c (patch)
tree22ee7b1f74f8cda9828d0be191596d3adf85a883 /sys/dev
parentaf683670116cea38e2799004a35b3ad22189eef4 (diff)
Grab the configuration lock when handling I2ORESCANCMD.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/i2o/dpti.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/sys/dev/i2o/dpti.c b/sys/dev/i2o/dpti.c
index 0d96da2e87a..0cdd9c5e22c 100644
--- a/sys/dev/i2o/dpti.c
+++ b/sys/dev/i2o/dpti.c
@@ -1,4 +1,4 @@
-/* $NetBSD: dpti.c,v 1.16 2003/10/30 01:58:17 simonb Exp $ */
+/* $NetBSD: dpti.c,v 1.17 2003/12/09 19:51:23 ad Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dpti.c,v 1.16 2003/10/30 01:58:17 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dpti.c,v 1.17 2003/12/09 19:51:23 ad Exp $");
#include "opt_i2o.h"
@@ -226,6 +226,7 @@ dptiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
sc = device_lookup(&dpti_cd, minor(dev));
iop = (struct iop_softc *)sc->sc_dv.dv_parent;
+ rv = 0;
if (cmd == PTIOCLINUX) {
pt = (struct ioctl_pt *)data;
@@ -244,30 +245,35 @@ dptiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
if (size > sizeof(dpti_sig))
size = sizeof(dpti_sig);
memcpy(data, &dpti_sig, size);
- return (0);
+ break;
case DPT_CTRLINFO:
- return (dpti_ctlrinfo(sc, size, data));
+ rv = dpti_ctlrinfo(sc, size, data);
+ break;
case DPT_SYSINFO:
- return (dpti_sysinfo(sc, size, data));
+ rv = dpti_sysinfo(sc, size, data);
+ break;
case DPT_BLINKLED:
if ((i = dpti_blinkled(sc)) == -1)
i = 0;
- if (size == 0)
- return (copyout(&i, *(caddr_t *)data, sizeof(i)));
+ if (size == 0) {
+ rv = copyout(&i, *(caddr_t *)data, sizeof(i));
+ break;
+ }
*(int *)data = i;
- return (0);
+ break;
case DPT_TARGET_BUSY:
/*
* XXX This is here to stop linux_machdepioctl() from
* whining about an unknown ioctl.
*/
- return (EIO);
+ rv = EIO;
+ break;
case DPT_I2OUSRCMD:
if (sc->sc_nactive++ >= 2)
@@ -280,19 +286,27 @@ dptiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
sc->sc_nactive--;
wakeup_one(&sc->sc_nactive);
- return (rv);
+ break;
case DPT_I2ORESETCMD:
printf("%s: I2ORESETCMD not implemented\n",
sc->sc_dv.dv_xname);
- return (EOPNOTSUPP);
+ rv = EOPNOTSUPP;
+ break;
case DPT_I2ORESCANCMD:
- return (iop_reconfigure(iop, 0));
+ if ((rv = lockmgr(&iop->sc_conflock, LK_EXCLUSIVE, NULL)) != 0)
+ break;
+ rv = iop_reconfigure(iop, 0);
+ lockmgr(&iop->sc_conflock, LK_RELEASE, NULL);
+ break;
default:
- return (ENOTTY);
+ rv = ENOTTY;
+ break;
}
+
+ return (rv);
}
int