Commit a4674f34 authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller
Browse files

ionic: check for NULL structs on teardown



Make sure the queue structs exist before trying to tear
them down to make for safer error recovery.

Fixes: 0f3154e6 ("ionic: Add Tx and Rx handling")
Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b9c17d39
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -320,20 +320,22 @@ static void ionic_qcqs_free(struct ionic_lif *lif)
		lif->adminqcq = NULL;
	}

	if (lif->rxqcqs) {
		for (i = 0; i < lif->nxqs; i++)
			if (lif->rxqcqs[i].stats)
				devm_kfree(dev, lif->rxqcqs[i].stats);

		devm_kfree(dev, lif->rxqcqs);
		lif->rxqcqs = NULL;
	}

	if (lif->txqcqs) {
		for (i = 0; i < lif->nxqs; i++)
			if (lif->txqcqs[i].stats)
				devm_kfree(dev, lif->txqcqs[i].stats);

		devm_kfree(dev, lif->txqcqs);
		lif->txqcqs = NULL;
	}
}

static void ionic_link_qcq_interrupts(struct ionic_qcq *src_qcq,
				      struct ionic_qcq *n_qcq)
+6 −1
Original line number Diff line number Diff line
@@ -243,11 +243,16 @@ static void ionic_adminq_cb(struct ionic_queue *q,

static int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
{
	struct ionic_queue *adminq = &lif->adminqcq->q;
	struct ionic_queue *adminq;
	int err = 0;

	WARN_ON(in_interrupt());

	if (!lif->adminqcq)
		return -EIO;

	adminq = &lif->adminqcq->q;

	spin_lock(&lif->adminq_lock);
	if (!ionic_q_has_space(adminq, 1)) {
		err = -ENOSPC;