diff options
author | ps <ps@FreeBSD.org> | 2004-12-10 03:27:12 +0000 |
---|---|---|
committer | ps <ps@FreeBSD.org> | 2004-12-10 03:27:12 +0000 |
commit | f46c52047f3fcd319847f2c25bb66800bb5d6b2d (patch) | |
tree | f9c631fca29de61464b46ce9d29d3fe6c3db1b04 /sys | |
parent | f1047725903546a5213ec64e66e804876ad8f471 (diff) | |
download | FreeBSD-src-f46c52047f3fcd319847f2c25bb66800bb5d6b2d.zip FreeBSD-src-f46c52047f3fcd319847f2c25bb66800bb5d6b2d.tar.gz |
Store a hint in the nfsnode to detect sequential access of the file.
Kick off a readahead only when sequential access is detected. This
eliminates wasteful readaheads in random file access.
Submitted by: Mohan Srinivasan mohans at yahoo-inc dot com
Obtained from: Yahoo!
Diffstat (limited to 'sys')
-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 |