git: c68db4608ef6 - main - Revert "nfscl: Do not do readahead for directories"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 26 May 2024 15:05:14 UTC
The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=c68db4608ef63534a001b55de80995e1c3442d2a commit c68db4608ef63534a001b55de80995e1c3442d2a Author: Rick Macklem <rmacklem@FreeBSD.org> AuthorDate: 2024-05-26 15:02:30 +0000 Commit: Rick Macklem <rmacklem@FreeBSD.org> CommitDate: 2024-05-26 15:02:30 +0000 Revert "nfscl: Do not do readahead for directories" The PR reported hangs that were avoided when this commit was reverted. Since it was only a cleanup, revert it. The LORs in the PR need further investigation, since I think readahead only hides the problem. PR: 279138 This reverts commit fbe965591f8a0a32c805a279a2505d4c20d22d26. --- sys/fs/nfsclient/nfs_clbio.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c index fe2ed0dff0dd..e181bf593e23 100644 --- a/sys/fs/nfsclient/nfs_clbio.c +++ b/sys/fs/nfsclient/nfs_clbio.c @@ -679,6 +679,36 @@ ncl_bioread(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) goto out; } + /* + * If not eof and read aheads are enabled, start one. + * (You need the current block first, so that you have the + * directory offset cookie of the next block.) + */ + NFSLOCKNODE(np); + if (nmp->nm_readahead > 0 && ncl_bioread_dora(vp) && + (bp->b_flags & B_INVAL) == 0 && + (np->n_direofoffset == 0 || + (lbn + 1) * NFS_DIRBLKSIZ < np->n_direofoffset) && + incore(&vp->v_bufobj, lbn + 1) == NULL) { + NFSUNLOCKNODE(np); + rabp = nfs_getcacheblk(vp, lbn + 1, NFS_DIRBLKSIZ, td); + if (rabp) { + if ((rabp->b_flags & (B_CACHE|B_DELWRI)) == 0) { + rabp->b_flags |= B_ASYNC; + rabp->b_iocmd = BIO_READ; + vfs_busy_pages(rabp, 0); + if (ncl_asyncio(nmp, rabp, cred, td)) { + rabp->b_flags |= B_INVAL; + rabp->b_ioflags |= BIO_ERROR; + vfs_unbusy_pages(rabp); + brelse(rabp); + } + } else { + brelse(rabp); + } + } + NFSLOCKNODE(np); + } /* * Unlike VREG files, whos buffer size ( bp->b_bcount ) is * chopped for the EOF condition, we cannot tell how large @@ -691,7 +721,6 @@ ncl_bioread(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) * in np->n_direofoffset and chop it off as an extra step * right here. */ - NFSLOCKNODE(np); n = lmin(uio->uio_resid, NFS_DIRBLKSIZ - bp->b_resid - on); if (np->n_direofoffset && n > np->n_direofoffset - uio->uio_offset) n = np->n_direofoffset - uio->uio_offset;