diff options
author | dg <dg@FreeBSD.org> | 1995-03-19 23:08:12 +0000 |
---|---|---|
committer | dg <dg@FreeBSD.org> | 1995-03-19 23:08:12 +0000 |
commit | d3370913880cb3746e3d78d3c158aa6b7608b325 (patch) | |
tree | 340e778a90bbb6bb05e099e98b09320c676a2e7f | |
parent | cb596fe111d9e4a76d460f32d923c49ebf004d54 (diff) | |
download | FreeBSD-src-d3370913880cb3746e3d78d3c158aa6b7608b325.zip FreeBSD-src-d3370913880cb3746e3d78d3c158aa6b7608b325.tar.gz |
Lose the lock on the vnode. Changes to implement proper locking in the
vnode pager now require this.
Submitted by: John Dyson
-rw-r--r-- | sys/kern/kern_exec.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 2d1593a..72ce0be 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: kern_exec.c,v 1.15 1995/03/10 08:44:20 davidg Exp $ + * $Id: kern_exec.c,v 1.16 1995/03/16 18:12:30 bde Exp $ */ #include <sys/param.h> @@ -138,6 +138,12 @@ interpret: } /* + * Lose the lock on the vnode. It isn't needed, and must not + * exist for the pagefault paging to work below. + */ + VOP_UNLOCK(vnodep); + + /* * Check file permissions (also 'opens' file) */ error = exec_check_permissions(iparams); @@ -182,7 +188,7 @@ interpret: goto exec_fail_dealloc; if (iparams->interpreted) { /* free old vnode and name buffer */ - vput(ndp->ni_vp); + vrele(ndp->ni_vp); FREE(ndp->ni_cnd.cn_pnbuf, M_NAMEI); if (vm_map_remove(kernel_map, (vm_offset_t)image_header, (vm_offset_t)image_header + PAGE_SIZE)) @@ -305,7 +311,7 @@ interpret: if (vm_map_remove(kernel_map, (vm_offset_t)image_header, (vm_offset_t)image_header + PAGE_SIZE)) panic("execve: header dealloc failed (2)"); - vput(ndp->ni_vp); + vrele(ndp->ni_vp); FREE(ndp->ni_cnd.cn_pnbuf, M_NAMEI); return (0); @@ -319,7 +325,8 @@ exec_fail_dealloc: if (vm_map_remove(kernel_map, (vm_offset_t)image_header, (vm_offset_t)image_header + PAGE_SIZE)) panic("execve: header dealloc failed (3)"); - vput(ndp->ni_vp); + if (ndp->ni_vp) + vrele(ndp->ni_vp); FREE(ndp->ni_cnd.cn_pnbuf, M_NAMEI); exec_fail: |