Merge commit 'linux-pnfs/nfs41-for-2.6.31' into nfsv41-for-2.6.31
This commit is contained in:
commit
301933a0ac
38 changed files with 4589 additions and 374 deletions
134
net/sunrpc/svc.c
134
net/sunrpc/svc.c
|
@ -25,6 +25,7 @@
|
|||
#include <linux/sunrpc/stats.h>
|
||||
#include <linux/sunrpc/svcsock.h>
|
||||
#include <linux/sunrpc/clnt.h>
|
||||
#include <linux/sunrpc/bc_xprt.h>
|
||||
|
||||
#define RPCDBG_FACILITY RPCDBG_SVCDSP
|
||||
|
||||
|
@ -486,6 +487,10 @@ svc_destroy(struct svc_serv *serv)
|
|||
if (svc_serv_is_pooled(serv))
|
||||
svc_pool_map_put();
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
svc_sock_destroy(serv->bc_xprt);
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
svc_unregister(serv);
|
||||
kfree(serv->sv_pools);
|
||||
kfree(serv);
|
||||
|
@ -970,20 +975,18 @@ svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
|
|||
}
|
||||
|
||||
/*
|
||||
* Process the RPC request.
|
||||
* Common routine for processing the RPC request.
|
||||
*/
|
||||
int
|
||||
svc_process(struct svc_rqst *rqstp)
|
||||
static int
|
||||
svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
{
|
||||
struct svc_program *progp;
|
||||
struct svc_version *versp = NULL; /* compiler food */
|
||||
struct svc_procedure *procp = NULL;
|
||||
struct kvec * argv = &rqstp->rq_arg.head[0];
|
||||
struct kvec * resv = &rqstp->rq_res.head[0];
|
||||
struct svc_serv *serv = rqstp->rq_server;
|
||||
kxdrproc_t xdr;
|
||||
__be32 *statp;
|
||||
u32 dir, prog, vers, proc;
|
||||
u32 prog, vers, proc;
|
||||
__be32 auth_stat, rpc_stat;
|
||||
int auth_res;
|
||||
__be32 *reply_statp;
|
||||
|
@ -993,19 +996,6 @@ svc_process(struct svc_rqst *rqstp)
|
|||
if (argv->iov_len < 6*4)
|
||||
goto err_short_len;
|
||||
|
||||
/* setup response xdr_buf.
|
||||
* Initially it has just one page
|
||||
*/
|
||||
rqstp->rq_resused = 1;
|
||||
resv->iov_base = page_address(rqstp->rq_respages[0]);
|
||||
resv->iov_len = 0;
|
||||
rqstp->rq_res.pages = rqstp->rq_respages + 1;
|
||||
rqstp->rq_res.len = 0;
|
||||
rqstp->rq_res.page_base = 0;
|
||||
rqstp->rq_res.page_len = 0;
|
||||
rqstp->rq_res.buflen = PAGE_SIZE;
|
||||
rqstp->rq_res.tail[0].iov_base = NULL;
|
||||
rqstp->rq_res.tail[0].iov_len = 0;
|
||||
/* Will be turned off only in gss privacy case: */
|
||||
rqstp->rq_splice_ok = 1;
|
||||
/* Will be turned off only when NFSv4 Sessions are used */
|
||||
|
@ -1014,17 +1004,13 @@ svc_process(struct svc_rqst *rqstp)
|
|||
/* Setup reply header */
|
||||
rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr(rqstp);
|
||||
|
||||
rqstp->rq_xid = svc_getu32(argv);
|
||||
svc_putu32(resv, rqstp->rq_xid);
|
||||
|
||||
dir = svc_getnl(argv);
|
||||
vers = svc_getnl(argv);
|
||||
|
||||
/* First words of reply: */
|
||||
svc_putnl(resv, 1); /* REPLY */
|
||||
|
||||
if (dir != 0) /* direction != CALL */
|
||||
goto err_bad_dir;
|
||||
if (vers != 2) /* RPC version number */
|
||||
goto err_bad_rpc;
|
||||
|
||||
|
@ -1147,7 +1133,7 @@ svc_process(struct svc_rqst *rqstp)
|
|||
sendit:
|
||||
if (svc_authorise(rqstp))
|
||||
goto dropit;
|
||||
return svc_send(rqstp);
|
||||
return 1; /* Caller can now send it */
|
||||
|
||||
dropit:
|
||||
svc_authorise(rqstp); /* doesn't hurt to call this twice */
|
||||
|
@ -1161,12 +1147,6 @@ err_short_len:
|
|||
|
||||
goto dropit; /* drop request */
|
||||
|
||||
err_bad_dir:
|
||||
svc_printk(rqstp, "bad direction %d, dropping request\n", dir);
|
||||
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
goto dropit; /* drop request */
|
||||
|
||||
err_bad_rpc:
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
svc_putnl(resv, 1); /* REJECT */
|
||||
|
@ -1219,6 +1199,100 @@ err_bad:
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(svc_process);
|
||||
|
||||
/*
|
||||
* Process the RPC request.
|
||||
*/
|
||||
int
|
||||
svc_process(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct kvec *argv = &rqstp->rq_arg.head[0];
|
||||
struct kvec *resv = &rqstp->rq_res.head[0];
|
||||
struct svc_serv *serv = rqstp->rq_server;
|
||||
u32 dir;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* Setup response xdr_buf.
|
||||
* Initially it has just one page
|
||||
*/
|
||||
rqstp->rq_resused = 1;
|
||||
resv->iov_base = page_address(rqstp->rq_respages[0]);
|
||||
resv->iov_len = 0;
|
||||
rqstp->rq_res.pages = rqstp->rq_respages + 1;
|
||||
rqstp->rq_res.len = 0;
|
||||
rqstp->rq_res.page_base = 0;
|
||||
rqstp->rq_res.page_len = 0;
|
||||
rqstp->rq_res.buflen = PAGE_SIZE;
|
||||
rqstp->rq_res.tail[0].iov_base = NULL;
|
||||
rqstp->rq_res.tail[0].iov_len = 0;
|
||||
|
||||
rqstp->rq_xid = svc_getu32(argv);
|
||||
|
||||
dir = svc_getnl(argv);
|
||||
if (dir != 0) {
|
||||
/* direction != CALL */
|
||||
svc_printk(rqstp, "bad direction %d, dropping request\n", dir);
|
||||
serv->sv_stats->rpcbadfmt++;
|
||||
svc_drop(rqstp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
error = svc_process_common(rqstp, argv, resv);
|
||||
if (error <= 0)
|
||||
return error;
|
||||
|
||||
return svc_send(rqstp);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
/*
|
||||
* Process a backchannel RPC request that arrived over an existing
|
||||
* outbound connection
|
||||
*/
|
||||
int
|
||||
bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req,
|
||||
struct svc_rqst *rqstp)
|
||||
{
|
||||
struct kvec *argv = &rqstp->rq_arg.head[0];
|
||||
struct kvec *resv = &rqstp->rq_res.head[0];
|
||||
int error;
|
||||
|
||||
/* Build the svc_rqst used by the common processing routine */
|
||||
rqstp->rq_xprt = serv->bc_xprt;
|
||||
rqstp->rq_xid = req->rq_xid;
|
||||
rqstp->rq_prot = req->rq_xprt->prot;
|
||||
rqstp->rq_server = serv;
|
||||
|
||||
rqstp->rq_addrlen = sizeof(req->rq_xprt->addr);
|
||||
memcpy(&rqstp->rq_addr, &req->rq_xprt->addr, rqstp->rq_addrlen);
|
||||
memcpy(&rqstp->rq_arg, &req->rq_rcv_buf, sizeof(rqstp->rq_arg));
|
||||
memcpy(&rqstp->rq_res, &req->rq_snd_buf, sizeof(rqstp->rq_res));
|
||||
|
||||
/* reset result send buffer "put" position */
|
||||
resv->iov_len = 0;
|
||||
|
||||
if (rqstp->rq_prot != IPPROTO_TCP) {
|
||||
printk(KERN_ERR "No support for Non-TCP transports!\n");
|
||||
BUG();
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip the next two words because they've already been
|
||||
* processed in the trasport
|
||||
*/
|
||||
svc_getu32(argv); /* XID */
|
||||
svc_getnl(argv); /* CALLDIR */
|
||||
|
||||
error = svc_process_common(rqstp, argv, resv);
|
||||
if (error <= 0)
|
||||
return error;
|
||||
|
||||
memcpy(&req->rq_snd_buf, &rqstp->rq_res, sizeof(req->rq_snd_buf));
|
||||
return bc_send(req);
|
||||
}
|
||||
EXPORT_SYMBOL(bc_svc_process);
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
/*
|
||||
* Return (transport-specific) limit on the rpc payload.
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue