svn commit: r314739 - stable/10/sys/cam/ctl
Alexander Motin
mav at FreeBSD.org
Mon Mar 6 06:26:04 UTC 2017
Author: mav
Date: Mon Mar 6 06:26:02 2017
New Revision: 314739
URL: https://svnweb.freebsd.org/changeset/base/314739
Log:
MFC r314196: Unify ATIO/INOT CCBs requeuing.
Modified:
stable/10/sys/cam/ctl/scsi_ctl.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/cam/ctl/scsi_ctl.c
==============================================================================
--- stable/10/sys/cam/ctl/scsi_ctl.c Mon Mar 6 06:25:33 2017 (r314738)
+++ stable/10/sys/cam/ctl/scsi_ctl.c Mon Mar 6 06:26:02 2017 (r314739)
@@ -210,6 +210,10 @@ static void ctlfe_dump_queue(struct ctl
static void ctlfe_datamove(union ctl_io *io);
static void ctlfe_done(union ctl_io *io);
static void ctlfe_dump(void);
+static void ctlfe_free_ccb(struct cam_periph *periph,
+ union ccb *ccb);
+static void ctlfe_requeue_ccb(struct cam_periph *periph,
+ union ccb *ccb, int unlock);
static struct periph_driver ctlfe_driver =
{
@@ -808,6 +812,7 @@ ctlfestart(struct cam_periph *periph, un
softc = (struct ctlfe_lun_softc *)periph->softc;
softc->ccbs_alloced++;
+next:
ccb_h = TAILQ_FIRST(&softc->work_queue);
if (ccb_h == NULL) {
softc->ccbs_freed++;
@@ -851,26 +856,12 @@ ctlfestart(struct cam_periph *periph, un
start_ccb->ccb_h.func_code = XPT_ABORT;
start_ccb->cab.abort_ccb = (union ccb *)atio;
xpt_action(start_ccb);
- softc->ccbs_freed++;
- xpt_release_ccb(start_ccb);
- /*
- * Send the ATIO back down to the SIM.
- * For a wildcard attachment, commands can come in
- * with a specific target/lun. Reset the target and
- * LUN fields back to the wildcard values before we
- * send them back down to the SIM.
- */
- if (softc->flags & CTLFE_LUN_WILDCARD) {
- atio->ccb_h.target_id = CAM_TARGET_WILDCARD;
- atio->ccb_h.target_lun = CAM_LUN_WILDCARD;
- }
- xpt_action((union ccb *)atio);
+ ctlfe_requeue_ccb(periph, (union ccb *)atio,
+ /* unlock */0);
- /* If we still have work to do, ask for another CCB. */
- if (!TAILQ_EMPTY(&softc->work_queue))
- xpt_schedule(periph, /*priority*/ 1);
- return;
+ /* XPT_ABORT is not queued, so we can take next I/O. */
+ goto next;
}
data_ptr = NULL;
dxfer_len = 0;
@@ -1003,6 +994,37 @@ ctlfe_free_ccb(struct cam_periph *periph
}
}
+/*
+ * Send the ATIO/INOT back to the SIM, or free it if periph was invalidated.
+ */
+static void
+ctlfe_requeue_ccb(struct cam_periph *periph, union ccb *ccb, int unlock)
+{
+ struct ctlfe_lun_softc *softc;
+
+ if (periph->flags & CAM_PERIPH_INVALID) {
+ ctlfe_free_ccb(periph, ccb);
+ if (unlock)
+ cam_periph_unlock(periph);
+ return;
+ }
+ if (unlock)
+ cam_periph_unlock(periph);
+
+ /*
+ * For a wildcard attachment, commands can come in with a specific
+ * target/lun. Reset the target and LUN fields back to the wildcard
+ * values before we send them back down to the SIM.
+ */
+ softc = (struct ctlfe_lun_softc *)periph->softc;
+ if (softc->flags & CTLFE_LUN_WILDCARD) {
+ ccb->ccb_h.target_id = CAM_TARGET_WILDCARD;
+ ccb->ccb_h.target_lun = CAM_LUN_WILDCARD;
+ }
+
+ xpt_action(ccb);
+}
+
static int
ctlfe_adjust_cdb(struct ccb_accept_tio *atio, uint32_t offset)
{
@@ -1266,25 +1288,9 @@ ctlfedone(struct cam_periph *periph, uni
if ((io->io_hdr.flags & CTL_FLAG_DMA_INPROG) == 0) {
softc->ccbs_freed++;
xpt_release_ccb(done_ccb);
- /*
- * For a wildcard attachment, commands can come in
- * with a specific target/lun. Reset the target
- * and LUN fields back to the wildcard values before
- * we send them back down to the SIM. The SIM has
- * a wildcard LUN enabled, not whatever target/lun
- * these happened to be.
- */
- if (softc->flags & CTLFE_LUN_WILDCARD) {
- atio->ccb_h.target_id = CAM_TARGET_WILDCARD;
- atio->ccb_h.target_lun = CAM_LUN_WILDCARD;
- }
- if (periph->flags & CAM_PERIPH_INVALID) {
- ctlfe_free_ccb(periph, (union ccb *)atio);
- } else {
- mtx_unlock(mtx);
- xpt_action((union ccb *)atio);
- return;
- }
+ ctlfe_requeue_ccb(periph, (union ccb *)atio,
+ /* unlock */1);
+ return;
} else {
struct ctlfe_cmd_info *cmd_info;
struct ccb_scsiio *csio;
@@ -1489,18 +1495,11 @@ ctlfedone(struct cam_periph *periph, uni
break;
}
case XPT_NOTIFY_ACKNOWLEDGE:
- if (periph->flags & CAM_PERIPH_INVALID) {
- ctlfe_free_ccb(periph, done_ccb);
- goto out;
- }
-
- /*
- * Queue this back down to the SIM as an immediate notify.
- */
+ /* Queue this back down to the SIM as an immediate notify. */
done_ccb->ccb_h.status = CAM_REQ_INPROG;
done_ccb->ccb_h.func_code = XPT_IMMEDIATE_NOTIFY;
- xpt_action(done_ccb);
- break;
+ ctlfe_requeue_ccb(periph, done_ccb, /* unlock */1);
+ return;
case XPT_SET_SIM_KNOB:
case XPT_GET_SIM_KNOB:
break;
@@ -2003,17 +2002,8 @@ ctlfe_done(union ctl_io *io)
ccb->cna2.arg |= scsi_3btoul(io->taskio.task_resp) << 8;
xpt_action(ccb);
} else if (io->io_hdr.flags & CTL_FLAG_STATUS_SENT) {
- if (softc->flags & CTLFE_LUN_WILDCARD) {
- ccb->ccb_h.target_id = CAM_TARGET_WILDCARD;
- ccb->ccb_h.target_lun = CAM_LUN_WILDCARD;
- }
- if (periph->flags & CAM_PERIPH_INVALID) {
- ctlfe_free_ccb(periph, ccb);
- } else {
- cam_periph_unlock(periph);
- xpt_action(ccb);
- return;
- }
+ ctlfe_requeue_ccb(periph, ccb, /* unlock */1);
+ return;
} else {
io->io_hdr.flags |= CTL_FLAG_STATUS_QUEUED;
TAILQ_INSERT_TAIL(&softc->work_queue, &ccb->ccb_h,
More information about the svn-src-all
mailing list