}
 }
 
-static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys, int hsc)
+static struct sk_buff *__pfkey_xfrm_state2msg(struct xfrm_state *x,
+                                             int add_keys, int hsc)
 {
        struct sk_buff *skb;
        struct sadb_msg *hdr;
        return skb;
 }
 
+
+static inline struct sk_buff *pfkey_xfrm_state2msg(struct xfrm_state *x)
+{
+       struct sk_buff *skb;
+
+       spin_lock_bh(&x->lock);
+       skb = __pfkey_xfrm_state2msg(x, 1, 3);
+       spin_unlock_bh(&x->lock);
+
+       return skb;
+}
+
+static inline struct sk_buff *pfkey_xfrm_state2msg_expire(struct xfrm_state *x,
+                                                         int hsc)
+{
+       return __pfkey_xfrm_state2msg(x, 0, hsc);
+}
+
 static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
                                                void **ext_hdrs)
 {
        }
 
        err = xfrm_alloc_spi(x, min_spi, max_spi);
-       resp_skb = err ? ERR_PTR(err) : pfkey_xfrm_state2msg(x, 0, 3);
+       resp_skb = err ? ERR_PTR(err) : pfkey_xfrm_state2msg(x);
 
        if (IS_ERR(resp_skb)) {
                xfrm_state_put(x);
 {
        struct sk_buff *skb;
        struct sadb_msg *hdr;
-       int hsc = 3;
-
-       if (c->event == XFRM_MSG_DELSA)
-               hsc = 0;
 
-       skb = pfkey_xfrm_state2msg(x, 0, hsc);
+       skb = pfkey_xfrm_state2msg(x);
 
        if (IS_ERR(skb))
                return PTR_ERR(skb);
        if (x == NULL)
                return -ESRCH;
 
-       out_skb = pfkey_xfrm_state2msg(x, 1, 3);
+       out_skb = pfkey_xfrm_state2msg(x);
        proto = x->id.proto;
        xfrm_state_put(x);
        if (IS_ERR(out_skb))
        struct sk_buff *out_skb;
        struct sadb_msg *out_hdr;
 
-       out_skb = pfkey_xfrm_state2msg(x, 1, 3);
+       out_skb = pfkey_xfrm_state2msg(x);
        if (IS_ERR(out_skb))
                return PTR_ERR(out_skb);
 
        else
                hsc = 1;
 
-       out_skb = pfkey_xfrm_state2msg(x, 0, hsc);
+       out_skb = pfkey_xfrm_state2msg_expire(x, hsc);
        if (IS_ERR(out_skb))
                return PTR_ERR(out_skb);
 
 
                                    struct xfrm_usersa_info *p,
                                    struct sk_buff *skb)
 {
+       spin_lock_bh(&x->lock);
        copy_to_user_state(x, p);
 
+       if (x->coaddr)
+               NLA_PUT(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr);
+
+       if (x->lastused)
+               NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused);
+       spin_unlock_bh(&x->lock);
+
        if (x->aalg)
                NLA_PUT(skb, XFRMA_ALG_AUTH, alg_len(x->aalg), x->aalg);
        if (x->ealg)
        if (x->security && copy_sec_ctx(x->security, skb) < 0)
                goto nla_put_failure;
 
-       if (x->coaddr)
-               NLA_PUT(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr);
-
-       if (x->lastused)
-               NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused);
-
        return 0;
 
 nla_put_failure: