From: Olga Kornievskaia <kolga@xxxxxxxxxx> According to the RFC 7862, "if the server cannot find a corresponding sa_what, then the status will still be NFS4_OK, but sr_eof would be TRUE". If there is a file that ends with a hole and a SEEK request made for sa_what=SEEK_DATA with an offset in the middle of the last hole, then the server has to return OK and set the eof. Currently the linux server returns ERR_NXIO. Fixes: 24bab491220fa ("NFSD: Implement SEEK") Signed-off-by: Olga Kornievskaia <kolga@xxxxxxxxxx> --- fs/nfsd/nfs4proc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index e13c4c81fb89..2e7ceb9f1d5d 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -1737,9 +1737,13 @@ nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, * should ever file->f_pos. */ seek->seek_pos = vfs_llseek(nf->nf_file, seek->seek_offset, whence); - if (seek->seek_pos < 0) - status = nfserrno(seek->seek_pos); - else if (seek->seek_pos >= i_size_read(file_inode(nf->nf_file))) + if (seek->seek_pos < 0) { + if (whence == SEEK_DATA && + seek->seek_offset < i_size_read(file_inode(nf->nf_file))) + seek->seek_eof = true; + else + status = nfserrno(seek->seek_pos); + } else if (seek->seek_pos >= i_size_read(file_inode(nf->nf_file))) seek->seek_eof = true; out: -- 2.18.2