kfree(x->ealg);
kfree(x->calg);
kfree(x->encap);
- if (x->mode)
- xfrm_put_mode(x->mode);
if (x->type) {
x->type->destructor(x);
xfrm_put_type(x->type);
{
struct xfrm_state *x;
- x = kzalloc(sizeof(struct xfrm_state), GFP_ATOMIC);
+ x = kmalloc(sizeof(struct xfrm_state), GFP_ATOMIC);
if (x) {
+ memset(x, 0, sizeof(struct xfrm_state));
atomic_set(&x->refcnt, 1);
atomic_set(&x->tunnel_users, 0);
INIT_LIST_HEAD(&x->bydst);
return NULL;
read_lock(&xfrm_state_afinfo_lock);
afinfo = xfrm_state_afinfo[family];
- if (unlikely(!afinfo))
- read_unlock(&xfrm_state_afinfo_lock);
+ if (likely(afinfo != NULL))
+ read_lock(&afinfo->lock);
+ read_unlock(&xfrm_state_afinfo_lock);
return afinfo;
}
static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo)
{
- read_unlock(&xfrm_state_afinfo_lock);
+ if (unlikely(afinfo == NULL))
+ return;
+ read_unlock(&afinfo->lock);
}
/* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
return res;
}
+EXPORT_SYMBOL(xfrm_state_mtu);
+
int xfrm_init_state(struct xfrm_state *x)
{
struct xfrm_state_afinfo *afinfo;
if (err)
goto error;
- x->mode = xfrm_get_mode(x->props.mode, family);
- if (x->mode == NULL)
- goto error;
-
x->km.state = XFRM_STATE_VALID;
error: