aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorFred Isaman <iisaman@netapp.com>2011-01-06 06:36:27 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2011-01-06 14:46:32 -0500
commitfc1794c5b04f5322bad05385cd91b52ec85aab72 (patch)
tree9d77a81dcdf6f858e20c8d8224e44dac13644dd5 /fs/nfs
parent2130ff663633e8a57921779ebfe62fc39d5585ec (diff)
pnfs: check that partial LAYOUTGET return is ignored
Either a bad server reply, or our ignoring of multiple array segments in a reply, can cause a reply to not meet our requirements. Ensure that we ignore such replies. Signed-off-by: Fred Isaman <iisaman@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/pnfs.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index c00b673261f9..cd9906415a14 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -660,6 +660,17 @@ pnfs_layout_process(struct nfs4_layoutget *lgp)
660 struct inode *ino = lo->plh_inode; 660 struct inode *ino = lo->plh_inode;
661 int status = 0; 661 int status = 0;
662 662
663 /* Verify we got what we asked for.
664 * Note that because the xdr parsing only accepts a single
665 * element array, this can fail even if the server is behaving
666 * correctly.
667 */
668 if (lgp->args.range.iomode > res->range.iomode ||
669 res->range.offset != 0 ||
670 res->range.length != NFS4_MAX_UINT64) {
671 status = -EINVAL;
672 goto out;
673 }
663 /* Inject layout blob into I/O device driver */ 674 /* Inject layout blob into I/O device driver */
664 lseg = NFS_SERVER(ino)->pnfs_curr_ld->alloc_lseg(lo, res); 675 lseg = NFS_SERVER(ino)->pnfs_curr_ld->alloc_lseg(lo, res);
665 if (!lseg || IS_ERR(lseg)) { 676 if (!lseg || IS_ERR(lseg)) {