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 | |
| 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')
| -rw-r--r-- | net/sched/act_api.c | 18 | ||||
| -rw-r--r-- | net/sched/act_gact.c | 4 | ||||
| -rw-r--r-- | net/sched/act_ipt.c | 4 | ||||
| -rw-r--r-- | net/sched/act_mirred.c | 4 | ||||
| -rw-r--r-- | net/sched/act_nat.c | 4 | ||||
| -rw-r--r-- | net/sched/act_pedit.c | 4 | ||||
| -rw-r--r-- | net/sched/act_simple.c | 4 | ||||
| -rw-r--r-- | net/sched/act_skbedit.c | 4 |
8 files changed, 27 insertions, 19 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 | } |
diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c index ac04289da5d7..e7f796aec657 100644 --- a/net/sched/act_gact.c +++ b/net/sched/act_gact.c | |||
| @@ -88,8 +88,8 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, | |||
| 88 | if (!pc) { | 88 | if (!pc) { |
| 89 | pc = tcf_hash_create(parm->index, est, a, sizeof(*gact), | 89 | pc = tcf_hash_create(parm->index, est, a, sizeof(*gact), |
| 90 | bind, &gact_idx_gen, &gact_hash_info); | 90 | bind, &gact_idx_gen, &gact_hash_info); |
| 91 | if (unlikely(!pc)) | 91 | if (IS_ERR(pc)) |
| 92 | return -ENOMEM; | 92 | return PTR_ERR(pc); |
| 93 | ret = ACT_P_CREATED; | 93 | ret = ACT_P_CREATED; |
| 94 | } else { | 94 | } else { |
| 95 | if (!ovr) { | 95 | if (!ovr) { |
diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c index 0453d79ebf57..082c520b0def 100644 --- a/net/sched/act_ipt.c +++ b/net/sched/act_ipt.c | |||
| @@ -136,8 +136,8 @@ static int tcf_ipt_init(struct nlattr *nla, struct nlattr *est, | |||
| 136 | if (!pc) { | 136 | if (!pc) { |
| 137 | pc = tcf_hash_create(index, est, a, sizeof(*ipt), bind, | 137 | pc = tcf_hash_create(index, est, a, sizeof(*ipt), bind, |
| 138 | &ipt_idx_gen, &ipt_hash_info); | 138 | &ipt_idx_gen, &ipt_hash_info); |
| 139 | if (unlikely(!pc)) | 139 | if (IS_ERR(pc)) |
| 140 | return -ENOMEM; | 140 | return PTR_ERR(pc); |
| 141 | ret = ACT_P_CREATED; | 141 | ret = ACT_P_CREATED; |
| 142 | } else { | 142 | } else { |
| 143 | if (!ovr) { | 143 | if (!ovr) { |
diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index 70341c020b6d..b9aaab4e0354 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c | |||
| @@ -105,8 +105,8 @@ static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est, | |||
| 105 | return -EINVAL; | 105 | return -EINVAL; |
| 106 | pc = tcf_hash_create(parm->index, est, a, sizeof(*m), bind, | 106 | pc = tcf_hash_create(parm->index, est, a, sizeof(*m), bind, |
| 107 | &mirred_idx_gen, &mirred_hash_info); | 107 | &mirred_idx_gen, &mirred_hash_info); |
| 108 | if (unlikely(!pc)) | 108 | if (IS_ERR(pc)) |
| 109 | return -ENOMEM; | 109 | return PTR_ERR(pc); |
| 110 | ret = ACT_P_CREATED; | 110 | ret = ACT_P_CREATED; |
| 111 | } else { | 111 | } else { |
| 112 | if (!ovr) { | 112 | if (!ovr) { |
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c index 7b39ed485bca..d885ba311564 100644 --- a/net/sched/act_nat.c +++ b/net/sched/act_nat.c | |||
| @@ -68,8 +68,8 @@ static int tcf_nat_init(struct nlattr *nla, struct nlattr *est, | |||
| 68 | if (!pc) { | 68 | if (!pc) { |
| 69 | pc = tcf_hash_create(parm->index, est, a, sizeof(*p), bind, | 69 | pc = tcf_hash_create(parm->index, est, a, sizeof(*p), bind, |
| 70 | &nat_idx_gen, &nat_hash_info); | 70 | &nat_idx_gen, &nat_hash_info); |
| 71 | if (unlikely(!pc)) | 71 | if (IS_ERR(pc)) |
| 72 | return -ENOMEM; | 72 | return PTR_ERR(pc); |
| 73 | p = to_tcf_nat(pc); | 73 | p = to_tcf_nat(pc); |
| 74 | ret = ACT_P_CREATED; | 74 | ret = ACT_P_CREATED; |
| 75 | } else { | 75 | } else { |
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index d5f4e3404864..96c0ed115e2a 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c | |||
| @@ -68,8 +68,8 @@ static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est, | |||
| 68 | return -EINVAL; | 68 | return -EINVAL; |
| 69 | pc = tcf_hash_create(parm->index, est, a, sizeof(*p), bind, | 69 | pc = tcf_hash_create(parm->index, est, a, sizeof(*p), bind, |
| 70 | &pedit_idx_gen, &pedit_hash_info); | 70 | &pedit_idx_gen, &pedit_hash_info); |
| 71 | if (unlikely(!pc)) | 71 | if (IS_ERR(pc)) |
| 72 | return -ENOMEM; | 72 | return PTR_ERR(pc); |
| 73 | p = to_pedit(pc); | 73 | p = to_pedit(pc); |
| 74 | keys = kmalloc(ksize, GFP_KERNEL); | 74 | keys = kmalloc(ksize, GFP_KERNEL); |
| 75 | if (keys == NULL) { | 75 | if (keys == NULL) { |
diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c index e7851ce92cfe..8daa1ebc7413 100644 --- a/net/sched/act_simple.c +++ b/net/sched/act_simple.c | |||
| @@ -124,8 +124,8 @@ static int tcf_simp_init(struct nlattr *nla, struct nlattr *est, | |||
| 124 | if (!pc) { | 124 | if (!pc) { |
| 125 | pc = tcf_hash_create(parm->index, est, a, sizeof(*d), bind, | 125 | pc = tcf_hash_create(parm->index, est, a, sizeof(*d), bind, |
| 126 | &simp_idx_gen, &simp_hash_info); | 126 | &simp_idx_gen, &simp_hash_info); |
| 127 | if (unlikely(!pc)) | 127 | if (IS_ERR(pc)) |
| 128 | return -ENOMEM; | 128 | return PTR_ERR(pc); |
| 129 | 129 | ||
| 130 | d = to_defact(pc); | 130 | d = to_defact(pc); |
| 131 | ret = alloc_defdata(d, defdata); | 131 | ret = alloc_defdata(d, defdata); |
diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c index fe9777e77f35..4ab916b8074b 100644 --- a/net/sched/act_skbedit.c +++ b/net/sched/act_skbedit.c | |||
| @@ -104,8 +104,8 @@ static int tcf_skbedit_init(struct nlattr *nla, struct nlattr *est, | |||
| 104 | if (!pc) { | 104 | if (!pc) { |
| 105 | pc = tcf_hash_create(parm->index, est, a, sizeof(*d), bind, | 105 | pc = tcf_hash_create(parm->index, est, a, sizeof(*d), bind, |
| 106 | &skbedit_idx_gen, &skbedit_hash_info); | 106 | &skbedit_idx_gen, &skbedit_hash_info); |
| 107 | if (unlikely(!pc)) | 107 | if (IS_ERR(pc)) |
| 108 | return -ENOMEM; | 108 | return PTR_ERR(pc); |
| 109 | 109 | ||
| 110 | d = to_skbedit(pc); | 110 | d = to_skbedit(pc); |
| 111 | ret = ACT_P_CREATED; | 111 | ret = ACT_P_CREATED; |
