xprtrdma: Cap size of callback buffer resources
authorChuck Lever <chuck.lever@oracle.com>
Tue, 29 Nov 2016 15:52:08 +0000 (10:52 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 29 Nov 2016 21:45:44 +0000 (16:45 -0500)
When the inline threshold size is set to large values (say, 32KB)
any NFSv4.1 CB request from the server gets a reply with status
NFS4ERR_RESOURCE.

Looks like there are some upper layer assumptions about the maximum
size of a reply (for example, in process_op). Cap the size of the
NFSv4 client's reply resources at a page.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/backchannel.c

index 2c472e1b4827b73a7deb4621097d5a0133e2aacd..24fedd4b117e8f61cf500f629f2b47f2bc53e76f 100644 (file)
@@ -55,7 +55,8 @@ static int rpcrdma_bc_setup_rqst(struct rpcrdma_xprt *r_xprt,
        if (IS_ERR(rb))
                goto out_fail;
        req->rl_sendbuf = rb;
-       xdr_buf_init(&rqst->rq_snd_buf, rb->rg_base, size);
+       xdr_buf_init(&rqst->rq_snd_buf, rb->rg_base,
+                    min_t(size_t, size, PAGE_SIZE));
        rpcrdma_set_xprtdata(rqst, req);
        return 0;
 
@@ -191,6 +192,7 @@ size_t xprt_rdma_bc_maxpayload(struct rpc_xprt *xprt)
        size_t maxmsg;
 
        maxmsg = min_t(unsigned int, cdata->inline_rsize, cdata->inline_wsize);
+       maxmsg = min_t(unsigned int, maxmsg, PAGE_SIZE);
        return maxmsg - RPCRDMA_HDRLEN_MIN;
 }