ive had no takers on testing. i cant see how raid and sas events will race in the current code, so i think the 1second sleep to avoid confusion is unecessary. i will put it in and deal with fallout if it comes up.
On Fri, Dec 24, 2010 at 11:44:52AM -0500, Kenneth R Westerback wrote: > On Fri, Dec 24, 2010 at 04:01:19PM +1000, David Gwynne wrote: > > hi guys, > > > > this makes mpii properly detach devices, which helps a lot if they > > have commands in flight. to relevant changes are: > > > > - call the activate(DVACT_DEACTIVATE) function against all the luns > > on the target that is going away. > > - issue the target reset BEFORE detaching the children devices. > > this is needed now tha the midlayer will sleep until all outstanding > > commands on a device come back from the adapter before calling the > > child devices attach routine. > > > > i have tested this on straight disks, but not on raid volumes. i > > need someone to test disk removal behind a raid set before i can > > commit it. > > > > assuming testing goes well, can i get oks too? > > > > dlg > > If testing goes well, ok k...@. Alas I don't have any to test. > > .... Ken > > > > > Index: mpii.c > > =================================================================== > > RCS file: /cvs/src/sys/dev/pci/mpii.c,v > > retrieving revision 1.35 > > diff -u -p -r1.35 mpii.c > > --- mpii.c 23 Aug 2010 00:53:36 -0000 1.35 > > +++ mpii.c 24 Dec 2010 05:46:34 -0000 > > @@ -3417,6 +3417,8 @@ mpii_event_sas(struct mpii_softc *sc, st > > mpii_remove_dev(sc, dev); > > if (sc->sc_scsibus) { > > SET(dev->flags, MPII_DF_DETACH); > > + scsi_activate(sc->sc_scsibus, dev->slot, -1, > > + DVACT_DEACTIVATE); > > if (scsi_task(mpii_event_defer, sc, > > dev, 0) != 0) > > printf("%s: unable to run device " > > @@ -3529,27 +3531,19 @@ mpii_event_defer(void *xsc, void *arg) > > struct mpii_softc *sc = xsc; > > struct mpii_device *dev = arg; > > > > - /* > > - * SAS and IR events are delivered separately, so it won't hurt > > - * to wait for a second. > > - */ > > - tsleep(sc, PRIBIO, "mpiipause", hz); > > - > > - if (!ISSET(dev->flags, MPII_DF_HIDDEN)) { > > - if (ISSET(dev->flags, MPII_DF_ATTACH)) > > - scsi_probe_target(sc->sc_scsibus, dev->slot); > > - else if (ISSET(dev->flags, MPII_DF_DETACH)) > > - scsi_detach_target(sc->sc_scsibus, dev->slot, > > - DETACH_FORCE); > > - } > > - > > if (ISSET(dev->flags, MPII_DF_DETACH)) { > > mpii_sas_remove_device(sc, dev->dev_handle); > > + if (!ISSET(dev->flags, MPII_DF_HIDDEN)) { > > + scsi_detach_target(sc->sc_scsibus, dev->slot, > > + DETACH_FORCE); > > + } > > free(dev, M_DEVBUF); > > - return; > > - } > > > > - CLR(dev->flags, MPII_DF_ATTACH); > > + } else if (ISSET(dev->flags, MPII_DF_ATTACH)) { > > + CLR(dev->flags, MPII_DF_ATTACH); > > + if (!ISSET(dev->flags, MPII_DF_HIDDEN)) > > + scsi_probe_target(sc->sc_scsibus, dev->slot); > > + } > > } > > > > void > > @@ -4547,9 +4541,12 @@ mpii_scsi_cmd_done(struct mpii_ccb *ccb) > > > > case MPII_IOCSTATUS_BUSY: > > case MPII_IOCSTATUS_INSUFFICIENT_RESOURCES: > > + xs->error = XS_BUSY; > > + break; > > + > > case MPII_IOCSTATUS_SCSI_IOC_TERMINATED: > > case MPII_IOCSTATUS_SCSI_TASK_TERMINATED: > > - xs->error = XS_BUSY; > > + xs->error = XS_RESET; > > break; > > > > case MPII_IOCSTATUS_SCSI_INVALID_DEVHANDLE: > > @@ -4559,6 +4556,7 @@ mpii_scsi_cmd_done(struct mpii_ccb *ccb) > > > > default: > > xs->error = XS_DRIVER_STUFFUP; > > + break; > > } > > > > if (sie->scsi_state & MPII_SCSIIO_ERR_STATE_AUTOSENSE_VALID)