diff options
| author | 2001-11-29 01:58:57 +0000 | |
|---|---|---|
| committer | 2001-11-29 01:58:57 +0000 | |
| commit | 5139d36352307145e2cca2a0165ab8944518fb08 (patch) | |
| tree | e9b511f822fac9a30d8d37281cb7ba7770bc84cc /sys/kern/vfs_default.c | |
| parent | Use getifaddrs(3) instead of SIOCGIFCONF, SIOCGIFADDR, SIOCGIFNETMASK, (diff) | |
| download | wireguard-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.c | 17 |
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); |
