aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_cluster.c
diff options
context:
space:
mode:
authorJeff Roberson <jeff@FreeBSD.org>2003-03-30 02:57:32 +0000
committerJeff Roberson <jeff@FreeBSD.org>2003-03-30 02:57:32 +0000
commitabb0e6da6b80d999ab6fa9f0e18042d88c13661d (patch)
treea3d9f21599df88e8febef828d6711d3d729f82a8 /sys/kern/vfs_cluster.c
parentde54353fb88689ba1351ca5750a9e383c67e1721 (diff)
downloadsrc-abb0e6da6b80d999ab6fa9f0e18042d88c13661d.tar.gz
src-abb0e6da6b80d999ab6fa9f0e18042d88c13661d.zip
- We are not guaranteed that read ahead blocks are not in memory already.
Check for B_DELWRI as well as B_CACHED before issuing io on a buffer. This is especially important since we are changing the b_iocmd.
Notes
Notes: svn path=/head/; revision=112838
Diffstat (limited to 'sys/kern/vfs_cluster.c')
-rw-r--r--sys/kern/vfs_cluster.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/kern/vfs_cluster.c b/sys/kern/vfs_cluster.c
index bd5914e625d2..bd82627b5114 100644
--- a/sys/kern/vfs_cluster.c
+++ b/sys/kern/vfs_cluster.c
@@ -264,12 +264,20 @@ cluster_read(vp, filesize, lblkno, size, cred, totread, seqcount, bpp)
rbp = cluster_rbuild(vp, filesize, lblkno, blkno,
size, ncontig, NULL);
lblkno += (rbp->b_bufsize / size);
+ if (rbp->b_flags & B_DELWRI) {
+ bqrelse(rbp);
+ continue;
+ }
} else {
rbp = getblk(vp, lblkno, size, 0, 0, 0);
+ lblkno += 1;
+ if (rbp->b_flags & B_DELWRI) {
+ bqrelse(rbp);
+ continue;
+ }
rbp->b_flags |= B_ASYNC | B_RAM;
rbp->b_iocmd = BIO_READ;
rbp->b_blkno = blkno;
- lblkno += 1;
}
if (rbp->b_flags & B_CACHE) {
rbp->b_flags &= ~B_ASYNC;