diff options
-rw-r--r-- | fs/nfs/callback_xdr.c | 7 | ||||
-rw-r--r-- | net/sunrpc/backchannel_rqst.c | 8 | ||||
-rw-r--r-- | net/sunrpc/svc.c | 12 |
3 files changed, 14 insertions, 13 deletions
diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c index beac58b0e09c..646cdac73488 100644 --- a/fs/nfs/callback_xdr.c +++ b/fs/nfs/callback_xdr.c | |||
@@ -78,8 +78,7 @@ static __be32 *read_buf(struct xdr_stream *xdr, int nbytes) | |||
78 | 78 | ||
79 | p = xdr_inline_decode(xdr, nbytes); | 79 | p = xdr_inline_decode(xdr, nbytes); |
80 | if (unlikely(p == NULL)) | 80 | if (unlikely(p == NULL)) |
81 | printk(KERN_WARNING "NFS: NFSv4 callback reply buffer overflowed " | 81 | printk(KERN_WARNING "NFS: NFSv4 callback reply buffer overflowed!\n"); |
82 | "or truncated request.\n"); | ||
83 | return p; | 82 | return p; |
84 | } | 83 | } |
85 | 84 | ||
@@ -890,7 +889,6 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *r | |||
890 | struct cb_compound_hdr_arg hdr_arg = { 0 }; | 889 | struct cb_compound_hdr_arg hdr_arg = { 0 }; |
891 | struct cb_compound_hdr_res hdr_res = { NULL }; | 890 | struct cb_compound_hdr_res hdr_res = { NULL }; |
892 | struct xdr_stream xdr_in, xdr_out; | 891 | struct xdr_stream xdr_in, xdr_out; |
893 | struct xdr_buf *rq_arg = &rqstp->rq_arg; | ||
894 | __be32 *p, status; | 892 | __be32 *p, status; |
895 | struct cb_process_state cps = { | 893 | struct cb_process_state cps = { |
896 | .drc_status = 0, | 894 | .drc_status = 0, |
@@ -902,8 +900,7 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp, void *argp, void *r | |||
902 | 900 | ||
903 | dprintk("%s: start\n", __func__); | 901 | dprintk("%s: start\n", __func__); |
904 | 902 | ||
905 | rq_arg->len = rq_arg->head[0].iov_len + rq_arg->page_len; | 903 | xdr_init_decode(&xdr_in, &rqstp->rq_arg, rqstp->rq_arg.head[0].iov_base); |
906 | xdr_init_decode(&xdr_in, rq_arg, rq_arg->head[0].iov_base); | ||
907 | 904 | ||
908 | p = (__be32*)((char *)rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len); | 905 | p = (__be32*)((char *)rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len); |
909 | xdr_init_encode(&xdr_out, &rqstp->rq_res, p); | 906 | xdr_init_encode(&xdr_out, &rqstp->rq_res, p); |
diff --git a/net/sunrpc/backchannel_rqst.c b/net/sunrpc/backchannel_rqst.c index 95f82d8d4888..229956bf8457 100644 --- a/net/sunrpc/backchannel_rqst.c +++ b/net/sunrpc/backchannel_rqst.c | |||
@@ -353,20 +353,12 @@ void xprt_complete_bc_request(struct rpc_rqst *req, uint32_t copied) | |||
353 | { | 353 | { |
354 | struct rpc_xprt *xprt = req->rq_xprt; | 354 | struct rpc_xprt *xprt = req->rq_xprt; |
355 | struct svc_serv *bc_serv = xprt->bc_serv; | 355 | struct svc_serv *bc_serv = xprt->bc_serv; |
356 | struct xdr_buf *rq_rcv_buf = &req->rq_rcv_buf; | ||
357 | 356 | ||
358 | spin_lock(&xprt->bc_pa_lock); | 357 | spin_lock(&xprt->bc_pa_lock); |
359 | list_del(&req->rq_bc_pa_list); | 358 | list_del(&req->rq_bc_pa_list); |
360 | xprt_dec_alloc_count(xprt, 1); | 359 | xprt_dec_alloc_count(xprt, 1); |
361 | spin_unlock(&xprt->bc_pa_lock); | 360 | spin_unlock(&xprt->bc_pa_lock); |
362 | 361 | ||
363 | if (copied <= rq_rcv_buf->head[0].iov_len) { | ||
364 | rq_rcv_buf->head[0].iov_len = copied; | ||
365 | rq_rcv_buf->page_len = 0; | ||
366 | } else { | ||
367 | rq_rcv_buf->page_len = copied - rq_rcv_buf->head[0].iov_len; | ||
368 | } | ||
369 | |||
370 | req->rq_private_buf.len = copied; | 362 | req->rq_private_buf.len = copied; |
371 | set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); | 363 | set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); |
372 | 364 | ||
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 7fccf9675df8..cc9852897395 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c | |||
@@ -1363,7 +1363,19 @@ bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req, | |||
1363 | memcpy(&rqstp->rq_addr, &req->rq_xprt->addr, rqstp->rq_addrlen); | 1363 | memcpy(&rqstp->rq_addr, &req->rq_xprt->addr, rqstp->rq_addrlen); |
1364 | memcpy(&rqstp->rq_arg, &req->rq_rcv_buf, sizeof(rqstp->rq_arg)); | 1364 | memcpy(&rqstp->rq_arg, &req->rq_rcv_buf, sizeof(rqstp->rq_arg)); |
1365 | memcpy(&rqstp->rq_res, &req->rq_snd_buf, sizeof(rqstp->rq_res)); | 1365 | memcpy(&rqstp->rq_res, &req->rq_snd_buf, sizeof(rqstp->rq_res)); |
1366 | |||
1367 | /* Adjust the argument buffer length */ | ||
1366 | rqstp->rq_arg.len = req->rq_private_buf.len; | 1368 | rqstp->rq_arg.len = req->rq_private_buf.len; |
1369 | if (rqstp->rq_arg.len <= rqstp->rq_arg.head[0].iov_len) { | ||
1370 | rqstp->rq_arg.head[0].iov_len = rqstp->rq_arg.len; | ||
1371 | rqstp->rq_arg.page_len = 0; | ||
1372 | } else if (rqstp->rq_arg.len <= rqstp->rq_arg.head[0].iov_len + | ||
1373 | rqstp->rq_arg.page_len) | ||
1374 | rqstp->rq_arg.page_len = rqstp->rq_arg.len - | ||
1375 | rqstp->rq_arg.head[0].iov_len; | ||
1376 | else | ||
1377 | rqstp->rq_arg.len = rqstp->rq_arg.head[0].iov_len + | ||
1378 | rqstp->rq_arg.page_len; | ||
1367 | 1379 | ||
1368 | /* reset result send buffer "put" position */ | 1380 | /* reset result send buffer "put" position */ |
1369 | resv->iov_len = 0; | 1381 | resv->iov_len = 0; |