Commit 072f62ed85a71bbb3429a52678500ec9f9441e0d

Authored by NeilBrown
Committed by Linus Torvalds
1 parent f725b217b1

knfsd: various nfsd xdr cleanups

1/ decode_sattr and decode_sattr3 never return NULL, so remove
   several checks for that. ditto for xdr_decode_hyper.

2/ replace some open coded XDR_QUADLEN calls with calls to
   XDR_QUADLEN

3/ in decode_writeargs, simply an 'if' to use a single
   calculation.
   .page_len is the length of that part of the packet that did
   not fit in the first page (the head).
   So the length of the data part is the remainder of the
   head, plus page_len.

3/ other minor cleanups.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 2 changed files with 34 additions and 60 deletions Side-by-side Diff

... ... @@ -239,7 +239,7 @@
239 239 encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
240 240 {
241 241 struct dentry *dentry = fhp->fh_dentry;
242   - if (dentry && dentry->d_inode != NULL) {
  242 + if (dentry && dentry->d_inode) {
243 243 int err;
244 244 struct kstat stat;
245 245  
246 246  
... ... @@ -300,9 +300,9 @@
300 300 nfs3svc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p,
301 301 struct nfsd3_sattrargs *args)
302 302 {
303   - if (!(p = decode_fh(p, &args->fh))
304   - || !(p = decode_sattr3(p, &args->attrs)))
  303 + if (!(p = decode_fh(p, &args->fh)))
305 304 return 0;
  305 + p = decode_sattr3(p, &args->attrs);
306 306  
307 307 if ((args->check_guard = ntohl(*p++)) != 0) {
308 308 struct timespec time;
309 309  
... ... @@ -343,9 +343,9 @@
343 343 int v,pn;
344 344 u32 max_blocksize = svc_max_payload(rqstp);
345 345  
346   - if (!(p = decode_fh(p, &args->fh))
347   - || !(p = xdr_decode_hyper(p, &args->offset)))
  346 + if (!(p = decode_fh(p, &args->fh)))
348 347 return 0;
  348 + p = xdr_decode_hyper(p, &args->offset);
349 349  
350 350 len = args->count = ntohl(*p++);
351 351  
352 352  
... ... @@ -372,9 +372,9 @@
372 372 unsigned int len, v, hdr, dlen;
373 373 u32 max_blocksize = svc_max_payload(rqstp);
374 374  
375   - if (!(p = decode_fh(p, &args->fh))
376   - || !(p = xdr_decode_hyper(p, &args->offset)))
  375 + if (!(p = decode_fh(p, &args->fh)))
377 376 return 0;
  377 + p = xdr_decode_hyper(p, &args->offset);
378 378  
379 379 args->count = ntohl(*p++);
380 380 args->stable = ntohl(*p++);
381 381  
382 382  
... ... @@ -388,29 +388,16 @@
388 388 /*
389 389 * Check to make sure that we got the right number of
390 390 * bytes.
391   - *
392   - * If more than one page was used, then compute the length
393   - * of the data in the request as the total size of the
394   - * request minus the transport protocol headers minus the
395   - * RPC protocol headers minus the NFS protocol fields
396   - * already consumed. If the request fits into a single
397   - * page, then compete the length of the data as the size
398   - * of the NFS portion of the request minus the NFS
399   - * protocol fields already consumed.
400 391 */
401 392 hdr = (void*)p - rqstp->rq_arg.head[0].iov_base;
402   - if (rqstp->rq_respages != rqstp->rq_pages + 1) {
403   - dlen = rqstp->rq_arg.len -
404   - (PAGE_SIZE - rqstp->rq_arg.head[0].iov_len) - hdr;
405   - } else {
406   - dlen = rqstp->rq_arg.head[0].iov_len - hdr;
407   - }
  393 + dlen = rqstp->rq_arg.head[0].iov_len + rqstp->rq_arg.page_len
  394 + - hdr;
408 395 /*
409 396 * Round the length of the data which was specified up to
410 397 * the next multiple of XDR units and then compare that
411 398 * against the length which was actually received.
412 399 */
413   - if (dlen != ((len + 3) & ~0x3))
  400 + if (dlen != XDR_QUADLEN(len)*4)
414 401 return 0;
415 402  
416 403 if (args->count > max_blocksize) {
... ... @@ -442,8 +429,7 @@
442 429 switch (args->createmode = ntohl(*p++)) {
443 430 case NFS3_CREATE_UNCHECKED:
444 431 case NFS3_CREATE_GUARDED:
445   - if (!(p = decode_sattr3(p, &args->attrs)))
446   - return 0;
  432 + p = decode_sattr3(p, &args->attrs);
447 433 break;
448 434 case NFS3_CREATE_EXCLUSIVE:
449 435 args->verf = p;
450 436  
... ... @@ -459,10 +445,10 @@
459 445 nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, __be32 *p,
460 446 struct nfsd3_createargs *args)
461 447 {
462   - if (!(p = decode_fh(p, &args->fh))
463   - || !(p = decode_filename(p, &args->name, &args->len))
464   - || !(p = decode_sattr3(p, &args->attrs)))
  448 + if (!(p = decode_fh(p, &args->fh)) ||
  449 + !(p = decode_filename(p, &args->name, &args->len)))
465 450 return 0;
  451 + p = decode_sattr3(p, &args->attrs);
466 452  
467 453 return xdr_argsize_check(rqstp, p);
468 454 }
469 455  
... ... @@ -476,11 +462,12 @@
476 462 char *old, *new;
477 463 struct kvec *vec;
478 464  
479   - if (!(p = decode_fh(p, &args->ffh))
480   - || !(p = decode_filename(p, &args->fname, &args->flen))
481   - || !(p = decode_sattr3(p, &args->attrs))
  465 + if (!(p = decode_fh(p, &args->ffh)) ||
  466 + !(p = decode_filename(p, &args->fname, &args->flen))
482 467 )
483 468 return 0;
  469 + p = decode_sattr3(p, &args->attrs);
  470 +
484 471 /* now decode the pathname, which might be larger than the first page.
485 472 * As we have to check for nul's anyway, we copy it into a new page
486 473 * This page appears in the rq_res.pages list, but as pages_len is always
... ... @@ -530,10 +517,8 @@
530 517 args->ftype = ntohl(*p++);
531 518  
532 519 if (args->ftype == NF3BLK || args->ftype == NF3CHR
533   - || args->ftype == NF3SOCK || args->ftype == NF3FIFO) {
534   - if (!(p = decode_sattr3(p, &args->attrs)))
535   - return 0;
536   - }
  520 + || args->ftype == NF3SOCK || args->ftype == NF3FIFO)
  521 + p = decode_sattr3(p, &args->attrs);
537 522  
538 523 if (args->ftype == NF3BLK || args->ftype == NF3CHR) {
539 524 args->major = ntohl(*p++);
... ... @@ -231,9 +231,10 @@
231 231 nfssvc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p,
232 232 struct nfsd_sattrargs *args)
233 233 {
234   - if (!(p = decode_fh(p, &args->fh))
235   - || !(p = decode_sattr(p, &args->attrs)))
  234 + p = decode_fh(p, &args->fh);
  235 + if (!p)
236 236 return 0;
  237 + p = decode_sattr(p, &args->attrs);
237 238  
238 239 return xdr_argsize_check(rqstp, p);
239 240 }
240 241  
241 242  
... ... @@ -303,29 +304,17 @@
303 304 /*
304 305 * Check to make sure that we got the right number of
305 306 * bytes.
306   - *
307   - * If more than one page was used, then compute the length
308   - * of the data in the request as the total size of the
309   - * request minus the transport protocol headers minus the
310   - * RPC protocol headers minus the NFS protocol fields
311   - * already consumed. If the request fits into a single
312   - * page, then compete the length of the data as the size
313   - * of the NFS portion of the request minus the NFS
314   - * protocol fields already consumed.
315 307 */
316 308 hdr = (void*)p - rqstp->rq_arg.head[0].iov_base;
317   - if (rqstp->rq_respages != rqstp->rq_pages + 1) {
318   - dlen = rqstp->rq_arg.len -
319   - (PAGE_SIZE - rqstp->rq_arg.head[0].iov_len) - hdr;
320   - } else {
321   - dlen = rqstp->rq_arg.head[0].iov_len - hdr;
322   - }
  309 + dlen = rqstp->rq_arg.head[0].iov_len + rqstp->rq_arg.page_len
  310 + - hdr;
  311 +
323 312 /*
324 313 * Round the length of the data which was specified up to
325 314 * the next multiple of XDR units and then compare that
326 315 * against the length which was actually received.
327 316 */
328   - if (dlen != ((len + 3) & ~0x3))
  317 + if (dlen != XDR_QUADLEN(len)*4)
329 318 return 0;
330 319  
331 320 rqstp->rq_vec[0].iov_base = (void*)p;
332 321  
... ... @@ -346,10 +335,10 @@
346 335 nfssvc_decode_createargs(struct svc_rqst *rqstp, __be32 *p,
347 336 struct nfsd_createargs *args)
348 337 {
349   - if (!(p = decode_fh(p, &args->fh))
350   - || !(p = decode_filename(p, &args->name, &args->len))
351   - || !(p = decode_sattr(p, &args->attrs)))
  338 + if ( !(p = decode_fh(p, &args->fh))
  339 + || !(p = decode_filename(p, &args->name, &args->len)))
352 340 return 0;
  341 + p = decode_sattr(p, &args->attrs);
353 342  
354 343 return xdr_argsize_check(rqstp, p);
355 344 }
356 345  
... ... @@ -393,11 +382,11 @@
393 382 nfssvc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p,
394 383 struct nfsd_symlinkargs *args)
395 384 {
396   - if (!(p = decode_fh(p, &args->ffh))
397   - || !(p = decode_filename(p, &args->fname, &args->flen))
398   - || !(p = decode_pathname(p, &args->tname, &args->tlen))
399   - || !(p = decode_sattr(p, &args->attrs)))
  385 + if ( !(p = decode_fh(p, &args->ffh))
  386 + || !(p = decode_filename(p, &args->fname, &args->flen))
  387 + || !(p = decode_pathname(p, &args->tname, &args->tlen)))
400 388 return 0;
  389 + p = decode_sattr(p, &args->attrs);
401 390  
402 391 return xdr_argsize_check(rqstp, p);
403 392 }