NFSv4.1/pNFS: Don't request a minimal read layout beyond the end of file
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 31 Aug 2015 09:05:47 +0000 (02:05 -0700)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 31 Aug 2015 09:05:47 +0000 (02:05 -0700)
If we have a read layout, then sanity check the minimal layout length
so that it does not extend beyond the end of file.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/pnfs.c

index c4f918eca3d26d310fa65cdf9a11cec7c586bb45..ba1246433794f0b917ac84738b2d952fd782b2fd 100644 (file)
@@ -868,6 +868,7 @@ send_layoutget(struct pnfs_layout_hdr *lo,
        struct nfs_server *server = NFS_SERVER(ino);
        struct nfs4_layoutget *lgp;
        struct pnfs_layout_segment *lseg;
+       loff_t i_size;
 
        dprintk("--> %s\n", __func__);
 
@@ -875,9 +876,17 @@ send_layoutget(struct pnfs_layout_hdr *lo,
        if (lgp == NULL)
                return NULL;
 
+       i_size = i_size_read(ino);
+
        lgp->args.minlength = PAGE_CACHE_SIZE;
        if (lgp->args.minlength > range->length)
                lgp->args.minlength = range->length;
+       if (range->iomode == IOMODE_READ) {
+               if (range->offset >= i_size)
+                       lgp->args.minlength = 0;
+               else if (i_size - range->offset < lgp->args.minlength)
+                       lgp->args.minlength = i_size - range->offset;
+       }
        lgp->args.maxcount = PNFS_LAYOUT_MAXSIZE;
        lgp->args.range = *range;
        lgp->args.type = server->pnfs_curr_ld->id;