Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / net / tls / tls_device.c
index 33b267b..0683788 100644 (file)
@@ -534,8 +534,10 @@ last_record:
 int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
 {
        unsigned char record_type = TLS_RECORD_TYPE_DATA;
+       struct tls_context *tls_ctx = tls_get_ctx(sk);
        int rc;
 
+       mutex_lock(&tls_ctx->tx_lock);
        lock_sock(sk);
 
        if (unlikely(msg->msg_controllen)) {
@@ -549,12 +551,14 @@ int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
 
 out:
        release_sock(sk);
+       mutex_unlock(&tls_ctx->tx_lock);
        return rc;
 }
 
 int tls_device_sendpage(struct sock *sk, struct page *page,
                        int offset, size_t size, int flags)
 {
+       struct tls_context *tls_ctx = tls_get_ctx(sk);
        struct iov_iter msg_iter;
        char *kaddr = kmap(page);
        struct kvec iov;
@@ -563,6 +567,7 @@ int tls_device_sendpage(struct sock *sk, struct page *page,
        if (flags & MSG_SENDPAGE_NOTLAST)
                flags |= MSG_MORE;
 
+       mutex_lock(&tls_ctx->tx_lock);
        lock_sock(sk);
 
        if (flags & MSG_OOB) {
@@ -579,6 +584,7 @@ int tls_device_sendpage(struct sock *sk, struct page *page,
 
 out:
        release_sock(sk);
+       mutex_unlock(&tls_ctx->tx_lock);
        return rc;
 }
 
@@ -634,9 +640,11 @@ static int tls_device_push_pending_record(struct sock *sk, int flags)
 
 void tls_device_write_space(struct sock *sk, struct tls_context *ctx)
 {
-       if (!sk->sk_write_pending && tls_is_partially_sent_record(ctx)) {
+       if (tls_is_partially_sent_record(ctx)) {
                gfp_t sk_allocation = sk->sk_allocation;
 
+               WARN_ON_ONCE(sk->sk_write_pending);
+
                sk->sk_allocation = GFP_ATOMIC;
                tls_push_partial_record(sk, ctx,
                                        MSG_DONTWAIT | MSG_NOSIGNAL |