summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-10-06 14:52:04 +0000
committermav <mav@FreeBSD.org>2014-10-06 14:52:04 +0000
commit90e45e872567394488b42e3824f966c49451bf4a (patch)
tree663727aaa6869815458a14e2bb61df20ccd19008
parent5061170980eb8679d5bbc506c153b9bfeff941f6 (diff)
downloadFreeBSD-src-90e45e872567394488b42e3824f966c49451bf4a.zip
FreeBSD-src-90e45e872567394488b42e3824f966c49451bf4a.tar.gz
Set CAM_SIM_QUEUED flag before calling ctl_queue() to avoid race.
PR: 194128 Submitted by: Scott M. Ferris <smferris@gmail.com> MFC after: 3 days Sponsored by: EMC/Isilon Storage Division
-rw-r--r--sys/cam/ctl/ctl_frontend_cam_sim.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/cam/ctl/ctl_frontend_cam_sim.c b/sys/cam/ctl/ctl_frontend_cam_sim.c
index 72f8dd8..7cdd5b7 100644
--- a/sys/cam/ctl/ctl_frontend_cam_sim.c
+++ b/sys/cam/ctl/ctl_frontend_cam_sim.c
@@ -609,14 +609,16 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb)
bcopy(csio->cdb_io.cdb_bytes, io->scsiio.cdb,
io->scsiio.cdb_len);
+ ccb->ccb_h.status |= CAM_SIM_QUEUED;
err = ctl_queue(io);
if (err != CTL_RETVAL_COMPLETE) {
printf("%s: func %d: error %d returned by "
"ctl_queue()!\n", __func__,
ccb->ccb_h.func_code, err);
ctl_free_io(io);
- } else {
- ccb->ccb_h.status |= CAM_SIM_QUEUED;
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ xpt_done(ccb);
+ return;
}
break;
}
OpenPOWER on IntegriCloud