1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-31 16:57:10 +00:00

When looking up the vnode for the device to mount the filesystem on,

ask NDINIT to return a locked vnode instead of letting it drop the
lock and return a referenced vnode and then relock the vnode a few
lines down.  This matches the behavior of other filesystem mount routines.
This commit is contained in:
John Baldwin 2008-11-18 23:18:37 +00:00
parent 1ea456e7a6
commit 77ddca67d5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=185070

View File

@ -153,14 +153,14 @@ cd9660_mount(struct mount *mp, struct thread *td)
* Not an update, or updating the name: look up the name * Not an update, or updating the name: look up the name
* and verify that it refers to a sensible block device. * 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))) if ((error = namei(&ndp)))
return (error); return (error);
NDFREE(&ndp, NDF_ONLY_PNBUF); NDFREE(&ndp, NDF_ONLY_PNBUF);
devvp = ndp.ni_vp; devvp = ndp.ni_vp;
if (!vn_isdisk(devvp, &error)) { if (!vn_isdisk(devvp, &error)) {
vrele(devvp); vput(devvp);
return (error); return (error);
} }
@ -169,7 +169,6 @@ cd9660_mount(struct mount *mp, struct thread *td)
* or has superuser abilities * or has superuser abilities
*/ */
accmode = VREAD; accmode = VREAD;
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
error = VOP_ACCESS(devvp, accmode, td->td_ucred, td); error = VOP_ACCESS(devvp, accmode, td->td_ucred, td);
if (error) if (error)
error = priv_check(td, PRIV_VFS_MOUNT_PERM); error = priv_check(td, PRIV_VFS_MOUNT_PERM);
@ -177,22 +176,20 @@ cd9660_mount(struct mount *mp, struct thread *td)
vput(devvp); vput(devvp);
return (error); return (error);
} }
VOP_UNLOCK(devvp, 0);
if ((mp->mnt_flag & MNT_UPDATE) == 0) { if ((mp->mnt_flag & MNT_UPDATE) == 0) {
error = iso_mountfs(devvp, mp); error = iso_mountfs(devvp, mp);
if (error)
vrele(devvp);
} else { } else {
if (devvp != imp->im_devvp) if (devvp != imp->im_devvp)
error = EINVAL; /* needs translation */ error = EINVAL; /* needs translation */
else vput(devvp);
vrele(devvp);
}
if (error) {
vrele(devvp);
return error;
} }
if (error)
return (error);
vfs_mountedfrom(mp, fspec); vfs_mountedfrom(mp, fspec);
return 0; return (0);
} }
/* /*
@ -222,7 +219,6 @@ iso_mountfs(devvp, mp)
struct bufobj *bo; struct bufobj *bo;
char *cs_local, *cs_disk; char *cs_local, *cs_disk;
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
DROP_GIANT(); DROP_GIANT();
g_topology_lock(); g_topology_lock();
error = g_vfs_open(devvp, &cp, "cd9660", 0); error = g_vfs_open(devvp, &cp, "cd9660", 0);