svn commit: r188738 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb dev/hwpmc fs/procfs kern

John Baldwin jhb at FreeBSD.org
Tue Feb 17 14:46:32 PST 2009


Author: jhb
Date: Tue Feb 17 22:46:30 2009
New Revision: 188738
URL: http://svn.freebsd.org/changeset/base/188738

Log:
  MFC: Remove unnecessary locking around vn_fullpath().  This also includes
  closing some races between procfs' <pid>/file and execve(2) and using a
  shared vnode lock for the VOP_GETATTR() in the kern.proc.vmmap sysctl
  handler.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/dev/hwpmc/hwpmc_mod.c
  stable/7/sys/fs/procfs/procfs.c
  stable/7/sys/fs/procfs/procfs_map.c
  stable/7/sys/kern/kern_descrip.c
  stable/7/sys/kern/kern_proc.c

Modified: stable/7/sys/dev/hwpmc/hwpmc_mod.c
==============================================================================
--- stable/7/sys/dev/hwpmc/hwpmc_mod.c	Tue Feb 17 22:25:19 2009	(r188737)
+++ stable/7/sys/dev/hwpmc/hwpmc_mod.c	Tue Feb 17 22:46:30 2009	(r188738)
@@ -669,9 +669,7 @@ pmc_getfilename(struct vnode *v, char **
 	td = curthread;
 	*fullpath = "unknown";
 	*freepath = NULL;
-	vn_lock(v, LK_CANRECURSE | LK_EXCLUSIVE | LK_RETRY, td);
 	vn_fullpath(td, v, fullpath, freepath);
-	VOP_UNLOCK(v, 0, td);
 }
 
 /*

Modified: stable/7/sys/fs/procfs/procfs.c
==============================================================================
--- stable/7/sys/fs/procfs/procfs.c	Tue Feb 17 22:25:19 2009	(r188737)
+++ stable/7/sys/fs/procfs/procfs.c	Tue Feb 17 22:46:30 2009	(r188738)
@@ -70,17 +70,13 @@ procfs_doprocfile(PFS_FILL_ARGS)
 	char *fullpath = "unknown";
 	char *freepath = NULL;
 	struct vnode *textvp;
-	int err;
 
+	PROC_LOCK(p);
 	textvp = p->p_textvp;
-	VI_LOCK(textvp);
-	vholdl(textvp);
-	err = vn_lock(textvp, LK_EXCLUSIVE | LK_INTERLOCK, td);
-	vdrop(textvp);
-	if (err)
-		return (err);
+	vhold(textvp);
+	PROC_UNLOCK(p);
 	vn_fullpath(td, textvp, &fullpath, &freepath);
-	VOP_UNLOCK(textvp, 0, td);
+	vdrop(textvp);
 	sbuf_printf(sb, "%s", fullpath);
 	if (freepath)
 		free(freepath, M_TEMP);

Modified: stable/7/sys/fs/procfs/procfs_map.c
==============================================================================
--- stable/7/sys/fs/procfs/procfs_map.c	Tue Feb 17 22:25:19 2009	(r188737)
+++ stable/7/sys/fs/procfs/procfs_map.c	Tue Feb 17 22:46:30 2009	(r188738)
@@ -190,10 +190,9 @@ procfs_doprocmap(PFS_FILL_ARGS)
 			shadow_count = obj->shadow_count;
 			VM_OBJECT_UNLOCK(obj);
 			if (vp != NULL) {
-				vfslocked = VFS_LOCK_GIANT(vp->v_mount);
-				vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
 				vn_fullpath(td, vp, &fullpath, &freepath);
-				vput(vp);
+				vfslocked = VFS_LOCK_GIANT(vp->v_mount);
+				vrele(vp);
 				VFS_UNLOCK_GIANT(vfslocked);
 			}
 		} else {

Modified: stable/7/sys/kern/kern_descrip.c
==============================================================================
--- stable/7/sys/kern/kern_descrip.c	Tue Feb 17 22:25:19 2009	(r188737)
+++ stable/7/sys/kern/kern_descrip.c	Tue Feb 17 22:46:30 2009	(r188738)
@@ -2836,10 +2836,9 @@ export_vnode_for_sysctl(struct vnode *vp
 	freepath = NULL;
 	fullpath = "-";
 	FILEDESC_SUNLOCK(fdp);
-	vfslocked = VFS_LOCK_GIANT(vp->v_mount);
-	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
 	vn_fullpath(curthread, vp, &fullpath, &freepath);
-	vput(vp);
+	vfslocked = VFS_LOCK_GIANT(vp->v_mount);
+	vrele(vp);
 	VFS_UNLOCK_GIANT(vfslocked);
 	strlcpy(kif->kf_path, fullpath, sizeof(kif->kf_path));
 	if (freepath != NULL)
@@ -3001,10 +3000,9 @@ sysctl_kern_proc_filedesc(SYSCTL_HANDLER
 			freepath = NULL;
 			fullpath = "-";
 			FILEDESC_SUNLOCK(fdp);
-			vfslocked = VFS_LOCK_GIANT(vp->v_mount);
-			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
 			vn_fullpath(curthread, vp, &fullpath, &freepath);
-			vput(vp);
+			vfslocked = VFS_LOCK_GIANT(vp->v_mount);
+			vrele(vp);
 			VFS_UNLOCK_GIANT(vfslocked);
 			strlcpy(kif->kf_path, fullpath,
 			    sizeof(kif->kf_path));

Modified: stable/7/sys/kern/kern_proc.c
==============================================================================
--- stable/7/sys/kern/kern_proc.c	Tue Feb 17 22:25:19 2009	(r188737)
+++ stable/7/sys/kern/kern_proc.c	Tue Feb 17 22:46:30 2009	(r188738)
@@ -1475,12 +1475,11 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_A
 			kve->kve_shadow_count = obj->shadow_count;
 			VM_OBJECT_UNLOCK(obj);
 			if (vp != NULL) {
-				vfslocked = VFS_LOCK_GIANT(vp->v_mount);
-				vn_lock(vp, LK_EXCLUSIVE | LK_RETRY,
-				    curthread);
 				vn_fullpath(curthread, vp, &fullpath,
 				    &freepath);
 				cred = curthread->td_ucred;
+				vfslocked = VFS_LOCK_GIANT(vp->v_mount);
+				vn_lock(vp, LK_SHARED | LK_RETRY, curthread);
 				if (VOP_GETATTR(vp, &va, cred, curthread) == 0) {
 					kve->kve_fileid = va.va_fileid;
 					kve->kve_fsid = va.va_fsid;


More information about the svn-src-all mailing list