From: Chas Williams Date: Thu, 16 Oct 2003 18:11:19 +0000 (-0700) Subject: [ATM]: Remove vcc reference on outstanding SKBs X-Git-Tag: v2.6.0-test8~4^2~7 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=5b7854ddd8dbfde6da2a90645b835b73ff5e6860;p=history.git [ATM]: Remove vcc reference on outstanding SKBs --- diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c index 4fd82600163c..2473dc58e52a 100644 --- a/drivers/atm/nicstar.c +++ b/drivers/atm/nicstar.c @@ -1676,6 +1676,25 @@ static void ns_close(struct atm_vcc *vcc) free_scq(vc->scq, vcc); } + /* remove all references to vcc before deleting it */ + if (vcc->qos.txtp.traffic_class != ATM_NONE) + { + unsigned long flags; + scq_info *scq = card->scq0; + + ns_grab_scq_lock(card, scq, flags); + + for(i = 0; i < scq->num_entries; i++) { + if(scq->skb[i] && ATM_SKB(scq->skb[i])->vcc == vcc) { + ATM_SKB(scq->skb[i])->vcc = NULL; + atm_return(vcc, scq->skb[i]->truesize); + PRINTK("nicstar: deleted pending vcc mapping\n"); + } + } + + spin_unlock_irqrestore(&scq->lock, flags); + } + vcc->dev_data = NULL; clear_bit(ATM_VF_PARTIAL,&vcc->flags); clear_bit(ATM_VF_ADDR,&vcc->flags); @@ -2074,7 +2093,7 @@ static void drain_scq(ns_dev *card, scq_info *scq, int pos) if (skb != NULL) { vcc = ATM_SKB(skb)->vcc; - if (vcc->pop != NULL) { + if (vcc && vcc->pop != NULL) { vcc->pop(vcc, skb); } else { dev_kfree_skb_irq(skb);