diff options
| author | Stephen Hemminger <shemminger@vyatta.com> | 2008-11-26 00:12:32 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-11-26 00:13:25 -0500 |
| commit | 0e991ec6a0340916d3f29bd5dcb35299069e7226 (patch) | |
| tree | f8353915d1100b780e057a52f5be84102454af85 /net/sched/act_api.c | |
| parent | 4ef8e768335637749af8d83327b174be0ea798a2 (diff) | |
tc: propogate errors from tcf_hash_create
Allow tcf_hash_create to return different errors on estimator failure.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/act_api.c')
| -rw-r--r-- | net/sched/act_api.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 8f457f1e0acf..9d03cc33b6cc 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
| @@ -214,12 +214,14 @@ struct tcf_common *tcf_hash_check(u32 index, struct tc_action *a, int bind, | |||
| 214 | } | 214 | } |
| 215 | EXPORT_SYMBOL(tcf_hash_check); | 215 | EXPORT_SYMBOL(tcf_hash_check); |
| 216 | 216 | ||
| 217 | struct tcf_common *tcf_hash_create(u32 index, struct nlattr *est, struct tc_action *a, int size, int bind, u32 *idx_gen, struct tcf_hashinfo *hinfo) | 217 | struct tcf_common *tcf_hash_create(u32 index, struct nlattr *est, |
| 218 | struct tc_action *a, int size, int bind, | ||
| 219 | u32 *idx_gen, struct tcf_hashinfo *hinfo) | ||
| 218 | { | 220 | { |
| 219 | struct tcf_common *p = kzalloc(size, GFP_KERNEL); | 221 | struct tcf_common *p = kzalloc(size, GFP_KERNEL); |
| 220 | 222 | ||
| 221 | if (unlikely(!p)) | 223 | if (unlikely(!p)) |
| 222 | return p; | 224 | return ERR_PTR(-ENOMEM); |
| 223 | p->tcfc_refcnt = 1; | 225 | p->tcfc_refcnt = 1; |
| 224 | if (bind) | 226 | if (bind) |
| 225 | p->tcfc_bindcnt = 1; | 227 | p->tcfc_bindcnt = 1; |
| @@ -228,9 +230,15 @@ struct tcf_common *tcf_hash_create(u32 index, struct nlattr *est, struct tc_acti | |||
| 228 | p->tcfc_index = index ? index : tcf_hash_new_index(idx_gen, hinfo); | 230 | p->tcfc_index = index ? index : tcf_hash_new_index(idx_gen, hinfo); |
| 229 | p->tcfc_tm.install = jiffies; | 231 | p->tcfc_tm.install = jiffies; |
| 230 | p->tcfc_tm.lastuse = jiffies; | 232 | p->tcfc_tm.lastuse = jiffies; |
| 231 | if (est) | 233 | if (est) { |
| 232 | gen_new_estimator(&p->tcfc_bstats, &p->tcfc_rate_est, | 234 | int err = gen_new_estimator(&p->tcfc_bstats, &p->tcfc_rate_est, |
| 233 | &p->tcfc_lock, est); | 235 | &p->tcfc_lock, est); |
| 236 | if (err) { | ||
| 237 | kfree(p); | ||
| 238 | return ERR_PTR(err); | ||
| 239 | } | ||
| 240 | } | ||
| 241 | |||
| 234 | a->priv = (void *) p; | 242 | a->priv = (void *) p; |
| 235 | return p; | 243 | return p; |
| 236 | } | 244 | } |
