diff options
Diffstat (limited to 'net/sched/act_api.c')
-rw-r--r-- | net/sched/act_api.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index af427a3dbcba..43ec92680ae8 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
@@ -45,7 +45,7 @@ void tcf_hash_destroy(struct tc_action *a) | |||
45 | } | 45 | } |
46 | EXPORT_SYMBOL(tcf_hash_destroy); | 46 | EXPORT_SYMBOL(tcf_hash_destroy); |
47 | 47 | ||
48 | int tcf_hash_release(struct tc_action *a, int bind) | 48 | int __tcf_hash_release(struct tc_action *a, bool bind, bool strict) |
49 | { | 49 | { |
50 | struct tcf_common *p = a->priv; | 50 | struct tcf_common *p = a->priv; |
51 | int ret = 0; | 51 | int ret = 0; |
@@ -53,7 +53,7 @@ int tcf_hash_release(struct tc_action *a, int bind) | |||
53 | if (p) { | 53 | if (p) { |
54 | if (bind) | 54 | if (bind) |
55 | p->tcfc_bindcnt--; | 55 | p->tcfc_bindcnt--; |
56 | else if (p->tcfc_bindcnt > 0) | 56 | else if (strict && p->tcfc_bindcnt > 0) |
57 | return -EPERM; | 57 | return -EPERM; |
58 | 58 | ||
59 | p->tcfc_refcnt--; | 59 | p->tcfc_refcnt--; |
@@ -64,9 +64,10 @@ int tcf_hash_release(struct tc_action *a, int bind) | |||
64 | ret = 1; | 64 | ret = 1; |
65 | } | 65 | } |
66 | } | 66 | } |
67 | |||
67 | return ret; | 68 | return ret; |
68 | } | 69 | } |
69 | EXPORT_SYMBOL(tcf_hash_release); | 70 | EXPORT_SYMBOL(__tcf_hash_release); |
70 | 71 | ||
71 | static int tcf_dump_walker(struct sk_buff *skb, struct netlink_callback *cb, | 72 | static int tcf_dump_walker(struct sk_buff *skb, struct netlink_callback *cb, |
72 | struct tc_action *a) | 73 | struct tc_action *a) |
@@ -136,7 +137,7 @@ static int tcf_del_walker(struct sk_buff *skb, struct tc_action *a) | |||
136 | head = &hinfo->htab[tcf_hash(i, hinfo->hmask)]; | 137 | head = &hinfo->htab[tcf_hash(i, hinfo->hmask)]; |
137 | hlist_for_each_entry_safe(p, n, head, tcfc_head) { | 138 | hlist_for_each_entry_safe(p, n, head, tcfc_head) { |
138 | a->priv = p; | 139 | a->priv = p; |
139 | ret = tcf_hash_release(a, 0); | 140 | ret = __tcf_hash_release(a, false, true); |
140 | if (ret == ACT_P_DELETED) { | 141 | if (ret == ACT_P_DELETED) { |
141 | module_put(a->ops->owner); | 142 | module_put(a->ops->owner); |
142 | n_i++; | 143 | n_i++; |
@@ -408,7 +409,7 @@ int tcf_action_destroy(struct list_head *actions, int bind) | |||
408 | int ret = 0; | 409 | int ret = 0; |
409 | 410 | ||
410 | list_for_each_entry_safe(a, tmp, actions, list) { | 411 | list_for_each_entry_safe(a, tmp, actions, list) { |
411 | ret = tcf_hash_release(a, bind); | 412 | ret = __tcf_hash_release(a, bind, true); |
412 | if (ret == ACT_P_DELETED) | 413 | if (ret == ACT_P_DELETED) |
413 | module_put(a->ops->owner); | 414 | module_put(a->ops->owner); |
414 | else if (ret < 0) | 415 | else if (ret < 0) |