diff options
Diffstat (limited to 'fs/nfsd/nfssvc.c')
-rw-r--r-- | fs/nfsd/nfssvc.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 19443056ec30..0aaccb03bf76 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -198,9 +198,26 @@ int nfsd_create_serv(void) | |||
198 | unlock_kernel(); | 198 | unlock_kernel(); |
199 | return 0; | 199 | return 0; |
200 | } | 200 | } |
201 | if (nfsd_max_blksize == 0) { | ||
202 | /* choose a suitable default */ | ||
203 | struct sysinfo i; | ||
204 | si_meminfo(&i); | ||
205 | /* Aim for 1/4096 of memory per thread | ||
206 | * This gives 1MB on 4Gig machines | ||
207 | * But only uses 32K on 128M machines. | ||
208 | * Bottom out at 8K on 32M and smaller. | ||
209 | * Of course, this is only a default. | ||
210 | */ | ||
211 | nfsd_max_blksize = NFSSVC_MAXBLKSIZE; | ||
212 | i.totalram <<= PAGE_SHIFT - 12; | ||
213 | while (nfsd_max_blksize > i.totalram && | ||
214 | nfsd_max_blksize >= 8*1024*2) | ||
215 | nfsd_max_blksize /= 2; | ||
216 | } | ||
201 | 217 | ||
202 | atomic_set(&nfsd_busy, 0); | 218 | atomic_set(&nfsd_busy, 0); |
203 | nfsd_serv = svc_create_pooled(&nfsd_program, NFSD_BUFSIZE, | 219 | nfsd_serv = svc_create_pooled(&nfsd_program, |
220 | nfsd_max_blksize, | ||
204 | nfsd_last_thread, | 221 | nfsd_last_thread, |
205 | nfsd, SIG_NOCLEAN, THIS_MODULE); | 222 | nfsd, SIG_NOCLEAN, THIS_MODULE); |
206 | if (nfsd_serv == NULL) | 223 | if (nfsd_serv == NULL) |
@@ -474,12 +491,12 @@ out: | |||
474 | } | 491 | } |
475 | 492 | ||
476 | int | 493 | int |
477 | nfsd_dispatch(struct svc_rqst *rqstp, u32 *statp) | 494 | nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp) |
478 | { | 495 | { |
479 | struct svc_procedure *proc; | 496 | struct svc_procedure *proc; |
480 | kxdrproc_t xdr; | 497 | kxdrproc_t xdr; |
481 | u32 nfserr; | 498 | __be32 nfserr; |
482 | u32 *nfserrp; | 499 | __be32 *nfserrp; |
483 | 500 | ||
484 | dprintk("nfsd_dispatch: vers %d proc %d\n", | 501 | dprintk("nfsd_dispatch: vers %d proc %d\n", |
485 | rqstp->rq_vers, rqstp->rq_proc); | 502 | rqstp->rq_vers, rqstp->rq_proc); |
@@ -498,7 +515,7 @@ nfsd_dispatch(struct svc_rqst *rqstp, u32 *statp) | |||
498 | 515 | ||
499 | /* Decode arguments */ | 516 | /* Decode arguments */ |
500 | xdr = proc->pc_decode; | 517 | xdr = proc->pc_decode; |
501 | if (xdr && !xdr(rqstp, (u32*)rqstp->rq_arg.head[0].iov_base, | 518 | if (xdr && !xdr(rqstp, (__be32*)rqstp->rq_arg.head[0].iov_base, |
502 | rqstp->rq_argp)) { | 519 | rqstp->rq_argp)) { |
503 | dprintk("nfsd: failed to decode arguments!\n"); | 520 | dprintk("nfsd: failed to decode arguments!\n"); |
504 | nfsd_cache_update(rqstp, RC_NOCACHE, NULL); | 521 | nfsd_cache_update(rqstp, RC_NOCACHE, NULL); |
@@ -511,7 +528,7 @@ nfsd_dispatch(struct svc_rqst *rqstp, u32 *statp) | |||
511 | */ | 528 | */ |
512 | nfserrp = rqstp->rq_res.head[0].iov_base | 529 | nfserrp = rqstp->rq_res.head[0].iov_base |
513 | + rqstp->rq_res.head[0].iov_len; | 530 | + rqstp->rq_res.head[0].iov_len; |
514 | rqstp->rq_res.head[0].iov_len += sizeof(u32); | 531 | rqstp->rq_res.head[0].iov_len += sizeof(__be32); |
515 | 532 | ||
516 | /* Now call the procedure handler, and encode NFS status. */ | 533 | /* Now call the procedure handler, and encode NFS status. */ |
517 | nfserr = proc->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp); | 534 | nfserr = proc->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp); |