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