diff options
author | Scott Feldman <sfeldma@gmail.com> | 2015-10-29 02:17:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-10-30 07:23:37 -0400 |
commit | e258d919b175e0160a694a20fb309e29fc93d7b1 (patch) | |
tree | b19cae556e6f23ce1394613e4c08065bd692ba28 | |
parent | 3a7bde55a11c4a22a6ccfc487993d621ae8e3688 (diff) |
switchdev: fix: pass correct obj size when deferring obj add
Fixes: 4d429c5dd ("switchdev: introduce possibility to defer obj_add/del")
Signed-off-by: Scott Feldman <sfeldma@gmail.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/switchdev/switchdev.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index d6b4a84a4a79..6dfd19e52938 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
@@ -337,6 +337,21 @@ int switchdev_port_attr_set(struct net_device *dev, | |||
337 | } | 337 | } |
338 | EXPORT_SYMBOL_GPL(switchdev_port_attr_set); | 338 | EXPORT_SYMBOL_GPL(switchdev_port_attr_set); |
339 | 339 | ||
340 | static size_t switchdev_obj_size(const struct switchdev_obj *obj) | ||
341 | { | ||
342 | switch (obj->id) { | ||
343 | case SWITCHDEV_OBJ_ID_PORT_VLAN: | ||
344 | return sizeof(struct switchdev_obj_port_vlan); | ||
345 | case SWITCHDEV_OBJ_ID_IPV4_FIB: | ||
346 | return sizeof(struct switchdev_obj_ipv4_fib); | ||
347 | case SWITCHDEV_OBJ_ID_PORT_FDB: | ||
348 | return sizeof(struct switchdev_obj_port_fdb); | ||
349 | default: | ||
350 | BUG(); | ||
351 | } | ||
352 | return 0; | ||
353 | } | ||
354 | |||
340 | static int __switchdev_port_obj_add(struct net_device *dev, | 355 | static int __switchdev_port_obj_add(struct net_device *dev, |
341 | const struct switchdev_obj *obj, | 356 | const struct switchdev_obj *obj, |
342 | struct switchdev_trans *trans) | 357 | struct switchdev_trans *trans) |
@@ -422,7 +437,7 @@ static void switchdev_port_obj_add_deferred(struct net_device *dev, | |||
422 | static int switchdev_port_obj_add_defer(struct net_device *dev, | 437 | static int switchdev_port_obj_add_defer(struct net_device *dev, |
423 | const struct switchdev_obj *obj) | 438 | const struct switchdev_obj *obj) |
424 | { | 439 | { |
425 | return switchdev_deferred_enqueue(dev, obj, sizeof(*obj), | 440 | return switchdev_deferred_enqueue(dev, obj, switchdev_obj_size(obj), |
426 | switchdev_port_obj_add_deferred); | 441 | switchdev_port_obj_add_deferred); |
427 | } | 442 | } |
428 | 443 | ||
@@ -490,7 +505,7 @@ static void switchdev_port_obj_del_deferred(struct net_device *dev, | |||
490 | static int switchdev_port_obj_del_defer(struct net_device *dev, | 505 | static int switchdev_port_obj_del_defer(struct net_device *dev, |
491 | const struct switchdev_obj *obj) | 506 | const struct switchdev_obj *obj) |
492 | { | 507 | { |
493 | return switchdev_deferred_enqueue(dev, obj, sizeof(*obj), | 508 | return switchdev_deferred_enqueue(dev, obj, switchdev_obj_size(obj), |
494 | switchdev_port_obj_del_deferred); | 509 | switchdev_port_obj_del_deferred); |
495 | } | 510 | } |
496 | 511 | ||