diff options
-rw-r--r-- | sys/nfsclient/nfs_bio.c | 5 | ||||
-rw-r--r-- | sys/nfsclient/nfs_vnops.c | 1 | ||||
-rw-r--r-- | sys/nfsclient/nfsnode.h | 1 |
3 files changed, 6 insertions, 1 deletions
diff --git a/sys/nfsclient/nfs_bio.c b/sys/nfsclient/nfs_bio.c index 9e9af49..c6eea93 100644 --- a/sys/nfsclient/nfs_bio.c +++ b/sys/nfsclient/nfs_bio.c @@ -421,8 +421,10 @@ nfs_bioread(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) /* * Start the read ahead(s), as required. + * The readahead is kicked off only if sequential access + * is detected, based on the readahead hint (ra_expect_lbn). */ - if (nmp->nm_readahead > 0) { + if (nmp->nm_readahead > 0 && np->ra_expect_lbn == lbn) { for (nra = 0; nra < nmp->nm_readahead && nra < seqcount && (off_t)(lbn + 1 + nra) * biosize < np->n_size; nra++) { rabn = lbn + 1 + nra; @@ -448,6 +450,7 @@ nfs_bioread(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred) } } } + np->ra_expect_lbn = lbn + 1; } /* diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index 68f63fd..d7f9330 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -434,6 +434,7 @@ nfs_open(struct vop_open_args *ap) np->n_mtime = vattr.va_mtime; } } + np->ra_expect_lbn = 0; return (0); } diff --git a/sys/nfsclient/nfsnode.h b/sys/nfsclient/nfsnode.h index 4a4d835..9889ea4 100644 --- a/sys/nfsclient/nfsnode.h +++ b/sys/nfsclient/nfsnode.h @@ -126,6 +126,7 @@ struct nfsnode { struct nfs4_fctx n_wfc; u_char *n_name; /* leaf name, for v4 OPEN op */ uint32_t n_namelen; + daddr_t ra_expect_lbn; }; #define n_atim n_un1.nf_atim |