diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sched/cls_fw.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c index 715e01e5910a..f23a3b68bba6 100644 --- a/net/sched/cls_fw.c +++ b/net/sched/cls_fw.c | |||
@@ -33,7 +33,6 @@ | |||
33 | 33 | ||
34 | struct fw_head { | 34 | struct fw_head { |
35 | u32 mask; | 35 | u32 mask; |
36 | bool mask_set; | ||
37 | struct fw_filter __rcu *ht[HTSIZE]; | 36 | struct fw_filter __rcu *ht[HTSIZE]; |
38 | struct rcu_head rcu; | 37 | struct rcu_head rcu; |
39 | }; | 38 | }; |
@@ -84,7 +83,7 @@ static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp, | |||
84 | } | 83 | } |
85 | } | 84 | } |
86 | } else { | 85 | } else { |
87 | /* old method */ | 86 | /* Old method: classify the packet using its skb mark. */ |
88 | if (id && (TC_H_MAJ(id) == 0 || | 87 | if (id && (TC_H_MAJ(id) == 0 || |
89 | !(TC_H_MAJ(id ^ tp->q->handle)))) { | 88 | !(TC_H_MAJ(id ^ tp->q->handle)))) { |
90 | res->classid = id; | 89 | res->classid = id; |
@@ -114,14 +113,9 @@ static unsigned long fw_get(struct tcf_proto *tp, u32 handle) | |||
114 | 113 | ||
115 | static int fw_init(struct tcf_proto *tp) | 114 | static int fw_init(struct tcf_proto *tp) |
116 | { | 115 | { |
117 | struct fw_head *head; | 116 | /* We don't allocate fw_head here, because in the old method |
118 | 117 | * we don't need it at all. | |
119 | head = kzalloc(sizeof(struct fw_head), GFP_KERNEL); | 118 | */ |
120 | if (head == NULL) | ||
121 | return -ENOBUFS; | ||
122 | |||
123 | head->mask_set = false; | ||
124 | rcu_assign_pointer(tp->root, head); | ||
125 | return 0; | 119 | return 0; |
126 | } | 120 | } |
127 | 121 | ||
@@ -252,7 +246,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb, | |||
252 | int err; | 246 | int err; |
253 | 247 | ||
254 | if (!opt) | 248 | if (!opt) |
255 | return handle ? -EINVAL : 0; | 249 | return handle ? -EINVAL : 0; /* Succeed if it is old method. */ |
256 | 250 | ||
257 | err = nla_parse_nested(tb, TCA_FW_MAX, opt, fw_policy); | 251 | err = nla_parse_nested(tb, TCA_FW_MAX, opt, fw_policy); |
258 | if (err < 0) | 252 | if (err < 0) |
@@ -302,11 +296,17 @@ static int fw_change(struct net *net, struct sk_buff *in_skb, | |||
302 | if (!handle) | 296 | if (!handle) |
303 | return -EINVAL; | 297 | return -EINVAL; |
304 | 298 | ||
305 | if (!head->mask_set) { | 299 | if (!head) { |
306 | head->mask = 0xFFFFFFFF; | 300 | u32 mask = 0xFFFFFFFF; |
307 | if (tb[TCA_FW_MASK]) | 301 | if (tb[TCA_FW_MASK]) |
308 | head->mask = nla_get_u32(tb[TCA_FW_MASK]); | 302 | mask = nla_get_u32(tb[TCA_FW_MASK]); |
309 | head->mask_set = true; | 303 | |
304 | head = kzalloc(sizeof(*head), GFP_KERNEL); | ||
305 | if (!head) | ||
306 | return -ENOBUFS; | ||
307 | head->mask = mask; | ||
308 | |||
309 | rcu_assign_pointer(tp->root, head); | ||
310 | } | 310 | } |
311 | 311 | ||
312 | f = kzalloc(sizeof(struct fw_filter), GFP_KERNEL); | 312 | f = kzalloc(sizeof(struct fw_filter), GFP_KERNEL); |