Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / net / xfrm / xfrm_state.c
index 0021aad..93a2f36 100644 (file)
@@ -77,8 +77,6 @@ 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);
@@ -194,9 +192,10 @@ struct xfrm_state *xfrm_state_alloc(void)
 {
        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);
@@ -1104,14 +1103,17 @@ 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 (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 */
@@ -1163,6 +1165,8 @@ int xfrm_state_mtu(struct xfrm_state *x, int mtu)
        return res;
 }
 
+EXPORT_SYMBOL(xfrm_state_mtu);
+
 int xfrm_init_state(struct xfrm_state *x)
 {
        struct xfrm_state_afinfo *afinfo;
@@ -1192,10 +1196,6 @@ 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: