diff options
author | mav <mav@FreeBSD.org> | 2014-10-09 05:28:11 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2014-10-09 05:28:11 +0000 |
commit | 70056e5be98d58f5fe68ccf5cfe4b394f5709ae5 (patch) | |
tree | 65fa333f9992044330ceb84d01bd405e7e9e4950 | |
parent | 142c06446733cb14eb874687d9867f69af201fba (diff) | |
download | FreeBSD-src-70056e5be98d58f5fe68ccf5cfe4b394f5709ae5.zip FreeBSD-src-70056e5be98d58f5fe68ccf5cfe4b394f5709ae5.tar.gz |
MFC r272650: Set CAM_SIM_QUEUED flag before calling ctl_queue() to avoid race.
PR: 194128
Submitted by: Scott M. Ferris <smferris@gmail.com>
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; } |