mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 04:06:22 +00:00
[TWSK]: Grab the module refcount for timewait sockets
This is required to avoid unloading a module that has active timewait sockets, such as DCCP. Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2a9bc9bb4d
commit
eeb2b85606
2 changed files with 4 additions and 0 deletions
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include <linux/ip.h>
|
#include <linux/ip.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
#include <linux/module.h>
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
|
@ -193,11 +194,13 @@ static inline u32 inet_rcv_saddr(const struct sock *sk)
|
||||||
static inline void inet_twsk_put(struct inet_timewait_sock *tw)
|
static inline void inet_twsk_put(struct inet_timewait_sock *tw)
|
||||||
{
|
{
|
||||||
if (atomic_dec_and_test(&tw->tw_refcnt)) {
|
if (atomic_dec_and_test(&tw->tw_refcnt)) {
|
||||||
|
struct module *owner = tw->tw_prot->owner;
|
||||||
#ifdef SOCK_REFCNT_DEBUG
|
#ifdef SOCK_REFCNT_DEBUG
|
||||||
printk(KERN_DEBUG "%s timewait_sock %p released\n",
|
printk(KERN_DEBUG "%s timewait_sock %p released\n",
|
||||||
tw->tw_prot->name, tw);
|
tw->tw_prot->name, tw);
|
||||||
#endif
|
#endif
|
||||||
kmem_cache_free(tw->tw_prot->twsk_slab, tw);
|
kmem_cache_free(tw->tw_prot->twsk_slab, tw);
|
||||||
|
module_put(owner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,6 +111,7 @@ struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int stat
|
||||||
tw->tw_prot = sk->sk_prot_creator;
|
tw->tw_prot = sk->sk_prot_creator;
|
||||||
atomic_set(&tw->tw_refcnt, 1);
|
atomic_set(&tw->tw_refcnt, 1);
|
||||||
inet_twsk_dead_node_init(tw);
|
inet_twsk_dead_node_init(tw);
|
||||||
|
__module_get(tw->tw_prot->owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tw;
|
return tw;
|
||||||
|
|
Loading…
Reference in a new issue