[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