git: c68db4608ef6 - main - Revert "nfscl: Do not do readahead for directories"

From: Rick Macklem <rmacklem_at_FreeBSD.org>
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;