[pnfs] holey file cthon test
Benny Halevy
bhalevy at panasas.com
Wed Sep 6 15:47:21 EDT 2006
Yay, cthon04 passes with this patch.
I guess I'll submit to our cvs tree then :)
Benny
Benny Halevy wrote:
> 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
>>
>>
>
>
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
More information about the pNFS
mailing list