• Chuck Lever's avatar
    NFSD: COMMIT operations must not return NFS?ERR_INVAL · 3f965021
    Chuck Lever authored
    Since, well, forever, the Linux NFS server's nfsd_commit() function
    has returned nfserr_inval when the passed-in byte range arguments
    were non-sensical.
    
    However, according to RFC 1813 section 3.3.21, NFSv3 COMMIT requests
    are permitted to return only the following non-zero status codes:
    
          NFS3ERR_IO
          NFS3ERR_STALE
          NFS3ERR_BADHANDLE
          NFS3ERR_SERVERFAULT
    
    NFS3ERR_INVAL is not included in that list. Likewise, NFS4ERR_INVAL
    is not listed in the COMMIT row of Table 6 in RFC 8881.
    
    RFC 7530 does permit COMMIT to return NFS4ERR_INVAL, but does not
    specify when it can or should be used.
    
    Instead of dropping or failing a COMMIT request in a byte range that
    is not supported, turn it into a valid request by treating one or
    both arguments as zero. Offset zero means start-of-file, count zero
    means until-end-of-file, so we only ever extend the commit range.
    NFS servers are always allowed to commit more and sooner than
    requested.
    
    The range check is no longer bounded by NFS_OFFSET_MAX, but rather
    by the value that is returned in the maxfilesize field of the NFSv3
    FSINFO procedure or the NFSv4 maxfilesize file attribute.
    
    Note that this change results in a new pynfs failure:
    
    CMT4     st_commit.testCommitOverflow                             : RUNNING
    CMT4     st_commit.testCommitOverflow                             : FAILURE
               COMMIT with offset + count overflow should return
               NFS4ERR_INVAL, instead got NFS4_OK
    
    IMO the test is not correct as written: RFC 8881 does not allow the
    COMMIT operation to return NFS4ERR_INVAL.
    Reported-by: default avatarDan Aloni <dan.aloni@vastdata.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Reviewed-by: default avatarBruce Fields <bfields@fieldses.org>
    3f965021
vfs.c 58.8 KB