aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svc.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/svc.c')
-rw-r--r--net/sunrpc/svc.c61
1 files changed, 31 insertions, 30 deletions
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index b08419e1fc68..44b8d9d4c18a 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -32,9 +32,8 @@ svc_create(struct svc_program *prog, unsigned int bufsize)
32 int vers; 32 int vers;
33 unsigned int xdrsize; 33 unsigned int xdrsize;
34 34
35 if (!(serv = kmalloc(sizeof(*serv), GFP_KERNEL))) 35 if (!(serv = kzalloc(sizeof(*serv), GFP_KERNEL)))
36 return NULL; 36 return NULL;
37 memset(serv, 0, sizeof(*serv));
38 serv->sv_name = prog->pg_name; 37 serv->sv_name = prog->pg_name;
39 serv->sv_program = prog; 38 serv->sv_program = prog;
40 serv->sv_nrthreads = 1; 39 serv->sv_nrthreads = 1;
@@ -159,11 +158,10 @@ svc_create_thread(svc_thread_fn func, struct svc_serv *serv)
159 struct svc_rqst *rqstp; 158 struct svc_rqst *rqstp;
160 int error = -ENOMEM; 159 int error = -ENOMEM;
161 160
162 rqstp = kmalloc(sizeof(*rqstp), GFP_KERNEL); 161 rqstp = kzalloc(sizeof(*rqstp), GFP_KERNEL);
163 if (!rqstp) 162 if (!rqstp)
164 goto out; 163 goto out;
165 164
166 memset(rqstp, 0, sizeof(*rqstp));
167 init_waitqueue_head(&rqstp->rq_wait); 165 init_waitqueue_head(&rqstp->rq_wait);
168 166
169 if (!(rqstp->rq_argp = kmalloc(serv->sv_xdrsize, GFP_KERNEL)) 167 if (!(rqstp->rq_argp = kmalloc(serv->sv_xdrsize, GFP_KERNEL))
@@ -258,11 +256,11 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
258 struct kvec * argv = &rqstp->rq_arg.head[0]; 256 struct kvec * argv = &rqstp->rq_arg.head[0];
259 struct kvec * resv = &rqstp->rq_res.head[0]; 257 struct kvec * resv = &rqstp->rq_res.head[0];
260 kxdrproc_t xdr; 258 kxdrproc_t xdr;
261 u32 *statp; 259 __be32 *statp;
262 u32 dir, prog, vers, proc, 260 u32 dir, prog, vers, proc;
263 auth_stat, rpc_stat; 261 __be32 auth_stat, rpc_stat;
264 int auth_res; 262 int auth_res;
265 u32 *accept_statp; 263 __be32 *accept_statp;
266 264
267 rpc_stat = rpc_success; 265 rpc_stat = rpc_success;
268 266
@@ -280,19 +278,22 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
280 rqstp->rq_res.page_base = 0; 278 rqstp->rq_res.page_base = 0;
281 rqstp->rq_res.page_len = 0; 279 rqstp->rq_res.page_len = 0;
282 rqstp->rq_res.buflen = PAGE_SIZE; 280 rqstp->rq_res.buflen = PAGE_SIZE;
281 rqstp->rq_res.tail[0].iov_base = NULL;
283 rqstp->rq_res.tail[0].iov_len = 0; 282 rqstp->rq_res.tail[0].iov_len = 0;
283 /* Will be turned off only in gss privacy case: */
284 rqstp->rq_sendfile_ok = 1;
284 /* tcp needs a space for the record length... */ 285 /* tcp needs a space for the record length... */
285 if (rqstp->rq_prot == IPPROTO_TCP) 286 if (rqstp->rq_prot == IPPROTO_TCP)
286 svc_putu32(resv, 0); 287 svc_putnl(resv, 0);
287 288
288 rqstp->rq_xid = svc_getu32(argv); 289 rqstp->rq_xid = svc_getu32(argv);
289 svc_putu32(resv, rqstp->rq_xid); 290 svc_putu32(resv, rqstp->rq_xid);
290 291
291 dir = ntohl(svc_getu32(argv)); 292 dir = svc_getnl(argv);
292 vers = ntohl(svc_getu32(argv)); 293 vers = svc_getnl(argv);
293 294
294 /* First words of reply: */ 295 /* First words of reply: */
295 svc_putu32(resv, xdr_one); /* REPLY */ 296 svc_putnl(resv, 1); /* REPLY */
296 297
297 if (dir != 0) /* direction != CALL */ 298 if (dir != 0) /* direction != CALL */
298 goto err_bad_dir; 299 goto err_bad_dir;
@@ -302,11 +303,11 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
302 /* Save position in case we later decide to reject: */ 303 /* Save position in case we later decide to reject: */
303 accept_statp = resv->iov_base + resv->iov_len; 304 accept_statp = resv->iov_base + resv->iov_len;
304 305
305 svc_putu32(resv, xdr_zero); /* ACCEPT */ 306 svc_putnl(resv, 0); /* ACCEPT */
306 307
307 rqstp->rq_prog = prog = ntohl(svc_getu32(argv)); /* program number */ 308 rqstp->rq_prog = prog = svc_getnl(argv); /* program number */
308 rqstp->rq_vers = vers = ntohl(svc_getu32(argv)); /* version number */ 309 rqstp->rq_vers = vers = svc_getnl(argv); /* version number */
309 rqstp->rq_proc = proc = ntohl(svc_getu32(argv)); /* procedure number */ 310 rqstp->rq_proc = proc = svc_getnl(argv); /* procedure number */
310 311
311 progp = serv->sv_program; 312 progp = serv->sv_program;
312 313
@@ -360,7 +361,7 @@ svc_process(struct svc_serv *serv, struct svc_rqst *rqstp)
360 361
361 /* Build the reply header. */ 362 /* Build the reply header. */
362 statp = resv->iov_base +resv->iov_len; 363 statp = resv->iov_base +resv->iov_len;
363 svc_putu32(resv, rpc_success); /* RPC_SUCCESS */ 364 svc_putnl(resv, RPC_SUCCESS);
364 365
365 /* Bump per-procedure stats counter */ 366 /* Bump per-procedure stats counter */
366 procp->pc_count++; 367 procp->pc_count++;
@@ -438,10 +439,10 @@ err_bad_dir:
438 439
439err_bad_rpc: 440err_bad_rpc:
440 serv->sv_stats->rpcbadfmt++; 441 serv->sv_stats->rpcbadfmt++;
441 svc_putu32(resv, xdr_one); /* REJECT */ 442 svc_putnl(resv, 1); /* REJECT */
442 svc_putu32(resv, xdr_zero); /* RPC_MISMATCH */ 443 svc_putnl(resv, 0); /* RPC_MISMATCH */
443 svc_putu32(resv, xdr_two); /* Only RPCv2 supported */ 444 svc_putnl(resv, 2); /* Only RPCv2 supported */
444 svc_putu32(resv, xdr_two); 445 svc_putnl(resv, 2);
445 goto sendit; 446 goto sendit;
446 447
447err_bad_auth: 448err_bad_auth:
@@ -449,15 +450,15 @@ err_bad_auth:
449 serv->sv_stats->rpcbadauth++; 450 serv->sv_stats->rpcbadauth++;
450 /* Restore write pointer to location of accept status: */ 451 /* Restore write pointer to location of accept status: */
451 xdr_ressize_check(rqstp, accept_statp); 452 xdr_ressize_check(rqstp, accept_statp);
452 svc_putu32(resv, xdr_one); /* REJECT */ 453 svc_putnl(resv, 1); /* REJECT */
453 svc_putu32(resv, xdr_one); /* AUTH_ERROR */ 454 svc_putnl(resv, 1); /* AUTH_ERROR */
454 svc_putu32(resv, auth_stat); /* status */ 455 svc_putnl(resv, ntohl(auth_stat)); /* status */
455 goto sendit; 456 goto sendit;
456 457
457err_bad_prog: 458err_bad_prog:
458 dprintk("svc: unknown program %d\n", prog); 459 dprintk("svc: unknown program %d\n", prog);
459 serv->sv_stats->rpcbadfmt++; 460 serv->sv_stats->rpcbadfmt++;
460 svc_putu32(resv, rpc_prog_unavail); 461 svc_putnl(resv, RPC_PROG_UNAVAIL);
461 goto sendit; 462 goto sendit;
462 463
463err_bad_vers: 464err_bad_vers:
@@ -465,9 +466,9 @@ err_bad_vers:
465 printk("svc: unknown version (%d)\n", vers); 466 printk("svc: unknown version (%d)\n", vers);
466#endif 467#endif
467 serv->sv_stats->rpcbadfmt++; 468 serv->sv_stats->rpcbadfmt++;
468 svc_putu32(resv, rpc_prog_mismatch); 469 svc_putnl(resv, RPC_PROG_MISMATCH);
469 svc_putu32(resv, htonl(progp->pg_lovers)); 470 svc_putnl(resv, progp->pg_lovers);
470 svc_putu32(resv, htonl(progp->pg_hivers)); 471 svc_putnl(resv, progp->pg_hivers);
471 goto sendit; 472 goto sendit;
472 473
473err_bad_proc: 474err_bad_proc:
@@ -475,7 +476,7 @@ err_bad_proc:
475 printk("svc: unknown procedure (%d)\n", proc); 476 printk("svc: unknown procedure (%d)\n", proc);
476#endif 477#endif
477 serv->sv_stats->rpcbadfmt++; 478 serv->sv_stats->rpcbadfmt++;
478 svc_putu32(resv, rpc_proc_unavail); 479 svc_putnl(resv, RPC_PROC_UNAVAIL);
479 goto sendit; 480 goto sendit;
480 481
481err_garbage: 482err_garbage:
@@ -485,6 +486,6 @@ err_garbage:
485 rpc_stat = rpc_garbage_args; 486 rpc_stat = rpc_garbage_args;
486err_bad: 487err_bad:
487 serv->sv_stats->rpcbadfmt++; 488 serv->sv_stats->rpcbadfmt++;
488 svc_putu32(resv, rpc_stat); 489 svc_putnl(resv, ntohl(rpc_stat));
489 goto sendit; 490 goto sendit;
490} 491}