diff options
author | mav <mav@FreeBSD.org> | 2015-01-30 09:05:43 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2015-01-30 09:05:43 +0000 |
commit | 0a6db6b09eaecbd84ff23691f42dc39563edb5d7 (patch) | |
tree | 0812fff45fb2f24dff02c59489bb996cd94d866d | |
parent | aba44db36efae3127a94fb0a0d3dad03fdd1d29c (diff) | |
download | FreeBSD-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.c | 5 |
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 |