]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Cache bypass: make readpage deal with reads at end of file
authorMarc Dionne <marc.c.dionne@gmail.com>
Sun, 7 Nov 2010 18:14:55 +0000 (13:14 -0500)
committerDerrick Brashear <shadow@dementia.org>
Tue, 11 Jan 2011 20:34:31 +0000 (12:34 -0800)
When a file's size is an exact multiple of the page size, the vfs
will issue a readpage for an extra page at the end, for which there
is no data.  Deal with it here instead of letting it trickle down
to the background daemon, which will issue an unnecessary read to the
server, and maybe get confused because there is no data.

Reviewed-on: http://gerrit.openafs.org/3281
Reviewed-by: Matt Benjamin <matt@linuxbox.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 8ec31f26770ef1e85fb3a6005467f0e2d3ce1715)

Change-Id: Ib47a8cc62611c6e7c904898990b38ae48d8478e3
Reviewed-on: http://gerrit.openafs.org/3642
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/afs/LINUX/osi_vnodeops.c

index 8df04ec767e45a6124c97629578bc4455d8ed0f3..b799bc115f532e7e8e844946bca15684a9969e40 100644 (file)
@@ -1809,6 +1809,17 @@ afs_linux_bypass_readpage(struct file *fp, struct page *pp)
     struct nocache_read_request *ancr;
     int code;
 
+    /*
+     * Special case: if page is at or past end of file, just zero it and set
+     * it as up to date.
+     */
+    if (page_offset(pp) >=  i_size_read(fp->f_mapping->host)) {
+       zero_user_segment(pp, 0, PAGE_CACHE_SIZE);
+       SetPageUptodate(pp);
+       unlock_page(pp);
+       return 0;
+    }
+
     ClearPageError(pp);
 
     /* receiver frees */