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: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Patrick McHardy 2008-07-01 19:52:38 -07:00 committed by David S. Miller
parent 77a538d5aa
commit ff31ab56c0
11 changed files with 17 additions and 21 deletions

View File

@ -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)

View File

@ -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]);

View File

@ -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);
} }
} }

View File

@ -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)
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);

View File

@ -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)
* 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;

View File

@ -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);
} }

View File

@ -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)

View File

@ -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)
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,

View File

@ -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)

View File

@ -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]);
} }

View File

@ -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);
} }