diff options
author | J. Bruce Fields <bfields@redhat.com> | 2013-06-21 23:06:29 +0200 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2013-07-01 23:32:03 +0200 |
commit | 590b743143eae8db40abdfd1ab20bc51ee0ee5db (patch) | |
tree | 833e4d8b1825f4a07bb1719178af1f9d181217ec /fs/nfsd/nfs4xdr.c | |
parent | nfsd4: fix decoding of compounds across page boundaries (diff) | |
download | linux-590b743143eae8db40abdfd1ab20bc51ee0ee5db.tar.xz linux-590b743143eae8db40abdfd1ab20bc51ee0ee5db.zip |
nfsd4: minor read_buf cleanup
The code to step to the next page seems reasonably self-contained.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index e34f5ebfc811..c102d2509a2a 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -139,6 +139,19 @@ xdr_error: \ } \ } while (0) +static void next_decode_page(struct nfsd4_compoundargs *argp) +{ + argp->pagelist++; + argp->p = page_address(argp->pagelist[0]); + if (argp->pagelen < PAGE_SIZE) { + argp->end = argp->p + (argp->pagelen>>2); + argp->pagelen = 0; + } else { + argp->end = argp->p + (PAGE_SIZE>>2); + argp->pagelen -= PAGE_SIZE; + } +} + static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes) { /* We want more bytes than seem to be available. @@ -166,16 +179,7 @@ static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes) * guarantee p points to at least nbytes bytes. */ memcpy(p, argp->p, avail); - /* step to next page */ - argp->pagelist++; - argp->p = page_address(argp->pagelist[0]); - if (argp->pagelen < PAGE_SIZE) { - argp->end = argp->p + (argp->pagelen>>2); - argp->pagelen = 0; - } else { - argp->end = argp->p + (PAGE_SIZE>>2); - argp->pagelen -= PAGE_SIZE; - } + next_decode_page(argp); memcpy(((char*)p)+avail, argp->p, (nbytes - avail)); argp->p += XDR_QUADLEN(nbytes - avail); return p; |