On Sat, 22 May 2010 20:57:50 +0530 "Aneesh Kumar K. V" <aneesh.kumar@xxxxxxxxxxxxxxxxxx> wrote: > On Fri, 21 May 2010 18:15:16 -0400, "J. Bruce Fields" <bfields@xxxxxxxxxxxx> wrote: > > On Thu, May 20, 2010 at 01:05:30PM +0530, Aneesh Kumar K.V wrote: > > > The exportfs encode handle function should return the minimum required > > > handle size. This helps user to find out the handle size by passing 0 > > > handle size in the first step and then redoing to the call again with > > > the returned handle size value. > > > > The encode_fh() interface is a little confusing. (Not your fault, > > really, mainly it's the return value (and the special use of 255) that I > > always find odd.) > > > > But maybe it would help to have a little more documention in the > > export_encode_fh() kerneldoc comment and/or in > > Documentation/filesystems/nfs/Exporting? > > > > Kernel documentation says > > * encode_fh: > * @encode_fh should store in the file handle fragment @fh (using at most > * @max_len bytes) information that can be used by @decode_fh to recover the > * file refered to by the &struct dentry @de. If the @connectable flag is > * set, the encode_fh() should store sufficient information so that a good > * attempt can be made to find not only the file but also it's place in the > * filesystem. This typically means storing a reference to de->d_parent in > * the filehandle fragment. encode_fh() should return the number of bytes > * stored or a negative error code such as %-ENOSPC > * > > Clearly the file system encode_fh is not returning the correct return > values. Should i fix the kernel to follow the documentation or should > the kernel documentation should be fixed. I would prefer code, because > the documentation look more easy/clear to follow that returning value 255. > The documentation is wrong in that it never returns the number of bytes. The number of bytes is stored back in the 'max_len' by-reference argument. The return value is a 'type' which is stored in the 4th byte of the filehandle. Error return is by a magic type number (255) simply because it is easier if this is stored temporarily in fb_fileid_type which is __u8. However it doesn't need to be stored there. code like _fh_update(fhp, fhp->fh_export, dentry); if (fhp->fh_handle.fh_fileid_type == 255) return nfserr_opnotsupp; could be changed to err = _fh_update(fhp, fhp->fh_export, dentry); if (err < 0) return nfserr_opnotsupp; and _fh_update could be changed from fhp->fh_handle.fh_fileid_type = exportfs_encode_fh(dentry, fid, &maxsize, subtreecheck); to type = exportfs_encode_fh(dentry, fid, &maxsize, subtreecheck); if (type == 255) type = -ENOSPC; /* temp until filesystems changed*/ if (type > 0) fhp-.fh_filehandle.fh_fileid_type = type; ... return type; And the documentation should be changed to report how the size is returned and that the return value is a type, or an error. NeilBrown -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html