[pnfs] holey file cthon test
Benny Halevy
bhalevy at panasas.com
Wed Sep 6 15:30:57 EDT 2006
Looks right. I'll try it out...
Benny
J. Bruce Fields wrote:
>On Wed, Sep 06, 2006 at 11:41:48AM -0700, Garth Goodson wrote:
>
>
>>Can we patch our cvs tree to fix this problem, so that we can try to get
>>the connectathon suite running?
>>
>>
>
>I *think* this was probably it (I guess it was Trond's patch, not
>Steve's, I misrememberd). Does this apply to your tree?
>
>--b.
>
>commit 79558f3610efd7928e8882b2eaca3093b283630e
>Author: Trond Myklebust <Trond.Myklebust at netapp.com>
>Date: Tue Aug 22 13:44:32 2006 -0400
>
> NFS: Fix issue with EIO on NFS read
>
> The problem is that we may be caching writes that would extend the file and
> create a hole in the region that we are reading. In this case, we need to
> detect the eof from the server, ensure that we zero out the pages that
> are part of the hole and mark them as up to date.
>
> Signed-off-by: Trond Myklebust <Trond.Myklebust at netapp.com>
> (cherry picked from 856b603b01b99146918c093969b6cb1b1b0f1c01 commit)
>
>diff --git a/fs/nfs/read.c b/fs/nfs/read.c
>index 65c0c5b..da9cf11 100644
>--- a/fs/nfs/read.c
>+++ b/fs/nfs/read.c
>@@ -116,10 +116,17 @@ static void nfs_readpage_truncate_uninit
> pages = &data->args.pages[base >> PAGE_CACHE_SHIFT];
> base &= ~PAGE_CACHE_MASK;
> pglen = PAGE_CACHE_SIZE - base;
>- if (pglen < remainder)
>+ for (;;) {
>+ if (remainder <= pglen) {
>+ memclear_highpage_flush(*pages, base, remainder);
>+ break;
>+ }
> memclear_highpage_flush(*pages, base, pglen);
>- else
>- memclear_highpage_flush(*pages, base, remainder);
>+ pages++;
>+ remainder -= pglen;
>+ pglen = PAGE_CACHE_SIZE;
>+ base = 0;
>+ }
> }
>
> /*
>@@ -476,6 +483,8 @@ static void nfs_readpage_set_pages_uptod
> unsigned int base = data->args.pgbase;
> struct page **pages;
>
>+ if (data->res.eof)
>+ count = data->args.count;
> if (unlikely(count == 0))
> return;
> pages = &data->args.pages[base >> PAGE_CACHE_SHIFT];
>@@ -483,11 +492,7 @@ static void nfs_readpage_set_pages_uptod
> count += base;
> for (;count >= PAGE_CACHE_SIZE; count -= PAGE_CACHE_SIZE, pages++)
> SetPageUptodate(*pages);
>- /*
>- * Was this an eof or a short read? If the latter, don't mark the page
>- * as uptodate yet.
>- */
>- if (count > 0 && (data->res.eof || data->args.count == data->res.count))
>+ if (count != 0)
> SetPageUptodate(*pages);
> }
>
>@@ -502,6 +507,8 @@ static void nfs_readpage_set_pages_error
> count += base;
> for (;count >= PAGE_CACHE_SIZE; count -= PAGE_CACHE_SIZE, pages++)
> SetPageError(*pages);
>+ if (count != 0)
>+ SetPageError(*pages);
> }
>
> /*
>_______________________________________________
>pNFS mailing list
>pNFS at linux-nfs.org
>http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
>
>
More information about the pNFS
mailing list