Tun device was encapsulating the net_device in a private structure then doing:
unregister_netdev(&tun->dev);
kfree(tun);
rtnl_unlock();
This breaks with the delayed cleanup now in the network core.
Moving the kfree outside of the rtnl_unlock will fix it.
Builds, but not sure how to use TUN to test it.
As part of later refcounting changes, I do have a more complex change
that uses the same encapsulation as ethernet and other
devices. Will save it for later.
diff -Nru a/drivers/net/tun.c b/drivers/net/tun.c
--- a/drivers/net/tun.c Wed Jun 4 15:38:44 2003
+++ b/drivers/net/tun.c Wed Jun 4 15:38:44 2003
@@ -551,10 +551,12 @@
if (!(tun->flags & TUN_PERSIST)) {
dev_close(&tun->dev);
unregister_netdevice(&tun->dev);
- kfree(tun);
}
rtnl_unlock();
+
+ if (!(tun->flags & TUN_PERSIST))
+ kfree(tun);
return 0;
}