diff options
author | mav <mav@FreeBSD.org> | 2014-10-06 14:52:04 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2014-10-06 14:52:04 +0000 |
commit | 90e45e872567394488b42e3824f966c49451bf4a (patch) | |
tree | 663727aaa6869815458a14e2bb61df20ccd19008 | |
parent | 5061170980eb8679d5bbc506c153b9bfeff941f6 (diff) | |
download | FreeBSD-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.c | 6 |
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; } |