summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorYuri Pankov <yuri.pankov@nexenta.com>2016-07-24 23:56:01 +0300
committerRichard Lowe <richlowe@richlowe.net>2016-08-03 12:11:49 -0400
commit6bd8a07093bddc0edfc07bfda4ca600e31c02c03 (patch)
tree8412dad633cda06fb480f7d591de795f77fe715d /usr/src
parent9ca527c3d3dfa7c8f304b34a9e03b5eddace838f (diff)
downloadillumos-joyent-6bd8a07093bddc0edfc07bfda4ca600e31c02c03.tar.gz
7218 pvscsi`pvscsi_bus_config uses wrong base while configuring targets
7219 pvscsi panics while simultaneously deleting large number of disks Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com> Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/intel/io/scsi/adapters/pvscsi/pvscsi.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/usr/src/uts/intel/io/scsi/adapters/pvscsi/pvscsi.c b/usr/src/uts/intel/io/scsi/adapters/pvscsi/pvscsi.c
index d0a9db6736..edef3dd442 100644
--- a/usr/src/uts/intel/io/scsi/adapters/pvscsi/pvscsi.c
+++ b/usr/src/uts/intel/io/scsi/adapters/pvscsi/pvscsi.c
@@ -346,6 +346,8 @@ pvscsi_config_one(dev_info_t *pdip, pvscsi_softc_t *pvs, int target,
pvscsi_device_t *devnode;
struct scsi_inquiry inq;
+ ASSERT(DEVI_BUSY_OWNED(pdip));
+
/* Inquiry target */
inqrc = pvscsi_inquiry_target(pvs, target, &inq);
@@ -446,8 +448,10 @@ pvscsi_config_all(dev_info_t *pdip, pvscsi_softc_t *pvs)
{
int target;
- for (target = 0; target < PVSCSI_MAXTGTS; target++)
+ for (target = 0; target < PVSCSI_MAXTGTS; target++) {
+ /* ndi_devi_enter is done in pvscsi_bus_config */
(void) pvscsi_config_one(pdip, pvs, target, NULL);
+ }
return (NDI_SUCCESS);
}
@@ -550,9 +554,12 @@ static void
pvscsi_handle_msg(void *arg)
{
pvscsi_msg_t *msg = (pvscsi_msg_t *)arg;
+ dev_info_t *dip = msg->msg_pvs->dip;
+ int circ;
- (void) pvscsi_config_one(msg->msg_pvs->dip, msg->msg_pvs, msg->target,
- NULL);
+ ndi_devi_enter(dip, &circ);
+ (void) pvscsi_config_one(dip, msg->msg_pvs, msg->target, NULL);
+ ndi_devi_exit(dip, circ);
kmem_free(msg, sizeof (pvscsi_msg_t));
}
@@ -2280,7 +2287,7 @@ pvscsi_bus_config(dev_info_t *pdip, uint_t flags, ddi_bus_config_op_t op,
switch (op) {
case BUS_CONFIG_ONE:
if ((p = strrchr((char *)arg, '@')) != NULL &&
- ddi_strtol(p + 1, NULL, 10, &target) == 0)
+ ddi_strtol(p + 1, NULL, 16, &target) == 0)
ret = pvscsi_config_one(pdip, pvs, (int)target, childp);
break;
case BUS_CONFIG_DRIVER: