On 9/9/25 7:39 PM, Chuck Lever wrote: >> diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c >> index 441267d877f9..9665454743eb 100644 >> --- a/fs/nfsd/vfs.c >> +++ b/fs/nfsd/vfs.c >> @@ -1074,6 +1074,79 @@ __be32 nfsd_splice_read(struct svc_rqst *rqstp, struct svc_fh *fhp, >> return nfsd_finish_read(rqstp, fhp, file, offset, count, eof, host_err); >> } >> >> +/* >> + * The byte range of the client's READ request is expanded on both >> + * ends until it meets the underlying file system's direct I/O >> + * alignment requirements. After the internal read is complete, the >> + * byte range of the NFS READ payload is reduced to the byte range >> + * that was originally requested. >> + * >> + * Note that a direct read can be done only when the xdr_buf >> + * containing the NFS READ reply does not already have contents in >> + * its .pages array. This is due to potentially restrictive >> + * alignment requirements on the read buffer. When .page_len and >> + * @base are zero, the .pages array is guaranteed to be page- >> + * aligned. > Where do we test that this condition is met? > > I can see that nfsd_direct_read() is only called if "base" is zero, but > that means the current contents of the .pages array are page-aligned, > not that there are now. The above comment might be stale; I'm not sure the .page_len test is necessary. As long as the payload starts on a page boundary, it should meet most any plausible buffer alignment restriction. However, if there are additional restrictions needed, checks can be added in nfsd_iter_read() just before nfsd_direct_read() is called. -- Chuck Lever