|
@@ -970,20 +970,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 +991,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 +999,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 +1128,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 +1142,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 +1194,51 @@ 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);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Return (transport-specific) limit on the rpc payload.
|
|
|
*/
|