summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_default.c
diff options
context:
space:
mode:
authorart <art@openbsd.org>2001-11-29 01:58:57 +0000
committerart <art@openbsd.org>2001-11-29 01:58:57 +0000
commit5139d36352307145e2cca2a0165ab8944518fb08 (patch)
treee9b511f822fac9a30d8d37281cb7ba7770bc84cc /sys/kern/vfs_default.c
parentUse getifaddrs(3) instead of SIOCGIFCONF, SIOCGIFADDR, SIOCGIFNETMASK, (diff)
downloadwireguard-openbsd-5139d36352307145e2cca2a0165ab8944518fb08.tar.xz
wireguard-openbsd-5139d36352307145e2cca2a0165ab8944518fb08.zip
Correctly handle b_vp with bgetvp and brelvp in {get,put}pages.
Prevents panics caused by vnodes being recycled under our feet.
Diffstat (limited to 'sys/kern/vfs_default.c')
-rw-r--r--sys/kern/vfs_default.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 61f6d0217e9..89b1edee6a6 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_default.c,v 1.8 2001/11/27 05:27:12 art Exp $ */
+/* $OpenBSD: vfs_default.c,v 1.9 2001/11/29 01:58:57 art Exp $ */
/*
* Portions of this code are:
@@ -529,7 +529,8 @@ genfs_getpages(v)
mbp->b_resid = mbp->b_bcount = bytes;
mbp->b_flags = B_BUSY|B_READ| (async ? B_CALL : 0);
mbp->b_iodone = uvm_aio_biodone;
- mbp->b_vp = vp;
+ mbp->b_vp = NULL;
+ bgetvp(vp, mbp);
LIST_INIT(&mbp->b_dep);
/*
@@ -637,7 +638,7 @@ genfs_getpages(v)
* allocate a sub-buf for this piece of the i/o
* (or just use mbp if there's only 1 piece),
* and start it going.
- */
+ */
if (offset == startoffset && iobytes == bytes) {
bp = mbp;
@@ -688,6 +689,9 @@ loopdone:
error = biowait(mbp);
}
s = splbio();
+ if (mbp->b_vp != NULL) {
+ brelvp(mbp);
+ }
pool_put(&bufpool, mbp);
splx(s);
uvm_pagermapout(kva, npages);
@@ -887,7 +891,8 @@ genfs_putpages(v)
(async ? B_CALL : 0) |
(curproc == uvm.pagedaemon_proc ? B_PDAEMON : 0);
mbp->b_iodone = uvm_aio_biodone;
- mbp->b_vp = vp;
+ mbp->b_vp = NULL;
+ bgetvp(vp, mbp);
LIST_INIT(&mbp->b_dep);
bp = NULL;
@@ -963,8 +968,10 @@ genfs_putpages(v)
(*bioops.io_pageiodone)(mbp);
}
s = splbio();
- if (mbp->b_vp)
+ if (mbp->b_vp) {
vwakeup(mbp->b_vp);
+ brelvp(mbp);
+ }
pool_put(&bufpool, mbp);
splx(s);
uvm_pagermapout(kva, npages);