Hi Piyush,

On Tue, Jun 16, 2009 at 10:46:40AM -0500, Piyush Shivam wrote:
> On 06/16/09 00:31, Marcel Telka wrote:
>> Hi Piyush,
>>
>> nfs4_srv_attr.c
>> ---------------
>>
>> 1) val is ulong_t. You cannot compare it with -1:
>>
>> 1554         ulong_t val;
>> 1582                 if (val == -1) {
>> 1603                 if (val == -1) {
>>   
>
> It does look tricky. Like Frank explained, I am trying to distinguish  

[...snip...]

> If you have another idea to make that distinction, I will be happy to  
> consider it.

I have no problem with all you said above :-). That's correct. The problem is
that you cannot compare -1 with an ulong_t value. So please consider to
typecast -1 to ulong_t. Something like this:

if (val == (ulong_t)-1) {

My comment was about nothing more, nothing less, just typecast :-).

>
>
>>
>> 2)
>>
>> 1583                         na->maxfilesize = MAXOFF32_T;
>> 1604                         maxfilesize = MAXOFF32_T;
>>
>> Why MAXOFF32_T and not MAXOFFSET_T or MAXOFF_T or ...? Could you elaborate,
>> please?  When _PC_FILESIZEBITS is supported you could return up to 
>> UINT64_MAX,
>> which is a _bit_ bigger than MAXOFF32_T.
>>   
>
> I don't have any strong opinion on the default size that is being  
> returned. Initially, when I started looking at the bug, and saw that the  
> use case was PCFS (not that it is the only file system where NFS may  
> have to return a reasonable default max file size limit),  I realized   
> that for FAT32 file system, the maximum filesize is 4g -1, so 2g seemed  
> reasonable. Then I went and looked at what the NFSv3 code did, and found  
> the following:
>
> 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;
> ..
> }
>
> I did not see a need to make the default max file size inconsistent  
> between NFSv3 and NFSv4. Of course, the above code may be quite old. If  
> someone feels strongly that we need to make the default size UINT64_MAX,  
> then I would suggest that we should change the default across V3 as  
> well, unless we have a good case not to.

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.

>
>>
>> 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.

>> 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... :-)

-- 
Marcel Telka
Solaris RPE

Reply via email to