svn commit: r189975 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb fs/cd9660

John Baldwin jhb at FreeBSD.org
Wed Mar 18 11:38:28 PDT 2009


Author: jhb
Date: Wed Mar 18 18:38:26 2009
New Revision: 189975
URL: http://svn.freebsd.org/changeset/base/189975

Log:
  MFC: Keep the vnode for the mountpoint locked on return from namei()
  until after g_vfs_open() to match other filesystems.

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/fs/cd9660/cd9660_vfsops.c

Modified: stable/7/sys/fs/cd9660/cd9660_vfsops.c
==============================================================================
--- stable/7/sys/fs/cd9660/cd9660_vfsops.c	Wed Mar 18 18:30:00 2009	(r189974)
+++ stable/7/sys/fs/cd9660/cd9660_vfsops.c	Wed Mar 18 18:38:26 2009	(r189975)
@@ -154,14 +154,14 @@ cd9660_mount(struct mount *mp, struct th
 	 * Not an update, or updating the name: look up the name
 	 * and verify that it refers to a sensible block device.
 	 */
-	NDINIT(&ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, td);
+	NDINIT(&ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, fspec, td);
 	if ((error = namei(&ndp)))
 		return (error);
 	NDFREE(&ndp, NDF_ONLY_PNBUF);
 	devvp = ndp.ni_vp;
 
 	if (!vn_isdisk(devvp, &error)) {
-		vrele(devvp);
+		vput(devvp);
 		return (error);
 	}
 
@@ -170,7 +170,6 @@ cd9660_mount(struct mount *mp, struct th
 	 * or has superuser abilities
 	 */
 	accessmode = VREAD;
-	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
 	error = VOP_ACCESS(devvp, accessmode, td->td_ucred, td);
 	if (error)
 		error = priv_check(td, PRIV_VFS_MOUNT_PERM);
@@ -178,22 +177,20 @@ cd9660_mount(struct mount *mp, struct th
 		vput(devvp);
 		return (error);
 	}
-	VOP_UNLOCK(devvp, 0, td);
 
 	if ((mp->mnt_flag & MNT_UPDATE) == 0) {
 		error = iso_mountfs(devvp, mp, td);
+		if (error)
+			vrele(devvp);
 	} else {
 		if (devvp != imp->im_devvp)
 			error = EINVAL;	/* needs translation */
-		else
-			vrele(devvp);
-	}
-	if (error) {
-		vrele(devvp);
-		return error;
+		vput(devvp);
 	}
+	if (error)
+		return (error);
 	vfs_mountedfrom(mp, fspec);
-	return 0;
+	return (0);
 }
 
 /*
@@ -224,7 +221,6 @@ iso_mountfs(devvp, mp, td)
 	struct bufobj *bo;
 	char *cs_local, *cs_disk;
 
-	vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
 	DROP_GIANT();
 	g_topology_lock();
 	error = g_vfs_open(devvp, &cp, "cd9660", 0);


More information about the svn-src-all mailing list