sk->sk_data_ready = o2net_data_ready;
        sk->sk_state_change = o2net_state_change;
 
+       mutex_init(&sc->sc_send_lock);
+
        write_unlock_bh(&sk->sk_callback_lock);
 }
 
        ssize_t ret;
 
 
+       mutex_lock(&sc->sc_send_lock);
        ret = sc->sc_sock->ops->sendpage(sc->sc_sock,
                                         virt_to_page(kmalloced_virt),
                                         (long)kmalloced_virt & ~PAGE_MASK,
                                         size, MSG_DONTWAIT);
+       mutex_unlock(&sc->sc_send_lock);
        if (ret != size) {
                mlog(ML_ERROR, "sendpage of size %zu to " SC_NODEF_FMT 
                     " failed with %zd\n", size, SC_NODEF_ARGS(sc), ret);
 
        /* finally, convert the message header to network byte-order
         * and send */
+       mutex_lock(&sc->sc_send_lock);
        ret = o2net_send_tcp_msg(sc->sc_sock, vec, veclen,
                                 sizeof(struct o2net_msg) + caller_bytes);
+       mutex_unlock(&sc->sc_send_lock);
        msglog(msg, "sending returned %d\n", ret);
        if (ret < 0) {
                mlog(0, "error returned from o2net_send_tcp_msg=%d\n", ret);
 
 out_respond:
        /* this destroys the hdr, so don't use it after this */
+       mutex_lock(&sc->sc_send_lock);
        ret = o2net_send_status_magic(sc->sc_sock, hdr, syserr,
                                      handler_status);
+       mutex_unlock(&sc->sc_send_lock);
        hdr = NULL;
        mlog(0, "sending handler status %d, syserr %d returned %d\n",
             handler_status, syserr, ret);