ionic: check for NULL structs on teardown
authorShannon Nelson <snelson@pensando.io>
Fri, 20 Mar 2020 02:31:53 +0000 (19:31 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 22 Mar 2020 02:56:04 +0000 (19:56 -0700)
Make sure the queue structs exist before trying to tear
them down to make for safer error recovery.

Fixes: 0f3154e6bcb3 ("ionic: Add Tx and Rx handling")
Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_lif.c
drivers/net/ethernet/pensando/ionic/ionic_main.c

index 490f79c..8b442eb 100644 (file)
@@ -320,19 +320,21 @@ static void ionic_qcqs_free(struct ionic_lif *lif)
                lif->adminqcq = NULL;
        }
 
-       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;
-
-       for (i = 0; i < lif->nxqs; i++)
-               if (lif->txqcqs[i].stats)
-                       devm_kfree(dev, lif->txqcqs[i].stats);
+       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;
+       }
 
-       devm_kfree(dev, lif->txqcqs);
-       lif->txqcqs = 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,
index a0dc100..c16dbbe 100644 (file)
@@ -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;