Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/forcedeth.c
This commit is contained in:
@@ -135,6 +135,7 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
|
||||
unsigned long cl;
|
||||
unsigned long fh;
|
||||
int err;
|
||||
int tp_created = 0;
|
||||
|
||||
if (net != &init_net)
|
||||
return -EINVAL;
|
||||
@@ -266,10 +267,7 @@ replay:
|
||||
goto errout;
|
||||
}
|
||||
|
||||
spin_lock_bh(root_lock);
|
||||
tp->next = *back;
|
||||
*back = tp;
|
||||
spin_unlock_bh(root_lock);
|
||||
tp_created = 1;
|
||||
|
||||
} else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind))
|
||||
goto errout;
|
||||
@@ -296,8 +294,11 @@ replay:
|
||||
switch (n->nlmsg_type) {
|
||||
case RTM_NEWTFILTER:
|
||||
err = -EEXIST;
|
||||
if (n->nlmsg_flags & NLM_F_EXCL)
|
||||
if (n->nlmsg_flags & NLM_F_EXCL) {
|
||||
if (tp_created)
|
||||
tcf_destroy(tp);
|
||||
goto errout;
|
||||
}
|
||||
break;
|
||||
case RTM_DELTFILTER:
|
||||
err = tp->ops->delete(tp, fh);
|
||||
@@ -314,8 +315,18 @@ replay:
|
||||
}
|
||||
|
||||
err = tp->ops->change(tp, cl, t->tcm_handle, tca, &fh);
|
||||
if (err == 0)
|
||||
if (err == 0) {
|
||||
if (tp_created) {
|
||||
spin_lock_bh(root_lock);
|
||||
tp->next = *back;
|
||||
*back = tp;
|
||||
spin_unlock_bh(root_lock);
|
||||
}
|
||||
tfilter_notify(skb, n, tp, fh, RTM_NEWTFILTER);
|
||||
} else {
|
||||
if (tp_created)
|
||||
tcf_destroy(tp);
|
||||
}
|
||||
|
||||
errout:
|
||||
if (cl)
|
||||
|
@@ -98,8 +98,7 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp,
|
||||
struct tcf_result *res)
|
||||
{
|
||||
struct cls_cgroup_head *head = tp->root;
|
||||
struct cgroup_cls_state *cs;
|
||||
int ret = 0;
|
||||
u32 classid;
|
||||
|
||||
/*
|
||||
* Due to the nature of the classifier it is required to ignore all
|
||||
@@ -115,17 +114,18 @@ static int cls_cgroup_classify(struct sk_buff *skb, struct tcf_proto *tp,
|
||||
return -1;
|
||||
|
||||
rcu_read_lock();
|
||||
cs = task_cls_state(current);
|
||||
if (cs->classid && tcf_em_tree_match(skb, &head->ematches, NULL)) {
|
||||
res->classid = cs->classid;
|
||||
res->class = 0;
|
||||
ret = tcf_exts_exec(skb, &head->exts, res);
|
||||
} else
|
||||
ret = -1;
|
||||
|
||||
classid = task_cls_state(current)->classid;
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
if (!classid)
|
||||
return -1;
|
||||
|
||||
if (!tcf_em_tree_match(skb, &head->ematches, NULL))
|
||||
return -1;
|
||||
|
||||
res->classid = classid;
|
||||
res->class = 0;
|
||||
return tcf_exts_exec(skb, &head->exts, res);
|
||||
}
|
||||
|
||||
static unsigned long cls_cgroup_get(struct tcf_proto *tp, u32 handle)
|
||||
|
Reference in New Issue
Block a user