PERFORCE change 173359 for review
Alexander Motin
mav at FreeBSD.org
Tue Jan 19 11:29:14 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=173359
Change 173359 by mav at mav_mavtest on 2010/01/19 11:28:57
Make aprobe restart on new probe request ASAP.
It allows to avoid duplicate probes.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#72 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#72 (text+ko) ====
@@ -130,6 +130,7 @@
u_int8_t digest[16];
uint32_t pm_pid;
uint32_t pm_prv;
+ int restart;
struct cam_periph *periph;
} probe_softc;
@@ -243,17 +244,12 @@
static void
probeschedule(struct cam_periph *periph)
{
- struct ccb_pathinq cpi;
union ccb *ccb;
probe_softc *softc;
softc = (probe_softc *)periph->softc;
ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs);
- xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NONE);
- cpi.ccb_h.func_code = XPT_PATH_INQ;
- xpt_action((union ccb *)&cpi);
-
if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) ||
periph->path->device->protocol == PROTO_SATAPM)
PROBE_SET_ACTION(softc, PROBE_RESET);
@@ -286,6 +282,14 @@
csio = &start_ccb->csio;
ident_buf = &periph->path->device->ident_data;
+ if (softc->restart) {
+ softc->restart = 0;
+ if ((path->device->flags & CAM_DEV_UNCONFIGURED) ||
+ path->device->protocol == PROTO_SATAPM)
+ softc->action = PROBE_RESET;
+ else
+ softc->action = PROBE_IDENTIFY;
+ }
switch (softc->action) {
case PROBE_RESET:
cam_fill_ataio(ataio,
@@ -953,19 +957,23 @@
break;
}
done:
+ if (softc->restart) {
+ softc->restart = 0;
+ xpt_release_ccb(done_ccb);
+ probeschedule(periph);
+ return;
+ }
xpt_release_ccb(done_ccb);
- done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs);
- TAILQ_REMOVE(&softc->request_ccbs, &done_ccb->ccb_h, periph_links.tqe);
- done_ccb->ccb_h.status = found ? CAM_REQ_CMP : CAM_REQ_CMP_ERR;
- xpt_done(done_ccb);
- if (TAILQ_FIRST(&softc->request_ccbs) == NULL) {
- cam_release_devq(periph->path,
- RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_XPT + 1, FALSE);
- cam_periph_invalidate(periph);
- cam_periph_release_locked(periph);
- } else {
- probeschedule(periph);
+ while ((done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs))) {
+ TAILQ_REMOVE(&softc->request_ccbs,
+ &done_ccb->ccb_h, periph_links.tqe);
+ done_ccb->ccb_h.status = found ? CAM_REQ_CMP : CAM_REQ_CMP_ERR;
+ xpt_done(done_ccb);
}
+ cam_release_devq(periph->path,
+ RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_XPT + 1, FALSE);
+ cam_periph_invalidate(periph);
+ cam_periph_release_locked(periph);
}
static void
@@ -1210,6 +1218,7 @@
softc = (probe_softc *)old_periph->softc;
TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->ccb_h,
periph_links.tqe);
+ softc->restart = 1;
} else {
status = cam_periph_alloc(proberegister, NULL, probecleanup,
probestart, "aprobe",
More information about the p4-projects
mailing list