PERFORCE change 93725 for review
John Baldwin
jhb at FreeBSD.org
Tue Mar 21 19:03:30 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=93725
Change 93725 by jhb at jhb_slimer on 2006/03/21 19:02:21
Change vn_open() to honor MPSAFE flag in nameidata rather than using
fdidx != -1.
Affected files ...
.. //depot/projects/smpng/sys/kern/kern_sig.c#122 edit
.. //depot/projects/smpng/sys/kern/vfs_syscalls.c#101 edit
.. //depot/projects/smpng/sys/kern/vfs_vnops.c#68 edit
Differences ...
==== //depot/projects/smpng/sys/kern/kern_sig.c#122 (text+ko) ====
@@ -3093,7 +3093,7 @@
name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid);
if (name == NULL)
return (EINVAL);
- NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, td);
+ 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);
==== //depot/projects/smpng/sys/kern/vfs_syscalls.c#101 (text+ko) ====
@@ -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/projects/smpng/sys/kern/vfs_vnops.c#68 (text+ko) ====
@@ -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:
More information about the p4-projects
mailing list