diff options
Diffstat (limited to 'net/sunrpc/svc.c')
| -rw-r--r-- | net/sunrpc/svc.c | 61 |
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 | ||
| 439 | err_bad_rpc: | 440 | err_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 | ||
| 447 | err_bad_auth: | 448 | err_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 | ||
| 457 | err_bad_prog: | 458 | err_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 | ||
| 463 | err_bad_vers: | 464 | err_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 | ||
| 473 | err_bad_proc: | 474 | err_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 | ||
| 481 | err_garbage: | 482 | err_garbage: |
| @@ -485,6 +486,6 @@ err_garbage: | |||
| 485 | rpc_stat = rpc_garbage_args; | 486 | rpc_stat = rpc_garbage_args; |
| 486 | err_bad: | 487 | err_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 | } |
