backport: handle change in netdevice destructor usage
authorArend Van Spriel <arend.vanspriel@broadcom.com>
Thu, 22 Jun 2017 07:31:04 +0000 (08:31 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 30 Jun 2017 11:38:51 +0000 (13:38 +0200)
This patch deals with changes made in struct net_device by commit
cf124db566e6 ("net: Fix inconsistent teardown and release of private
netdev state.").

Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
backport/backport-include/linux/netdevice.h
patches/0079-netdev-destructor.cocci [new file with mode: 0644]

index 06230b53dc453e648c37fc0eaef225c2786952e5..98e781eeb7408b32c91e819d0e6f10b2cde9fbbe 100644 (file)
@@ -320,4 +320,14 @@ static inline void netif_trans_update(struct net_device *dev)
 }
 #endif
 
+#if LINUX_VERSION_IS_LESS(4,13,0)
+#define netdev_set_priv_destructor(_dev, _destructor) \
+       (_dev)->destructor = __ ## _destructor
+#else
+#define netdev_set_priv_destructor(_dev, _destructor) \
+       (_dev)->needs_free_netdev = true; \
+       if ((_destructor) != free_netdev) \
+               (_dev)->priv_destructor = (_destructor);
+#endif
+
 #endif /* __BACKPORT_NETDEVICE_H */
diff --git a/patches/0079-netdev-destructor.cocci b/patches/0079-netdev-destructor.cocci
new file mode 100644 (file)
index 0000000..fab8af1
--- /dev/null
@@ -0,0 +1,84 @@
+@r1@
+struct net_device *NDEV;
+identifier D, C;
+identifier TRUE =~ "true";
+@@
+C(...)
+{
+       <...
+-      NDEV->needs_free_netdev = TRUE;
+-      NDEV->priv_destructor = D;
++      netdev_set_priv_destructor(NDEV, D);
+       ...>
+}
+
+@r2 depends on r1@
+identifier r1.D, r1.C;
+fresh identifier E = "__" ## D;
+@@
+
++#if LINUX_VERSION_IS_LESS(4,13,0)
++static void E(struct net_device *ndev)
++{
++      D(ndev);
++      free_netdev(ndev);
++}
++#endif
++
+C(...)
+{
+       ...
+}
+
+@r3 depends on r1@
+type T;
+identifier NDEV;
+identifier r1.D;
+T RET;
+@@
+
+RET = \(register_netdevice\|register_ndev\)(NDEV);
+if (<+... RET ...+>) {
+       <...
++#if LINUX_VERSION_IS_LESS(4,13,0)
++      D(NDEV);
++#endif
+       free_netdev(NDEV);
+       ...>
+}
+
+@r4 depends on r1@
+identifier NDEV;
+identifier r1.D;
+type T;
+T RET;
+@@
+
+if (...)
+       RET = register_netdevice(NDEV);
+else
+       RET = register_netdev(NDEV);
+if (<+... RET ...+>) {
+       <...
++#if LINUX_VERSION_IS_LESS(4,13,0)
++      D(NDEV);
++#endif
+       free_netdev(NDEV);
+       ...>
+}
+
+@r5@
+struct net_device *NDEV;
+identifier TRUE =~ "true";
+@@
+
+-NDEV->needs_free_netdev = TRUE;
++netdev_set_priv_destructor(NDEV, free_netdev);
+
+@r6@
+struct net_device *NDEV;
+identifier D;
+@@
+
+-NDEV->priv_destructor = D;
++netdev_set_priv_destructor(NDEV, D);