diff options
author | gibbs <gibbs@FreeBSD.org> | 1999-05-25 20:17:29 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 1999-05-25 20:17:29 +0000 |
commit | 39762f08bd495f76c5ec17ce06e5bba73ebd7535 (patch) | |
tree | 3be8a4e03355c2cf9fa7f7c870aad2c364a5859a /sys/cam | |
parent | d80423807ab53ee4e194324aa2142b8255eaa227 (diff) | |
download | FreeBSD-src-39762f08bd495f76c5ec17ce06e5bba73ebd7535.zip FreeBSD-src-39762f08bd495f76c5ec17ce06e5bba73ebd7535.tar.gz |
Run xpt_action at splsoftcam() so that it cannot be re-entered by our SWI.
The XPT doesn't have a problem with this itself, but some controllers
drivers may have been caught off guard by the old behavior.
XPT_CONT_TARGET_IO is also a valid ccb type for cam_periph_unmapmem.
Diffstat (limited to 'sys/cam')
-rw-r--r-- | sys/cam/cam_periph.c | 4 | ||||
-rw-r--r-- | sys/cam/cam_xpt.c | 6 |
2 files changed, 7 insertions, 3 deletions
diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c index 4068c68..b14bea7 100644 --- a/sys/cam/cam_periph.c +++ b/sys/cam/cam_periph.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cam_periph.c,v 1.15 1999/05/23 18:57:29 gibbs Exp $ + * $Id: cam_periph.c,v 1.16 1999/05/25 17:10:04 ken Exp $ */ #include <sys/param.h> @@ -654,6 +654,7 @@ cam_periph_unmapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo) } break; case XPT_SCSI_IO: + case XPT_CONT_TARGET_IO: data_ptrs[0] = &ccb->csio.data_ptr; numbufs = min(mapinfo->num_bufs_used, 1); break; @@ -1114,7 +1115,6 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, status &= CAM_STATUS_MASK; relsim_flags = 0; - switch (status) { case CAM_REQ_CMP: /* decrement the number of retries */ diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index d053475..3fc748d 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cam_xpt.c,v 1.59 1999/05/22 21:58:47 gibbs Exp $ + * $Id: cam_xpt.c,v 1.60 1999/05/23 18:57:29 gibbs Exp $ */ #include <sys/param.h> #include <sys/systm.h> @@ -2718,10 +2718,13 @@ xptsetasyncbusfunc(struct cam_eb *bus, void *arg) void xpt_action(union ccb *start_ccb) { + int iopl; + CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_action\n")); start_ccb->ccb_h.status = CAM_REQ_INPROG; + iopl = splsoftcam(); switch (start_ccb->ccb_h.func_code) { case XPT_SCSI_IO: { @@ -3280,6 +3283,7 @@ xpt_action(union ccb *start_ccb) start_ccb->ccb_h.status = CAM_PROVIDE_FAIL; break; } + splx(iopl); } void |