summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>2000-12-29 19:06:32 +0000
committermjacob <mjacob@FreeBSD.org>2000-12-29 19:06:32 +0000
commite2e4fb07d4a4a0b7052691d0f7bbbb27aa21e596 (patch)
treeb285c0eaaa68aeade15d4c0f673c516b7fb84f96 /sys
parentaa1051802050e4b3f8e101d6829c1b31e1e67226 (diff)
downloadFreeBSD-src-e2e4fb07d4a4a0b7052691d0f7bbbb27aa21e596.zip
FreeBSD-src-e2e4fb07d4a4a0b7052691d0f7bbbb27aa21e596.tar.gz
Make sure we do locking if we call isp_intr.
Make sure we enter Giant for now if we call into cam for completion.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/isp/isp_freebsd.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index fdb814e..6cd6c75 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -1331,7 +1331,10 @@ isp_cam_async(void *cbarg, u_int32_t code, struct cam_path *path, void *arg)
static void
isp_poll(struct cam_sim *sim)
{
- isp_intr((struct ispsoftc *) cam_sim_softc(sim));
+ struct ispsoftc *isp = cam_sim_softc(sim);
+ ISP_LOCK(isp);
+ (void) isp_intr(isp);
+ ISP_UNLOCK(isp);
}
static void
@@ -1533,7 +1536,9 @@ isp_action(struct cam_sim *sim, union ccb *ccb)
xpt_done(ccb);
break;
case CMD_COMPLETE:
+ ISP_LOCK(isp);
isp_done((struct ccb_scsiio *) ccb);
+ ISP_UNLOCK(isp);
break;
default:
isp_prt(isp, ISP_LOGERR,
@@ -1982,7 +1987,15 @@ isp_done(struct ccb_scsiio *sccb)
"finished command on borrowed time");
}
XS_CMD_S_CLEAR(sccb);
+ ISP_UNLOCK(isp);
+#ifdef ISP_SMPLOCK
+ mtx_enter(&Giant, MTX_DEF);
xpt_done((union ccb *) sccb);
+ mtx_exit(&Giant, MTX_DEF);
+#else
+ xpt_done((union ccb *) sccb);
+#endif
+ ISP_LOCK(isp);
}
}
OpenPOWER on IntegriCloud