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 /net/switchdev | |
| 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>
Diffstat (limited to 'net/switchdev')
| -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 | ||
