diff options
author | mjacob <mjacob@FreeBSD.org> | 2000-12-29 19:06:32 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2000-12-29 19:06:32 +0000 |
commit | e2e4fb07d4a4a0b7052691d0f7bbbb27aa21e596 (patch) | |
tree | b285c0eaaa68aeade15d4c0f673c516b7fb84f96 /sys | |
parent | aa1051802050e4b3f8e101d6829c1b31e1e67226 (diff) | |
download | FreeBSD-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.c | 15 |
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); } } |