From 0f6475aeab086e408f038deebcbc8921821f77fd Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Thu, 5 May 2005 13:35:15 -0700 Subject: [PATCH] --- yaml --- r: 953 b: refs/heads/master c: 476e19cfa131e2b6eedc4017b627cdc4ca419ffb h: refs/heads/master i: 951: 562d45d8e969780712d1fd9a6e477f99787e9493 v: v3 --- [refs] | 2 +- trunk/include/net/sock.h | 2 ++ trunk/net/core/sock.c | 12 ++++++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 9c8d14dce12c..c23de15120dd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 25ae3f59b10dbd5e2b9b192ecc90ea935cc23e68 +refs/heads/master: 476e19cfa131e2b6eedc4017b627cdc4ca419ffb diff --git a/trunk/include/net/sock.h b/trunk/include/net/sock.h index cc4c9190b7fd..77f02f86346e 100644 --- a/trunk/include/net/sock.h +++ b/trunk/include/net/sock.h @@ -141,6 +141,7 @@ struct sock_common { * @sk_callback_lock: used with the callbacks in the end of this struct * @sk_error_queue: rarely used * @sk_prot: protocol handlers inside a network family + * @sk_prot_creator: sk_prot of original sock creator (see ipv6_setsockopt, IPV6_ADDRFORM for instance) * @sk_err: last error * @sk_err_soft: errors that don't cause failure but are the cause of a persistent failure not just 'timed out' * @sk_ack_backlog: current listen backlog @@ -218,6 +219,7 @@ struct sock { } sk_backlog; struct sk_buff_head sk_error_queue; struct proto *sk_prot; + struct proto *sk_prot_creator; rwlock_t sk_callback_lock; int sk_err, sk_err_soft; diff --git a/trunk/net/core/sock.c b/trunk/net/core/sock.c index 98171ddd7e7d..92c0676e4708 100644 --- a/trunk/net/core/sock.c +++ b/trunk/net/core/sock.c @@ -635,7 +635,11 @@ struct sock *sk_alloc(int family, int priority, struct proto *prot, int zero_it) if (zero_it) { memset(sk, 0, prot->obj_size); sk->sk_family = family; - sk->sk_prot = prot; + /* + * See comment in struct sock definition to understand + * why we need sk_prot_creator -acme + */ + sk->sk_prot = sk->sk_prot_creator = prot; sock_lock_init(sk); } @@ -654,7 +658,7 @@ struct sock *sk_alloc(int family, int priority, struct proto *prot, int zero_it) void sk_free(struct sock *sk) { struct sk_filter *filter; - struct module *owner = sk->sk_prot->owner; + struct module *owner = sk->sk_prot_creator->owner; if (sk->sk_destruct) sk->sk_destruct(sk); @@ -672,8 +676,8 @@ void sk_free(struct sock *sk) __FUNCTION__, atomic_read(&sk->sk_omem_alloc)); security_sk_free(sk); - if (sk->sk_prot->slab != NULL) - kmem_cache_free(sk->sk_prot->slab, sk); + if (sk->sk_prot_creator->slab != NULL) + kmem_cache_free(sk->sk_prot_creator->slab, sk); else kfree(sk); module_put(owner);