Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

can: export a safe netdev_priv wrapper for candev

In net_device notifier calls, it was impossible to determine
if a CAN device is based on candev in a safe way.
This patch adds such test in order to access candev storage
from within those notifiers.

Signed-off-by: Kurt Van Dijck <kurt.van.dijck@eia.be>
Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Fabio Baltieri <fabio.baltieri@gmail.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Kurt Van Dijck and committed by
Marc Kleine-Budde
bf03a537 996a953d

+16
+13
drivers/net/can/dev.c
··· 794 794 } 795 795 EXPORT_SYMBOL_GPL(unregister_candev); 796 796 797 + /* 798 + * Test if a network device is a candev based device 799 + * and return the can_priv* if so. 800 + */ 801 + struct can_priv *safe_candev_priv(struct net_device *dev) 802 + { 803 + if ((dev->type != ARPHRD_CAN) || (dev->rtnl_link_ops != &can_link_ops)) 804 + return NULL; 805 + 806 + return netdev_priv(dev); 807 + } 808 + EXPORT_SYMBOL_GPL(safe_candev_priv); 809 + 797 810 static __init int can_dev_init(void) 798 811 { 799 812 int err;
+3
include/linux/can/dev.h
··· 106 106 struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max); 107 107 void free_candev(struct net_device *dev); 108 108 109 + /* a candev safe wrapper around netdev_priv */ 110 + struct can_priv *safe_candev_priv(struct net_device *dev); 111 + 109 112 int open_candev(struct net_device *dev); 110 113 void close_candev(struct net_device *dev); 111 114