[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

Reply via email to