struct tcf_proto_ops *tp_ops;
struct Qdisc_class_ops *cops;
unsigned long cl = 0;
- unsigned long fh, fh_s;
+ unsigned long fh;
int err;
if (prio == 0) {
tp->classify = tp_ops->classify;
tp->classid = parent;
err = -EBUSY;
- if (!try_module_get(tp_ops->owner) ||
- (err = tp_ops->init(tp)) != 0) {
+ if (!try_module_get(tp_ops->owner)) {
+ kfree(tp);
+ goto errout;
+ }
+ if ((err = tp_ops->init(tp)) != 0) {
+ module_put(tp_ops->owner);
kfree(tp);
goto errout;
}
} else if (tca[TCA_KIND-1] && rtattr_strcmp(tca[TCA_KIND-1], tp->ops->kind))
goto errout;
- fh_s = fh = tp->ops->get(tp, t->tcm_handle);
+ fh = tp->ops->get(tp, t->tcm_handle);
if (fh == 0) {
if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) {
*back = tp->next;
qdisc_unlock_tree(dev);
- tfilter_notify(skb, n, tp, fh_s, RTM_DELTFILTER);
+ tfilter_notify(skb, n, tp, fh, RTM_DELTFILTER);
tcf_destroy(tp);
err = 0;
goto errout;
case RTM_DELTFILTER:
err = tp->ops->delete(tp, fh);
if (err == 0)
- tfilter_notify(skb, n, tp, fh_s, RTM_DELTFILTER);
+ tfilter_notify(skb, n, tp, fh, RTM_DELTFILTER);
goto errout;
case RTM_GETTFILTER:
err = tfilter_notify(skb, n, tp, fh, RTM_NEWTFILTER);