]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/sunrpc/xprtsock.c
Merge tag 'for-linus-2019-09-27' of git://git.kernel.dk/linux-block
[linux.git] / net / sunrpc / xprtsock.c
index e2176c167a57918240b7b379621d1fe0c48cee97..9ac88722fa83ab953ba006a9c7777e7077fca532 100644 (file)
@@ -562,10 +562,14 @@ xs_read_stream_call(struct sock_xprt *transport, struct msghdr *msg, int flags)
                printk(KERN_WARNING "Callback slot table overflowed\n");
                return -ESHUTDOWN;
        }
+       if (transport->recv.copied && !req->rq_private_buf.len)
+               return -ESHUTDOWN;
 
        ret = xs_read_stream_request(transport, msg, flags, req);
        if (msg->msg_flags & (MSG_EOR|MSG_TRUNC))
                xprt_complete_bc_request(req, transport->recv.copied);
+       else
+               req->rq_private_buf.len = transport->recv.copied;
 
        return ret;
 }
@@ -587,7 +591,7 @@ xs_read_stream_reply(struct sock_xprt *transport, struct msghdr *msg, int flags)
        /* Look up and lock the request corresponding to the given XID */
        spin_lock(&xprt->queue_lock);
        req = xprt_lookup_rqst(xprt, transport->recv.xid);
-       if (!req) {
+       if (!req || (transport->recv.copied && !req->rq_private_buf.len)) {
                msg->msg_flags |= MSG_TRUNC;
                goto out;
        }
@@ -599,6 +603,8 @@ xs_read_stream_reply(struct sock_xprt *transport, struct msghdr *msg, int flags)
        spin_lock(&xprt->queue_lock);
        if (msg->msg_flags & (MSG_EOR|MSG_TRUNC))
                xprt_complete_rqst(req->rq_task, transport->recv.copied);
+       else
+               req->rq_private_buf.len = transport->recv.copied;
        xprt_unpin_rqst(req);
 out:
        spin_unlock(&xprt->queue_lock);