]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/xfrm/xfrm_state.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6-omap-h63xx.git] / net / xfrm / xfrm_state.c
index 93a2f36ad3db7b30a681f726e31c6240d030d6ed..17b29ec3c41779d70562113ed1219e68ff3ae5fc 100644 (file)
@@ -77,6 +77,8 @@ static void xfrm_state_gc_destroy(struct xfrm_state *x)
        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);
@@ -1103,17 +1105,14 @@ static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family)
                return NULL;
        read_lock(&xfrm_state_afinfo_lock);
        afinfo = xfrm_state_afinfo[family];
-       if (likely(afinfo != NULL))
-               read_lock(&afinfo->lock);
-       read_unlock(&xfrm_state_afinfo_lock);
+       if (unlikely(!afinfo))
+               read_unlock(&xfrm_state_afinfo_lock);
        return afinfo;
 }
 
 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo)
 {
-       if (unlikely(afinfo == NULL))
-               return;
-       read_unlock(&afinfo->lock);
+       read_unlock(&xfrm_state_afinfo_lock);
 }
 
 /* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
@@ -1196,6 +1195,10 @@ int xfrm_init_state(struct xfrm_state *x)
        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: