Commit ff31ab56 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

net-sched: change tcf_destroy_chain() to clear start of filter list

Pass double tcf_proto pointers to tcf_destroy_chain() to make it
clear the start of the filter list for more consistency.
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 77a538d5
...@@ -178,7 +178,7 @@ extern struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops); ...@@ -178,7 +178,7 @@ extern struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops);
extern struct Qdisc *qdisc_create_dflt(struct net_device *dev, extern struct Qdisc *qdisc_create_dflt(struct net_device *dev,
struct Qdisc_ops *ops, u32 parentid); struct Qdisc_ops *ops, u32 parentid);
extern void tcf_destroy(struct tcf_proto *tp); extern void tcf_destroy(struct tcf_proto *tp);
extern void tcf_destroy_chain(struct tcf_proto *fl); extern void tcf_destroy_chain(struct tcf_proto **fl);
static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch,
struct sk_buff_head *list) struct sk_buff_head *list)
......
...@@ -323,8 +323,7 @@ static void wme_qdiscop_destroy(struct Qdisc* qd) ...@@ -323,8 +323,7 @@ static void wme_qdiscop_destroy(struct Qdisc* qd)
struct ieee80211_hw *hw = &local->hw; struct ieee80211_hw *hw = &local->hw;
int queue; int queue;
tcf_destroy_chain(q->filter_list); tcf_destroy_chain(&q->filter_list);
q->filter_list = NULL;
for (queue=0; queue < hw->queues; queue++) { for (queue=0; queue < hw->queues; queue++) {
skb_queue_purge(&q->requeued[queue]); skb_queue_purge(&q->requeued[queue]);
......
...@@ -1252,12 +1252,12 @@ void tcf_destroy(struct tcf_proto *tp) ...@@ -1252,12 +1252,12 @@ void tcf_destroy(struct tcf_proto *tp)
kfree(tp); kfree(tp);
} }
void tcf_destroy_chain(struct tcf_proto *fl) void tcf_destroy_chain(struct tcf_proto **fl)
{ {
struct tcf_proto *tp; struct tcf_proto *tp;
while ((tp = fl) != NULL) { while ((tp = *fl) != NULL) {
fl = tp->next; *fl = tp->next;
tcf_destroy(tp); tcf_destroy(tp);
} }
} }
......
...@@ -160,7 +160,7 @@ static void atm_tc_put(struct Qdisc *sch, unsigned long cl) ...@@ -160,7 +160,7 @@ static void atm_tc_put(struct Qdisc *sch, unsigned long cl)
*prev = flow->next; *prev = flow->next;
pr_debug("atm_tc_put: qdisc %p\n", flow->q); pr_debug("atm_tc_put: qdisc %p\n", flow->q);
qdisc_destroy(flow->q); qdisc_destroy(flow->q);
tcf_destroy_chain(flow->filter_list); tcf_destroy_chain(&flow->filter_list);
if (flow->sock) { if (flow->sock) {
pr_debug("atm_tc_put: f_count %d\n", pr_debug("atm_tc_put: f_count %d\n",
file_count(flow->sock->file)); file_count(flow->sock->file));
...@@ -588,8 +588,7 @@ static void atm_tc_destroy(struct Qdisc *sch) ...@@ -588,8 +588,7 @@ static void atm_tc_destroy(struct Qdisc *sch)
pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p);
/* races ? */ /* races ? */
while ((flow = p->flows)) { while ((flow = p->flows)) {
tcf_destroy_chain(flow->filter_list); tcf_destroy_chain(&flow->filter_list);
flow->filter_list = NULL;
if (flow->ref > 1) if (flow->ref > 1)
printk(KERN_ERR "atm_destroy: %p->ref = %d\n", flow, printk(KERN_ERR "atm_destroy: %p->ref = %d\n", flow,
flow->ref); flow->ref);
......
...@@ -1704,7 +1704,7 @@ static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl) ...@@ -1704,7 +1704,7 @@ static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl)
BUG_TRAP(!cl->filters); BUG_TRAP(!cl->filters);
tcf_destroy_chain(cl->filter_list); tcf_destroy_chain(&cl->filter_list);
qdisc_destroy(cl->q); qdisc_destroy(cl->q);
qdisc_put_rtab(cl->R_tab); qdisc_put_rtab(cl->R_tab);
gen_kill_estimator(&cl->bstats, &cl->rate_est); gen_kill_estimator(&cl->bstats, &cl->rate_est);
...@@ -1728,10 +1728,8 @@ cbq_destroy(struct Qdisc* sch) ...@@ -1728,10 +1728,8 @@ cbq_destroy(struct Qdisc* sch)
* be bound to classes which have been destroyed already. --TGR '04 * be bound to classes which have been destroyed already. --TGR '04
*/ */
for (h = 0; h < 16; h++) { for (h = 0; h < 16; h++) {
for (cl = q->classes[h]; cl; cl = cl->next) { for (cl = q->classes[h]; cl; cl = cl->next)
tcf_destroy_chain(cl->filter_list); tcf_destroy_chain(&cl->filter_list);
cl->filter_list = NULL;
}
} }
for (h = 0; h < 16; h++) { for (h = 0; h < 16; h++) {
struct cbq_class *next; struct cbq_class *next;
......
...@@ -416,7 +416,7 @@ static void dsmark_destroy(struct Qdisc *sch) ...@@ -416,7 +416,7 @@ static void dsmark_destroy(struct Qdisc *sch)
pr_debug("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p); pr_debug("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p);
tcf_destroy_chain(p->filter_list); tcf_destroy_chain(&p->filter_list);
qdisc_destroy(p->q); qdisc_destroy(p->q);
kfree(p->mask); kfree(p->mask);
} }
......
...@@ -1123,7 +1123,7 @@ hfsc_destroy_class(struct Qdisc *sch, struct hfsc_class *cl) ...@@ -1123,7 +1123,7 @@ hfsc_destroy_class(struct Qdisc *sch, struct hfsc_class *cl)
{ {
struct hfsc_sched *q = qdisc_priv(sch); struct hfsc_sched *q = qdisc_priv(sch);
tcf_destroy_chain(cl->filter_list); tcf_destroy_chain(&cl->filter_list);
qdisc_destroy(cl->qdisc); qdisc_destroy(cl->qdisc);
gen_kill_estimator(&cl->bstats, &cl->rate_est); gen_kill_estimator(&cl->bstats, &cl->rate_est);
if (cl != &q->root) if (cl != &q->root)
......
...@@ -1238,7 +1238,7 @@ static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl) ...@@ -1238,7 +1238,7 @@ static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl)
qdisc_put_rtab(cl->rate); qdisc_put_rtab(cl->rate);
qdisc_put_rtab(cl->ceil); qdisc_put_rtab(cl->ceil);
tcf_destroy_chain(cl->filter_list); tcf_destroy_chain(&cl->filter_list);
while (!list_empty(&cl->children)) while (!list_empty(&cl->children))
htb_destroy_class(sch, list_entry(cl->children.next, htb_destroy_class(sch, list_entry(cl->children.next,
...@@ -1267,7 +1267,7 @@ static void htb_destroy(struct Qdisc *sch) ...@@ -1267,7 +1267,7 @@ static void htb_destroy(struct Qdisc *sch)
and surprisingly it worked in 2.4. But it must precede it and surprisingly it worked in 2.4. But it must precede it
because filter need its target class alive to be able to call because filter need its target class alive to be able to call
unbind_filter on it (without Oops). */ unbind_filter on it (without Oops). */
tcf_destroy_chain(q->filter_list); tcf_destroy_chain(&q->filter_list);
while (!list_empty(&q->root)) while (!list_empty(&q->root))
htb_destroy_class(sch, list_entry(q->root.next, htb_destroy_class(sch, list_entry(q->root.next,
......
...@@ -104,7 +104,7 @@ static void ingress_destroy(struct Qdisc *sch) ...@@ -104,7 +104,7 @@ static void ingress_destroy(struct Qdisc *sch)
{ {
struct ingress_qdisc_data *p = qdisc_priv(sch); struct ingress_qdisc_data *p = qdisc_priv(sch);
tcf_destroy_chain(p->filter_list); tcf_destroy_chain(&p->filter_list);
} }
static int ingress_dump(struct Qdisc *sch, struct sk_buff *skb) static int ingress_dump(struct Qdisc *sch, struct sk_buff *skb)
......
...@@ -219,7 +219,7 @@ prio_destroy(struct Qdisc* sch) ...@@ -219,7 +219,7 @@ prio_destroy(struct Qdisc* sch)
int prio; int prio;
struct prio_sched_data *q = qdisc_priv(sch); struct prio_sched_data *q = qdisc_priv(sch);
tcf_destroy_chain(q->filter_list); tcf_destroy_chain(&q->filter_list);
for (prio=0; prio<q->bands; prio++) for (prio=0; prio<q->bands; prio++)
qdisc_destroy(q->queues[prio]); qdisc_destroy(q->queues[prio]);
} }
......
...@@ -520,7 +520,7 @@ static void sfq_destroy(struct Qdisc *sch) ...@@ -520,7 +520,7 @@ static void sfq_destroy(struct Qdisc *sch)
{ {
struct sfq_sched_data *q = qdisc_priv(sch); struct sfq_sched_data *q = qdisc_priv(sch);
tcf_destroy_chain(q->filter_list); tcf_destroy_chain(&q->filter_list);
q->perturb_period = 0; q->perturb_period = 0;
del_timer_sync(&q->perturb_timer); del_timer_sync(&q->perturb_timer);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment