summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_qpair.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2013-03-26 22:06:05 +0000
committerjimharris <jimharris@FreeBSD.org>2013-03-26 22:06:05 +0000
commitff567ee3e1dfdf36fd8473b02ec9e68996b6c960 (patch)
treef17a8939153caa4225dc30bc748244cef677b925 /sys/dev/nvme/nvme_qpair.c
parent69d2e138016916537645300c0cd8509dc6ced0eb (diff)
downloadFreeBSD-src-ff567ee3e1dfdf36fd8473b02ec9e68996b6c960.zip
FreeBSD-src-ff567ee3e1dfdf36fd8473b02ec9e68996b6c960.tar.gz
Abort and do not retry any outstanding admin commands left over after
a controller reset. Sponsored by: Intel Reviewed by: carl
Diffstat (limited to 'sys/dev/nvme/nvme_qpair.c')
-rw-r--r--sys/dev/nvme/nvme_qpair.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index 8ac61b1..7b12774 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -594,6 +594,21 @@ nvme_qpair_reset(struct nvme_qpair *qpair)
void
nvme_admin_qpair_enable(struct nvme_qpair *qpair)
{
+ struct nvme_tracker *tr;
+ struct nvme_tracker *tr_temp;
+
+ /*
+ * Manually abort each outstanding admin command. Do not retry
+ * admin commands found here, since they will be left over from
+ * a controller reset and its likely the context in which the
+ * command was issued no longer applies.
+ */
+ TAILQ_FOREACH_SAFE(tr, &qpair->outstanding_tr, tailq, tr_temp) {
+ device_printf(qpair->ctrlr->dev,
+ "aborting outstanding admin command\n");
+ nvme_qpair_manual_complete_tracker(qpair, tr, NVME_SCT_GENERIC,
+ NVME_SC_ABORTED_BY_REQUEST, 1 /* do not retry */, TRUE);
+ }
nvme_qpair_enable(qpair);
}
OpenPOWER on IntegriCloud