[NETNS]: Fix bad macro definition.
authorDaniel Lezcano <dlezcano@fr.ibm.com>
Wed, 12 Sep 2007 12:57:09 +0000 (14:57 +0200)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 10 Oct 2007 23:49:18 +0000 (16:49 -0700)
The macro definition is bad. When calling next_net_device with
parameter name "dev", the resulting code is:
  struct net_device *dev = dev and that leads to an unexpected
behavior. Especially when llc_core is compiled in, the kernel panics
at boot time.
The patchset change macro definition with static inline functions as
they were defined before.

Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h

index 407658c..625240c 100644 (file)
@@ -41,7 +41,8 @@
 #include <linux/dmaengine.h>
 #include <linux/workqueue.h>
 
-struct net;
+#include <net/net_namespace.h>
+
 struct vlan_group;
 struct ethtool_ops;
 struct netpoll_info;
@@ -753,23 +754,21 @@ extern rwlock_t                           dev_base_lock;          /* Device list lock */
                list_for_each_entry_continue(d, &(net)->dev_base_head, dev_list)
 #define net_device_entry(lh)   list_entry(lh, struct net_device, dev_list)
 
-#define next_net_device(d)                                             \
-({                                                                     \
-       struct net_device *dev = d;                                     \
-       struct list_head *lh;                                           \
-       struct net *net;                                                \
-                                                                       \
-       net = dev->nd_net;                                              \
-       lh = dev->dev_list.next;                                        \
-       lh == &net->dev_base_head ? NULL : net_device_entry(lh);        \
-})
-
-#define first_net_device(N)                                    \
-({                                                             \
-       struct net *NET = (N);                                  \
-       list_empty(&NET->dev_base_head) ? NULL :                \
-               net_device_entry(NET->dev_base_head.next);      \
-})
+static inline struct net_device *next_net_device(struct net_device *dev)
+{
+       struct list_head *lh;
+       struct net *net;
+
+       net = dev->nd_net;
+       lh = dev->dev_list.next;
+       return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
+}
+
+static inline struct net_device *first_net_device(struct net *net)
+{
+       return list_empty(&net->dev_base_head) ? NULL :
+               net_device_entry(net->dev_base_head.next);
+}
 
 extern int                     netdev_boot_setup_check(struct net_device *dev);
 extern unsigned long           netdev_boot_base(const char *prefix, int unit);