PERFORCE change 173254 for review
Alexander Motin
mav at FreeBSD.org
Sun Jan 17 10:03:35 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=173254
Change 173254 by mav at mav_mavtest on 2010/01/17 10:02:55
Delay boot while PMP scan completes.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#27 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#137 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#20 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_pmp.c#27 (text+ko) ====
@@ -303,9 +303,10 @@
if (code == AC_SCSI_AEN && softc->state != PMP_STATE_NORMAL &&
softc->state != PMP_STATE_SCAN)
break;
- if (softc->state != PMP_STATE_SCAN)
+ if (softc->state != PMP_STATE_SCAN) {
+ xpt_hold_boot();
pmpfreeze(periph, softc->found);
- else
+ } else
pmpfreeze(periph, softc->found & ~(1 << softc->pm_step));
if (code == AC_SENT_BDR || code == AC_BUS_RESET)
softc->found = 0; /* We have to reset everything. */
@@ -410,6 +411,7 @@
* the end of probe.
*/
(void)cam_periph_acquire(periph);
+ xpt_hold_boot();
xpt_schedule(periph, CAM_PRIORITY_DEV);
return(CAM_REQ_CMP);
@@ -759,7 +761,7 @@
done_ccb->ccb_h.func_code = XPT_SCAN_LUN;
done_ccb->ccb_h.cbfcnp = pmpdone;
done_ccb->crcn.flags = done_ccb->crcn.flags;
- xpt_action(done_ccb);
+ xpt_rescan_direct(done_ccb, 1);
pmprelease(periph, 1 << softc->pm_step);
return;
default:
@@ -769,6 +771,7 @@
xpt_release_ccb(done_ccb);
done1:
softc->state = PMP_STATE_NORMAL;
+ xpt_release_boot();
pmprelease(periph, -1);
cam_periph_release_locked(periph);
}
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#137 (text+ko) ====
@@ -812,21 +812,6 @@
xpt_rescan_done(struct cam_periph *periph, union ccb *done_ccb)
{
- xpt_lock_buses();
- xsoftc.buses_to_config--;
- if (xsoftc.buses_to_config == 0 && xsoftc.buses_config_done == 0) {
- struct xpt_task *task;
-
- xsoftc.buses_config_done = 1;
- xpt_unlock_buses();
- /* Call manually because we don't have any busses */
- task = malloc(sizeof(struct xpt_task), M_CAMXPT, M_NOWAIT);
- if (task != NULL) {
- TASK_INIT(&task->task, 0, xpt_finishconfig_task, task);
- taskqueue_enqueue(taskqueue_thread, &task->task);
- }
- } else
- xpt_unlock_buses();
if (done_ccb->ccb_h.ppriv_ptr1 == NULL) {
xpt_free_path(done_ccb->ccb_h.path);
xpt_free_ccb(done_ccb);
@@ -834,6 +819,7 @@
done_ccb->ccb_h.cbfcnp = done_ccb->ccb_h.ppriv_ptr1;
(*done_ccb->ccb_h.cbfcnp)(periph, done_ccb);
}
+ xpt_release_boot();
}
/* thread to handle bus rescans */
@@ -854,13 +840,6 @@
sim = ccb->ccb_h.path->bus->sim;
CAM_SIM_LOCK(sim);
- if( ccb->ccb_h.path->target->target_id == CAM_TARGET_WILDCARD )
- ccb->ccb_h.func_code = XPT_SCAN_BUS;
- else
- ccb->ccb_h.func_code = XPT_SCAN_LUN;
- ccb->ccb_h.ppriv_ptr1 = ccb->ccb_h.cbfcnp;
- ccb->ccb_h.cbfcnp = xpt_rescan_done;
- xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path, CAM_PRIORITY_XPT);
xpt_action(ccb);
CAM_SIM_UNLOCK(sim);
@@ -872,13 +851,32 @@
void
xpt_rescan(union ccb *ccb)
{
+
+ xpt_rescan_direct(ccb, 0);
+}
+
+void
+xpt_rescan_direct(union ccb *ccb, int direct)
+{
struct ccb_hdr *hdr;
- /*
- * Don't make duplicate entries for the same paths.
- */
+ /* Prepare request */
+ if(ccb->ccb_h.path->target->target_id == CAM_TARGET_WILDCARD)
+ ccb->ccb_h.func_code = XPT_SCAN_BUS;
+ else
+ ccb->ccb_h.func_code = XPT_SCAN_LUN;
+ ccb->ccb_h.ppriv_ptr1 = ccb->ccb_h.cbfcnp;
+ ccb->ccb_h.cbfcnp = xpt_rescan_done;
+ xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path, CAM_PRIORITY_XPT);
+ /* Execute directly if requested. */
+ if (direct) {
+ xpt_hold_boot();
+ xpt_action(ccb);
+ return;
+ }
+ /* Don't make duplicate entries for the same paths. */
xpt_lock_buses();
- if (ccb->ccb_h.cbfcnp == NULL) {
+ if (ccb->ccb_h.ppriv_ptr1 == NULL) {
TAILQ_FOREACH(hdr, &xsoftc.ccb_scanq, sim_links.tqe) {
if (xpt_path_comp(hdr->path, ccb->ccb_h.path) == 0) {
wakeup(&xsoftc.ccb_scanq);
@@ -4706,7 +4704,27 @@
#endif /* CAMDEBUG */
periphdriver_init(1);
+ xpt_hold_boot();
+ xpt_release_boot();
+ /* Fire up rescan thread. */
+ if (kproc_create(xpt_scanner_thread, NULL, NULL, 0, 0, "xpt_thrd")) {
+ printf("xpt_init: failed to create rescan thread\n");
+ }
+}
+
+void
+xpt_hold_boot(void)
+{
xpt_lock_buses();
+ xsoftc.buses_to_config++;
+ xpt_unlock_buses();
+}
+
+void
+xpt_release_boot(void)
+{
+ xpt_lock_buses();
+ xsoftc.buses_to_config--;
if (xsoftc.buses_to_config == 0 && xsoftc.buses_config_done == 0) {
struct xpt_task *task;
@@ -4718,13 +4736,8 @@
TASK_INIT(&task->task, 0, xpt_finishconfig_task, task);
taskqueue_enqueue(taskqueue_thread, &task->task);
}
- } else {
+ } else
xpt_unlock_buses();
- }
- /* Fire up rescan thread. */
- if (kproc_create(xpt_scanner_thread, NULL, NULL, 0, 0, "xpt_thrd")) {
- printf("xpt_init: failed to create rescan thread\n");
- }
}
/*
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#20 (text+ko) ====
@@ -114,7 +114,10 @@
struct cam_periph *xpt_path_periph(struct cam_path *path);
void xpt_async(u_int32_t async_code, struct cam_path *path,
void *async_arg);
+void xpt_rescan_direct(union ccb *ccb, int direct);
void xpt_rescan(union ccb *ccb);
+void xpt_hold_boot(void);
+void xpt_release_boot(void);
void xpt_lock_buses(void);
void xpt_unlock_buses(void);
cam_status xpt_register_async(int event, ac_callback_t *cbfunc,
More information about the p4-projects
mailing list