summaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfsxdr.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2007-05-09 11:34:57 +0200
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-09 21:30:54 +0200
commit072f62ed85a71bbb3429a52678500ec9f9441e0d (patch)
tree016660b8c3de979be1d623c18306ab4c72088adb /fs/nfsd/nfsxdr.c
parentknfsd: trivial makefile cleanup (diff)
downloadlinux-072f62ed85a71bbb3429a52678500ec9f9441e0d.tar.xz
linux-072f62ed85a71bbb3429a52678500ec9f9441e0d.zip
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>
Diffstat (limited to 'fs/nfsd/nfsxdr.c')
-rw-r--r--fs/nfsd/nfsxdr.c39
1 files changed, 14 insertions, 25 deletions
diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c
index 6035e03655c6..cb3e7fadb772 100644
--- a/fs/nfsd/nfsxdr.c
+++ b/fs/nfsd/nfsxdr.c
@@ -231,9 +231,10 @@ int
nfssvc_decode_sattrargs(struct svc_rqst *rqstp, __be32 *p,
struct nfsd_sattrargs *args)
{
- if (!(p = decode_fh(p, &args->fh))
- || !(p = decode_sattr(p, &args->attrs)))
+ p = decode_fh(p, &args->fh);
+ if (!p)
return 0;
+ p = decode_sattr(p, &args->attrs);
return xdr_argsize_check(rqstp, p);
}
@@ -303,29 +304,17 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
/*
* Check to make sure that we got the right number of
* bytes.
- *
- * If more than one page was used, then compute the length
- * of the data in the request as the total size of the
- * request minus the transport protocol headers minus the
- * RPC protocol headers minus the NFS protocol fields
- * already consumed. If the request fits into a single
- * page, then compete the length of the data as the size
- * of the NFS portion of the request minus the NFS
- * protocol fields already consumed.
*/
hdr = (void*)p - rqstp->rq_arg.head[0].iov_base;
- if (rqstp->rq_respages != rqstp->rq_pages + 1) {
- dlen = rqstp->rq_arg.len -
- (PAGE_SIZE - rqstp->rq_arg.head[0].iov_len) - hdr;
- } else {
- dlen = rqstp->rq_arg.head[0].iov_len - hdr;
- }
+ dlen = rqstp->rq_arg.head[0].iov_len + rqstp->rq_arg.page_len
+ - hdr;
+
/*
* Round the length of the data which was specified up to
* the next multiple of XDR units and then compare that
* against the length which was actually received.
*/
- if (dlen != ((len + 3) & ~0x3))
+ if (dlen != XDR_QUADLEN(len)*4)
return 0;
rqstp->rq_vec[0].iov_base = (void*)p;
@@ -346,10 +335,10 @@ int
nfssvc_decode_createargs(struct svc_rqst *rqstp, __be32 *p,
struct nfsd_createargs *args)
{
- if (!(p = decode_fh(p, &args->fh))
- || !(p = decode_filename(p, &args->name, &args->len))
- || !(p = decode_sattr(p, &args->attrs)))
+ if ( !(p = decode_fh(p, &args->fh))
+ || !(p = decode_filename(p, &args->name, &args->len)))
return 0;
+ p = decode_sattr(p, &args->attrs);
return xdr_argsize_check(rqstp, p);
}
@@ -393,11 +382,11 @@ int
nfssvc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p,
struct nfsd_symlinkargs *args)
{
- if (!(p = decode_fh(p, &args->ffh))
- || !(p = decode_filename(p, &args->fname, &args->flen))
- || !(p = decode_pathname(p, &args->tname, &args->tlen))
- || !(p = decode_sattr(p, &args->attrs)))
+ if ( !(p = decode_fh(p, &args->ffh))
+ || !(p = decode_filename(p, &args->fname, &args->flen))
+ || !(p = decode_pathname(p, &args->tname, &args->tlen)))
return 0;
+ p = decode_sattr(p, &args->attrs);
return xdr_argsize_check(rqstp, p);
}