pnfs: check that partial LAYOUTGET return is ignored
authorFred Isaman <iisaman@netapp.com>
Thu, 6 Jan 2011 11:36:27 +0000 (11:36 +0000)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 6 Jan 2011 19:46:32 +0000 (14:46 -0500)
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>
fs/nfs/pnfs.c

index c00b673..cd99064 100644 (file)
@@ -660,6 +660,17 @@ pnfs_layout_process(struct nfs4_layoutget *lgp)
        struct inode *ino = lo->plh_inode;
        int status = 0;
 
+       /* Verify we got what we asked for.
+        * Note that because the xdr parsing only accepts a single
+        * element array, this can fail even if the server is behaving
+        * correctly.
+        */
+       if (lgp->args.range.iomode > res->range.iomode ||
+           res->range.offset != 0 ||
+           res->range.length != NFS4_MAX_UINT64) {
+               status = -EINVAL;
+               goto out;
+       }
        /* Inject layout blob into I/O device driver */
        lseg = NFS_SERVER(ino)->pnfs_curr_ld->alloc_lseg(lo, res);
        if (!lseg || IS_ERR(lseg)) {