• NeilBrown's avatar
    nfsd: move error choice for incorrect object types to version-specific code. · 438f81e0
    NeilBrown authored
    If an NFS operation expects a particular sort of object (file, dir, link,
    etc) but gets a file handle for a different sort of object, it must
    return an error.  The actual error varies among NFS versions in non-trivial
    ways.
    
    For v2 and v3 there are ISDIR and NOTDIR errors and, for NFSv4 only,
    INVAL is suitable.
    
    For v4.0 there is also NFS4ERR_SYMLINK which should be used if a SYMLINK
    was found when not expected.  This take precedence over NOTDIR.
    
    For v4.1+ there is also NFS4ERR_WRONG_TYPE which should be used in
    preference to EINVAL when none of the specific error codes apply.
    
    When nfsd_mode_check() finds a symlink where it expected a directory it
    needs to return an error code that can be converted to NOTDIR for v2 or
    v3 but will be SYMLINK for v4.  It must be different from the error
    code returns when it finds a symlink but expects a regular file - that
    must be converted to EINVAL or SYMLINK.
    
    So we introduce an internal error code nfserr_symlink_not_dir which each
    version converts as appropriate.
    
    nfsd_check_obj_isreg() is similar to nfsd_mode_check() except that it is
    only used by NFSv4 and only for OPEN.  NFSERR_INVAL is never a suitable
    error if the object is the wrong time.  For v4.0 we use nfserr_symlink
    for non-dirs even if not a symlink.  For v4.1 we have nfserr_wrong_type.
    We handle this difference in-place in nfsd_check_obj_isreg() as there is
    nothing to be gained by delaying the choice to nfsd4_map_status().
    
    As a result of these changes, nfsd_mode_check() doesn't need an rqstp
    arg any more.
    
    Note that NFSv4 operations are actually performed in the xdr code(!!!)
    so to the only place that we can map the status code successfully is in
    nfsd4_encode_operation().
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    438f81e0
nfs4proc.c 101 KB