diff options
Diffstat (limited to 'net/core/drop_monitor.c')
-rw-r--r-- | net/core/drop_monitor.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c index ad41529fb60..36e603c78ce 100644 --- a/net/core/drop_monitor.c +++ b/net/core/drop_monitor.c | |||
@@ -223,6 +223,11 @@ static int set_all_monitor_traces(int state) | |||
223 | 223 | ||
224 | spin_lock(&trace_state_lock); | 224 | spin_lock(&trace_state_lock); |
225 | 225 | ||
226 | if (state == trace_state) { | ||
227 | rc = -EAGAIN; | ||
228 | goto out_unlock; | ||
229 | } | ||
230 | |||
226 | switch (state) { | 231 | switch (state) { |
227 | case TRACE_ON: | 232 | case TRACE_ON: |
228 | rc |= register_trace_kfree_skb(trace_kfree_skb_hit, NULL); | 233 | rc |= register_trace_kfree_skb(trace_kfree_skb_hit, NULL); |
@@ -251,11 +256,12 @@ static int set_all_monitor_traces(int state) | |||
251 | 256 | ||
252 | if (!rc) | 257 | if (!rc) |
253 | trace_state = state; | 258 | trace_state = state; |
259 | else | ||
260 | rc = -EINPROGRESS; | ||
254 | 261 | ||
262 | out_unlock: | ||
255 | spin_unlock(&trace_state_lock); | 263 | spin_unlock(&trace_state_lock); |
256 | 264 | ||
257 | if (rc) | ||
258 | return -EINPROGRESS; | ||
259 | return rc; | 265 | return rc; |
260 | } | 266 | } |
261 | 267 | ||
@@ -341,9 +347,9 @@ static struct notifier_block dropmon_net_notifier = { | |||
341 | 347 | ||
342 | static int __init init_net_drop_monitor(void) | 348 | static int __init init_net_drop_monitor(void) |
343 | { | 349 | { |
344 | int cpu; | ||
345 | int rc, i, ret; | ||
346 | struct per_cpu_dm_data *data; | 350 | struct per_cpu_dm_data *data; |
351 | int cpu, rc; | ||
352 | |||
347 | printk(KERN_INFO "Initalizing network drop monitor service\n"); | 353 | printk(KERN_INFO "Initalizing network drop monitor service\n"); |
348 | 354 | ||
349 | if (sizeof(void *) > 8) { | 355 | if (sizeof(void *) > 8) { |
@@ -351,21 +357,12 @@ static int __init init_net_drop_monitor(void) | |||
351 | return -ENOSPC; | 357 | return -ENOSPC; |
352 | } | 358 | } |
353 | 359 | ||
354 | if (genl_register_family(&net_drop_monitor_family) < 0) { | 360 | rc = genl_register_family_with_ops(&net_drop_monitor_family, |
361 | dropmon_ops, | ||
362 | ARRAY_SIZE(dropmon_ops)); | ||
363 | if (rc) { | ||
355 | printk(KERN_ERR "Could not create drop monitor netlink family\n"); | 364 | printk(KERN_ERR "Could not create drop monitor netlink family\n"); |
356 | return -EFAULT; | 365 | return rc; |
357 | } | ||
358 | |||
359 | rc = -EFAULT; | ||
360 | |||
361 | for (i = 0; i < ARRAY_SIZE(dropmon_ops); i++) { | ||
362 | ret = genl_register_ops(&net_drop_monitor_family, | ||
363 | &dropmon_ops[i]); | ||
364 | if (ret) { | ||
365 | printk(KERN_CRIT "Failed to register operation %d\n", | ||
366 | dropmon_ops[i].cmd); | ||
367 | goto out_unreg; | ||
368 | } | ||
369 | } | 366 | } |
370 | 367 | ||
371 | rc = register_netdevice_notifier(&dropmon_net_notifier); | 368 | rc = register_netdevice_notifier(&dropmon_net_notifier); |