--- //depot/vendor/freebsd/src/sys/kern/kern_sig.c 2006/03/09 08:37:47 +++ //depot/projects/smpng/sys/kern/kern_sig.c 2006/03/21 19:02:21 @@ -3062,6 +3065,7 @@ struct mount *mp; char *name; /* name of corefile */ off_t limit; + int vfslocked; PROC_LOCK_ASSERT(p, MA_OWNED); MPASS((p->p_flag & P_HADTHREADS) == 0 || p->p_singlethread == td); @@ -3085,21 +3089,17 @@ if (limit == 0) return (EFBIG); - mtx_lock(&Giant); restart: name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid); - if (name == NULL) { - mtx_unlock(&Giant); + if (name == NULL) return (EINVAL); - } - NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, td); /* XXXKSE */ + NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, name, td); flags = O_CREAT | FWRITE | O_NOFOLLOW; error = vn_open(&nd, &flags, S_IRUSR | S_IWUSR, -1); free(name, M_TEMP); - if (error) { - mtx_unlock(&Giant); + if (error) return (error); - } + vfslocked = NDHASGIANT(&nd); NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; @@ -3108,7 +3108,7 @@ VOP_GETATTR(vp, &vattr, cred, td) || vattr.va_nlink != 1) { VOP_UNLOCK(vp, 0, td); error = EFAULT; - goto out; + goto close; } VOP_UNLOCK(vp, 0, td); @@ -3123,9 +3123,10 @@ if (locked) VOP_ADVLOCK(vp, (caddr_t)p, F_UNLCK, &lf, F_FLOCK); if ((error = vn_close(vp, FWRITE, cred, td)) != 0) - return (error); + goto out; if ((error = vn_start_write(NULL, &mp, V_XSLEEP | PCATCH)) != 0) - return (error); + goto out; + VFS_UNLOCK_GIANT(vfslocked); goto restart; } @@ -3150,11 +3151,12 @@ VOP_ADVLOCK(vp, (caddr_t)p, F_UNLCK, &lf, F_FLOCK); } vn_finished_write(mp); -out: +close: error1 = vn_close(vp, FWRITE, cred, td); - mtx_unlock(&Giant); if (error == 0) error = error1; +out: + VFS_UNLOCK_GIANT(vfslocked); return (error); } --- //depot/vendor/freebsd/src/sys/kern/vfs_syscalls.c 2006/03/04 00:10:17 +++ //depot/projects/smpng/sys/kern/vfs_syscalls.c 2006/03/21 19:02:21 @@ -1005,7 +1005,7 @@ /* An extra reference on `nfp' has been held for us by falloc(). */ fp = nfp; cmode = ((mode &~ fdp->fd_cmask) & ALLPERMS) &~ S_ISTXT; - NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, pathseg, path, td); + NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, pathseg, path, td); td->td_dupfd = -1; /* XXX check for fdopen */ error = vn_open(&nd, &flags, cmode, indx); if (error) { --- //depot/vendor/freebsd/src/sys/kern/vfs_vnops.c 2006/03/11 17:15:24 +++ //depot/projects/smpng/sys/kern/vfs_vnops.c 2006/03/21 19:02:21 @@ -111,8 +111,9 @@ struct vattr vat; struct vattr *vap = &vat; int mode, fmode, error; - int vfslocked; + int vfslocked, mpsafe; + mpsafe = ndp->ni_cnd.cn_flags & MPSAFE; restart: vfslocked = 0; fmode = *flagp; @@ -125,8 +126,9 @@ bwillwrite(); if ((error = namei(ndp)) != 0) return (error); - vfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0; - ndp->ni_cnd.cn_flags &= ~MPSAFE; + vfslocked = NDHASGIANT(ndp); + if (!mpsafe) + ndp->ni_cnd.cn_flags &= ~MPSAFE; if (ndp->ni_vp == NULL) { VATTR_NULL(vap); vap->va_type = VREG; @@ -182,8 +184,9 @@ LOCKSHARED | LOCKLEAF | MPSAFE | AUDITVNODE1; if ((error = namei(ndp)) != 0) return (error); - ndp->ni_cnd.cn_flags &= ~MPSAFE; - vfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0; + if (!mpsafe) + ndp->ni_cnd.cn_flags &= ~MPSAFE; + vfslocked = NDHASGIANT(ndp); vp = ndp->ni_vp; } if (vp->v_type == VLNK) { @@ -230,7 +233,7 @@ vp->v_writecount++; *flagp = fmode; ASSERT_VOP_LOCKED(vp, "vn_open_cred"); - if (fdidx == -1) + if (!mpsafe) VFS_UNLOCK_GIANT(vfslocked); return (0); bad: