diff options
Diffstat (limited to 'net/sched/cls_u32.c')
-rw-r--r-- | net/sched/cls_u32.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 246f9065ce34..05d178008cbc 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
@@ -387,7 +387,7 @@ static int u32_destroy_hnode(struct tcf_proto *tp, struct tc_u_hnode *ht) | |||
387 | static void u32_destroy(struct tcf_proto *tp) | 387 | static void u32_destroy(struct tcf_proto *tp) |
388 | { | 388 | { |
389 | struct tc_u_common *tp_c = tp->data; | 389 | struct tc_u_common *tp_c = tp->data; |
390 | struct tc_u_hnode *root_ht = xchg(&tp->root, NULL); | 390 | struct tc_u_hnode *root_ht = tp->root; |
391 | 391 | ||
392 | WARN_ON(root_ht == NULL); | 392 | WARN_ON(root_ht == NULL); |
393 | 393 | ||
@@ -479,7 +479,7 @@ static int u32_set_parms(struct tcf_proto *tp, unsigned long base, | |||
479 | err = -EINVAL; | 479 | err = -EINVAL; |
480 | if (tb[TCA_U32_LINK]) { | 480 | if (tb[TCA_U32_LINK]) { |
481 | u32 handle = nla_get_u32(tb[TCA_U32_LINK]); | 481 | u32 handle = nla_get_u32(tb[TCA_U32_LINK]); |
482 | struct tc_u_hnode *ht_down = NULL; | 482 | struct tc_u_hnode *ht_down = NULL, *ht_old; |
483 | 483 | ||
484 | if (TC_U32_KEY(handle)) | 484 | if (TC_U32_KEY(handle)) |
485 | goto errout; | 485 | goto errout; |
@@ -493,11 +493,12 @@ static int u32_set_parms(struct tcf_proto *tp, unsigned long base, | |||
493 | } | 493 | } |
494 | 494 | ||
495 | tcf_tree_lock(tp); | 495 | tcf_tree_lock(tp); |
496 | ht_down = xchg(&n->ht_down, ht_down); | 496 | ht_old = n->ht_down; |
497 | n->ht_down = ht_down; | ||
497 | tcf_tree_unlock(tp); | 498 | tcf_tree_unlock(tp); |
498 | 499 | ||
499 | if (ht_down) | 500 | if (ht_old) |
500 | ht_down->refcnt--; | 501 | ht_old->refcnt--; |
501 | } | 502 | } |
502 | if (tb[TCA_U32_CLASSID]) { | 503 | if (tb[TCA_U32_CLASSID]) { |
503 | n->res.classid = nla_get_u32(tb[TCA_U32_CLASSID]); | 504 | n->res.classid = nla_get_u32(tb[TCA_U32_CLASSID]); |