summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-01-30 09:05:43 +0000
committermav <mav@FreeBSD.org>2015-01-30 09:05:43 +0000
commit0a6db6b09eaecbd84ff23691f42dc39563edb5d7 (patch)
tree0812fff45fb2f24dff02c59489bb996cd94d866d
parentaba44db36efae3127a94fb0a0d3dad03fdd1d29c (diff)
downloadFreeBSD-src-0a6db6b09eaecbd84ff23691f42dc39563edb5d7.zip
FreeBSD-src-0a6db6b09eaecbd84ff23691f42dc39563edb5d7.tar.gz
MFC r277247: Don't count status as sent until CTIO completes successfully.
If we aggregated status sending with data move and got error, allow status to be updated and resent again separately. Without this command may stuck without status sent at all.
-rw-r--r--sys/cam/ctl/scsi_ctl.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/cam/ctl/scsi_ctl.c b/sys/cam/ctl/scsi_ctl.c
index b1dba8c..ba59550 100644
--- a/sys/cam/ctl/scsi_ctl.c
+++ b/sys/cam/ctl/scsi_ctl.c
@@ -891,7 +891,6 @@ ctlfestart(struct cam_periph *periph, union ccb *start_ccb)
(cmd_info->flags & CTLFE_CMD_PIECEWISE) == 0 &&
((io->io_hdr.flags & CTL_FLAG_DMA_QUEUED) == 0 ||
io->io_hdr.status == CTL_SUCCESS)) {
- io->io_hdr.flags |= CTL_FLAG_STATUS_SENT;
flags |= CAM_SEND_STATUS;
scsi_status = io->scsiio.scsi_status;
csio->sense_len = io->scsiio.sense_len;
@@ -1265,6 +1264,10 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
break;
}
+ if ((done_ccb->ccb_h.flags & CAM_SEND_STATUS) &&
+ (done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP)
+ io->io_hdr.flags |= CTL_FLAG_STATUS_SENT;
+
/*
* If we were sending status back to the initiator, free up
* resources. If we were doing a datamove, call the
OpenPOWER on IntegriCloud