[DCCP]: The return of Unload Hack
At present it is not possible to unload any of the dccp_ipv{4,6} modules -
not even with force.
The reason is that the control socket is not released at module exit; this known
problem had been fixed up to 2.6.17-rc1 by a solution known as the Unload Hack.
This patch resolves the problem by releasing the control sockets for the v4/v6
modules in the module exit function. [ The test whether ctl_sock != NULL has
been deleted since __sock_create (via inet_csk_ctl_sock_create) returns an
error code different from 0 whenever sock != NULL. ]
There may be more elegant solutions, but this one is simple and works.
An `under construction' warning is added, that it is currently not advisable
to unload the dccp_ipv{4,6} modules.
Note: This solution mirrors the one in SCTP, which can also only be ejected
using rmmod --force: maybe there is room for a generic solution to both,
since the key problem in both is in releasing the control socket.
Signed-off-by: Gerrit Renker <[EMAIL PROTECTED]>
---
net/dccp/ipv4.c | 5 +++++
net/dccp/ipv6.c | 2 ++
2 files changed, 7 insertions(+)
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -1065,6 +1065,7 @@ static int __init dccp_v4_init(void)
SOCK_DCCP, IPPROTO_DCCP);
if (err)
goto out_unregister_protosw;
+ __unsafe(THIS_MODULE); /* due to unload hack in dccp_v4_exit */
out:
return err;
out_unregister_protosw:
@@ -1077,6 +1078,10 @@ out_proto_unregister:
static void __exit dccp_v4_exit(void)
{
+ /* FIXME: Unload Hack - must release control socket to unload.
+ * There should be a better solution to release the control socket,
+ * until this is resolved, please keep the above __unsafe warning. */
+ sock_release(dccp_v4_ctl_socket);
inet_unregister_protosw(&dccp_v4_protosw);
inet_del_protocol(&dccp_v4_protocol, IPPROTO_DCCP);
proto_unregister(&dccp_v4_prot);
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -1237,6 +1237,7 @@ static int __init dccp_v6_init(void)
SOCK_DCCP, IPPROTO_DCCP);
if (err != 0)
goto out_unregister_protosw;
+ __unsafe(THIS_MODULE); /* due to unload hack in dccp_v6_exit */
out:
return err;
out_unregister_protosw:
@@ -1249,6 +1250,7 @@ out_unregister_proto:
static void __exit dccp_v6_exit(void)
{
+ sock_release(dccp_v6_ctl_socket); /* FIXME: see note in dccp_v4_exit */
inet6_del_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
inet6_unregister_protosw(&dccp_v6_protosw);
proto_unregister(&dccp_v6_prot);
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html