Commit b80350f3 authored by Tonghao Zhang's avatar Tonghao Zhang Committed by David S. Miller

net: sock: simplify tw proto registration

Introduce the new function tw_prot_init (inspired by
req_prot_init) to simplify "proto_register" function.

tw_prot_cleanup will take care of a partially initialized
timewait_sock_ops.
Signed-off-by: default avatarTonghao Zhang <xiangxia.m.yue@gmail.com>
Reviewed-by: default avatarAlexander Duyck <alexanderduyck@fb.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 47142ed6
...@@ -3440,6 +3440,32 @@ static void tw_prot_cleanup(struct timewait_sock_ops *twsk_prot) ...@@ -3440,6 +3440,32 @@ static void tw_prot_cleanup(struct timewait_sock_ops *twsk_prot)
twsk_prot->twsk_slab = NULL; twsk_prot->twsk_slab = NULL;
} }
static int tw_prot_init(const struct proto *prot)
{
struct timewait_sock_ops *twsk_prot = prot->twsk_prot;
if (!twsk_prot)
return 0;
twsk_prot->twsk_slab_name = kasprintf(GFP_KERNEL, "tw_sock_%s",
prot->name);
if (!twsk_prot->twsk_slab_name)
return -ENOMEM;
twsk_prot->twsk_slab =
kmem_cache_create(twsk_prot->twsk_slab_name,
twsk_prot->twsk_obj_size, 0,
SLAB_ACCOUNT | prot->slab_flags,
NULL);
if (!twsk_prot->twsk_slab) {
pr_crit("%s: Can't create timewait sock SLAB cache!\n",
prot->name);
return -ENOMEM;
}
return 0;
}
static void req_prot_cleanup(struct request_sock_ops *rsk_prot) static void req_prot_cleanup(struct request_sock_ops *rsk_prot)
{ {
if (!rsk_prot) if (!rsk_prot)
...@@ -3496,22 +3522,8 @@ int proto_register(struct proto *prot, int alloc_slab) ...@@ -3496,22 +3522,8 @@ int proto_register(struct proto *prot, int alloc_slab)
if (req_prot_init(prot)) if (req_prot_init(prot))
goto out_free_request_sock_slab; goto out_free_request_sock_slab;
if (prot->twsk_prot != NULL) { if (tw_prot_init(prot))
prot->twsk_prot->twsk_slab_name = kasprintf(GFP_KERNEL, "tw_sock_%s", prot->name); goto out_free_timewait_sock_slab;
if (prot->twsk_prot->twsk_slab_name == NULL)
goto out_free_request_sock_slab;
prot->twsk_prot->twsk_slab =
kmem_cache_create(prot->twsk_prot->twsk_slab_name,
prot->twsk_prot->twsk_obj_size,
0,
SLAB_ACCOUNT |
prot->slab_flags,
NULL);
if (prot->twsk_prot->twsk_slab == NULL)
goto out_free_timewait_sock_slab;
}
} }
mutex_lock(&proto_list_mutex); mutex_lock(&proto_list_mutex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment