psock->sk = csk;
        psock->bpf_prog = prog;
 
-       err = strp_init(&psock->strp, csk, &cb);
-       if (err) {
-               kmem_cache_free(kcm_psockp, psock);
-               goto out;
-       }
-
        write_lock_bh(&csk->sk_callback_lock);
 
        /* Check if sk_user_data is already by KCM or someone else.
         */
        if (csk->sk_user_data) {
                write_unlock_bh(&csk->sk_callback_lock);
-               strp_stop(&psock->strp);
-               strp_done(&psock->strp);
                kmem_cache_free(kcm_psockp, psock);
                err = -EALREADY;
                goto out;
        }
 
+       err = strp_init(&psock->strp, csk, &cb);
+       if (err) {
+               write_unlock_bh(&csk->sk_callback_lock);
+               kmem_cache_free(kcm_psockp, psock);
+               goto out;
+       }
+
        psock->save_data_ready = csk->sk_data_ready;
        psock->save_write_space = csk->sk_write_space;
        psock->save_state_change = csk->sk_state_change;