On Wed, 10 Sep 2025, Chuck Lever wrote: > 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. I think that current test against rq_maxpages (in the WARN_ON) only makes sense if .page_len was zero. NeilBrown > > > -- > Chuck Lever >