}
#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 */
--- /dev/null
+@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);