PERFORCE change 115949 for review

John Baldwin jhb at FreeBSD.org
Thu Mar 15 22:20:52 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=115949

Change 115949 by jhb at jhb_mutex on 2007/03/15 22:20:40

	Remove a bunch of crap to handle a race that is already handled.
	If we hit this race, then the file will get cleaned up when the
	fdrop() at the end calls closef().  This is how all the other
	places that create file descriptors handle this race.

Affected files ...

.. //depot/projects/smpng/sys/kern/vfs_syscalls.c#124 edit

Differences ...

==== //depot/projects/smpng/sys/kern/vfs_syscalls.c#124 (text+ko) ====

@@ -1025,31 +1025,8 @@
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	vp = nd.ni_vp;
 
-	/*
-	 * There should be 2 references on the file, one from the descriptor
-	 * table, and one for us.
-	 *
-	 * Handle the case where someone closed the file (via its file
-	 * descriptor) while we were blocked.  The end result should look
-	 * like opening the file succeeded but it was immediately closed.
-	 * We call vn_close() manually because we haven't yet hooked up
-	 * the various 'struct file' fields.
-	 */
-	FILEDESC_LOCK(fdp);
+	FILEDESC_LOCK_FAST(fdp);
 	FILE_LOCK(fp);
-	if (fp->f_count == 1) {
-		mp = vp->v_mount;
-		KASSERT(fdp->fd_ofiles[indx] != fp,
-		    ("Open file descriptor lost all refs"));
-		FILE_UNLOCK(fp);
-		FILEDESC_UNLOCK(fdp);
-		VOP_UNLOCK(vp, 0, td);
-		vn_close(vp, flags & FMASK, fp->f_cred, td);
-		VFS_UNLOCK_GIANT(vfslocked);
-		fdrop(fp, td);
-		td->td_retval[0] = indx;
-		return (0);
-	}
 	fp->f_vnode = vp;
 	if (fp->f_data == NULL)
 		fp->f_data = vp;
@@ -1059,7 +1036,7 @@
 	fp->f_seqcount = 1;
 	fp->f_type = (vp->v_type == VFIFO ? DTYPE_FIFO : DTYPE_VNODE);
 	FILE_UNLOCK(fp);
-	FILEDESC_UNLOCK(fdp);
+	FILEDESC_UNLOCK_FAST(fdp);
 
 	VOP_UNLOCK(vp, 0, td);
 	if (flags & (O_EXLOCK | O_SHLOCK)) {


More information about the p4-projects mailing list