Hi Piyush,

On Wed, Jun 17, 2009 at 10:20:46AM -0500, Piyush Shivam wrote:
> Hi Marcel,
>
> On 06/17/09 00:07, Marcel Telka wrote:
> <snip>
>> if (val == (ulong_t)-1) {
>>
>> My comment was about nothing more, nothing less, just typecast :-).\
>>   
> OK. I will add the typecast.

Thanks.

>>> rfs3_fsinfo(..)
>>> {
>>> ..
>>>        /*
>>>         * Large file spec: want maxfilesize based on limit of
>>>         * underlying filesystem.  We can guess 2^31-1 if need be.
>>>         */
>>>        error = VOP_PATHCONF(vp, _PC_FILESIZEBITS, &l, cr, NULL);
>>>
>>>        if (!error && l != 0 && l <= 64)
>>>                resp->resok.maxfilesize = (1LL << (l-1)) - 1;
>>>        else
>>>                resp->resok.maxfilesize = MAXOFF32_T;
>>> ..
>>> }
>>>
>>
>> Ok. Thank you for the explanation. MAXOFF32_T now makes sense. The another
>> small problem I see now is that NFSv3 and NFSv4 could behave differently. 
>> What
>> about unifiyng both NFSv3 and NFSv4 approaches?
>>
>> Is (l-1) above correct? I suspect no.
>>   
> "l"-1 does seem like it requires a closer look.  In my understanding,  

Please let me show you different problem with l-1:


The code for NFSv4 is doing this:

VOP_PATHCONF(vp, _PC_FILESIZEBITS, &pc_val, cr);
pce->maxfilesize = ((1LL << pc_val) - 1);


The NFSv3 code is doing this:


VOP_PATHCONF(vp, _PC_FILESIZEBITS, &l, cr, NULL);
resp->resok.maxfilesize = (1LL << (l-1)) - 1;


Do you see the difference? For NFSv3 case we return only (approx.) half value of
max file size.


Another problem I see above with NFSv4 implementation is number of parameters
in VOP_PATHCONF() macro/call. There are only 4 instead of 5 as in NFSv3 
implementation and in
VOP_PATHCONF() definition too:
http://grok.czech.sun.com:8080/source/xref/onnv-clone/usr/src/uts/common/sys/vnode.h#1066

How it would even compile without a warning?



> the behavior will not be different in the case "l" = -1, i.e., there is  
> no underlying support for _PC_FILESIZEBITS. This is because, when doing  
> the check  "if (!error && l != 0 && l <= 64)", the check will fail even  
> though "l" is -1.  Since "l" is interpreted as unsigned long (rules of  
> promotion will kick in while comparing a signed and an unsigned  
> quantity), it is larger than 64, hence the else part will get invoked.
>
> But, if there is indeed an error and underlying support for  
> _PC_FILESIZEBITS exists, then instead of bailing out, we will assign a  
> default value, which is a bug (and a different behavior, like you said).  
> I think it should be easy to add my v4 fix in v3 code as well.
>
>>>> 3) Why there is comment in the NFS4ATTR_GETIT case only? I am missing some
>>>> comment in the NFS4ATTR_VERIT case.
>>>>         
>>> I did consider putting that comment in the VERIT case as well. 
>>> However,  I saw that the first set of comments is just a few lines 
>>> above it, and I  did not want to duplicate comments that are less 
>>> than 15 lines or so  apart. I can add comments in nfs4_srv_readdir.c 
>>> if you think that will help.
>>>     
>>
>> The problem is that a random reader in the middle of the code will not know
>> that the relevant comment is about 15 lines above (or in another file, in
>> nfs4_srv_readdir.c case).
>>
>> More comments in the code is better than less comments. Please consider to
>> copy'n'paste the comment to other two places.
>>   
> OK. I will add the comments.

Thanks.

>>   
>>>> 4) When _PC_FILESIZEBITS is not supported VOP_PATHCONF() will fail and 
>>>> return
>>>> EINVAL (according to the comments section in the CR), so the codepath will
>>>> break at line 1574 and your fix won't be used to salvage the situation:
>>>>
>>>> 1571                 error = VOP_PATHCONF(sarg->cs->vp, _PC_FILESIZEBITS, 
>>>> &val,
>>>> 1572                     sarg->cs->cr, NULL);
>>>> 1573                 if (error)
>>>> 1574                         break;
>>>> 1575 1576                 /*
>>>> 1577                  * If the underlying file system does not support
>>>> 1578                  * _PC_FILESIZEBITS, return a reasonable default. 
>>>> Note that
>>>> 1579                  * error code on VOP_PATHCONF will be 0, even if the 
>>>> underlying
>>>> 1580                  * file system does not support _PC_FILESIZEBITS.
>>>> 1581                  */
>>>> 1582                 if (val == -1) {
>>>> 1583                         na->maxfilesize = MAXOFF32_T;
>>>> 1584                 } else {
>>>> 1585                         if (val >= (sizeof (uint64_t) * 8))
>>>> 1586                                 na->maxfilesize = UINT64_MAX;
>>>> 1587                         else
>>>> 1588                                 na->maxfilesize = ((1LL << val) - 1);
>>>> 1589                 }
>>>>         
>>> I believe that Frank has addressed this at length. Please let me know 
>>> if  they is still any confusion.
>>>     
>>
>> It is clear now. Thanks. But please consider to change Comments section in 
>> the
>> CR to remove any possible confusions for future. Obviously, this is not
>> critical for the fix... :-)
>>   
> Sure, will do.

Thanks again :-).

>
> I will make the changes and repost the updated webrev soon.
>
> -Piyush

-- 
Marcel Telka
Solaris RPE

Reply via email to