[pnfs] holey file cthon test
Benny Halevy
bhalevy at panasas.com
Wed Sep 6 16:15:50 EDT 2006
Ok. I didn't commit it.
Benny
Dean Hildebrand wrote:
> Please don't, it will confuse our pNFS changes from the NFSv4
> changes. We should re-base our CVS tree, and include all of the NFS
> specific patches (large wsize, holey patch, others?)
> Dean
>
> Benny Halevy wrote:
>
>> 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
>>
>>
>>
>>
>> _______________________________________________
>> pNFS mailing list
>> pNFS at linux-nfs.org
>> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
>
>
More information about the pNFS
mailing list