===== net/core/sock.c 1.57 vs edited ===== --- 1.57/net/core/sock.c 2005-01-10 18:23:56 -02:00 +++ edited/net/core/sock.c 2005-01-20 13:04:13 -02:00 @@ -621,9 +621,17 @@ { struct sock *sk = NULL; - if (!slab) - slab = sk_cachep; - sk = kmem_cache_alloc(slab, priority); + /* FIXME: + * Transitional, will be removed when all the families stop + * using sk->sk_protinfo + */ + if (zero_it > 1) + sk = kmalloc(zero_it, priority); + else { + if (!slab) + slab = sk_cachep; + sk = kmem_cache_alloc(slab, priority); + } if (sk) { if (zero_it) { memset(sk, 0, @@ -631,10 +639,15 @@ sk->sk_family = family; sock_lock_init(sk); } - sk->sk_slab = slab; + + if (zero_it != 1) + sk->sk_slab = slab; if (security_sk_alloc(sk, family, priority)) { - kmem_cache_free(slab, sk); + if (sk->sk_slab) + kmem_cache_free(slab, sk); + else + kfree(sk); sk = NULL; } } @@ -662,7 +675,10 @@ __FUNCTION__, atomic_read(&sk->sk_omem_alloc)); security_sk_free(sk); - kmem_cache_free(sk->sk_slab, sk); + if (sk->sk_slab) + kmem_cache_free(sk->sk_slab, sk); + else + kfree(sk); module_put(owner); }