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:
parent
1ea456e7a6
commit
77ddca67d5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=185070
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user