diff -urN /usr/src/sys/fs/hpfs/hpfs_vfsops.c src/sys/fs/hpfs/hpfs_vfsops.c --- /usr/src/sys/fs/hpfs/hpfs_vfsops.c Thu Mar 24 08:36:13 2005 +++ src/sys/fs/hpfs/hpfs_vfsops.c Wed Aug 31 03:02:36 2005 @@ -161,7 +161,7 @@ * 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, from, td); + NDINIT(&ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, from, td); err = namei(&ndp); if (err) { /* can't get devvp!*/ @@ -170,8 +170,10 @@ devvp = ndp.ni_vp; - if (!vn_isdisk(devvp, &err)) - goto error_2; + if (!vn_isdisk(devvp, &err)) { + vput(devvp); + return (err); + } /* ******************** @@ -196,12 +198,6 @@ goto error_2; goto success; - - -error_2: /* error with devvp held*/ - - /* release devvp before failing*/ - vrele(devvp); error_1: /* no state to back out*/ /* XXX: Missing NDFREE(&ndp, ...) */ diff -urN /usr/src/sys/fs/msdosfs/msdosfs_vfsops.c src/sys/fs/msdosfs/msdosfs_vfsops.c --- /usr/src/sys/fs/msdosfs/msdosfs_vfsops.c Thu Mar 24 08:36:13 2005 +++ src/sys/fs/msdosfs/msdosfs_vfsops.c Wed Aug 31 03:08:34 2005 @@ -336,7 +336,7 @@ */ if (vfs_getopt(mp->mnt_optnew, "from", (void **)&from, NULL)) return (EINVAL); - NDINIT(&ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, from, td); + NDINIT(&ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, from, td); error = namei(&ndp); if (error) return (error); @@ -344,7 +344,7 @@ NDFREE(&ndp, NDF_ONLY_PNBUF); if (!vn_isdisk(devvp, &error)) { - vrele(devvp); + vput(devvp); return (error); } /* @@ -355,13 +355,11 @@ accessmode = VREAD; if ((mp->mnt_flag & MNT_RDONLY) == 0) accessmode |= VWRITE; - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td); error = VOP_ACCESS(devvp, accessmode, td->td_ucred, td); if (error) { vput(devvp); return (error); } - VOP_UNLOCK(devvp, 0, td); } if ((mp->mnt_flag & MNT_UPDATE) == 0) { error = mountmsdosfs(devvp, mp, td); @@ -372,7 +370,7 @@ if (devvp != pmp->pm_devvp) error = EINVAL; /* XXX needs translation */ else - vrele(devvp); + vput(devvp); } if (error) { vrele(devvp); diff -urN /usr/src/sys/fs/ntfs/ntfs_vfsops.c src/sys/fs/ntfs/ntfs_vfsops.c --- /usr/src/sys/fs/ntfs/ntfs_vfsops.c Thu Mar 24 08:36:14 2005 +++ src/sys/fs/ntfs/ntfs_vfsops.c Wed Aug 31 02:58:06 2005 @@ -191,7 +191,7 @@ * 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, from, td); + NDINIT(&ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, from, td); err = namei(&ndp); if (err) { /* can't get devvp!*/ @@ -200,8 +200,11 @@ NDFREE(&ndp, NDF_ONLY_PNBUF); devvp = ndp.ni_vp; - if (!vn_isdisk(devvp, &err)) - goto error_2; + if (!vn_isdisk(devvp, &err)) { + vput(devvp); + return (err); + } + if (mp->mnt_flag & MNT_UPDATE) { #if 0 /* @@ -212,8 +215,9 @@ if (devvp != ntmp->um_devvp) err = EINVAL; /* needs translation */ - else - vrele(devvp); + vput(devvp); + if (err) + return (err); #endif } else { /* @@ -237,16 +241,11 @@ err = ntfs_mountfs(devvp, mp, td); } if (err) { - goto error_2; + vrele(devvp); + return (err); } goto success; - - -error_2: /* error with devvp held*/ - - /* release devvp before failing*/ - vrele(devvp); error_1: /* no state to back out*/ /* XXX: missing NDFREE(&ndp, ...) */ diff -urN /usr/src/sys/fs/udf/udf_vfsops.c src/sys/fs/udf/udf_vfsops.c --- /usr/src/sys/fs/udf/udf_vfsops.c Thu Mar 24 08:36:15 2005 +++ src/sys/fs/udf/udf_vfsops.c Wed Aug 31 03:06:47 2005 @@ -228,19 +228,18 @@ /* Check that the mount device exists */ if (fspec == NULL) return (EINVAL); - 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) == 0) { - vrele(devvp); + vput(devvp); return (error); } /* Check the access rights on the mount device */ - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td); error = VOP_ACCESS(devvp, VREAD, td->td_ucred, td); if (error) error = suser(td); @@ -248,7 +247,6 @@ vput(devvp); return (error); } - VOP_UNLOCK(devvp, 0, td); if ((error = udf_mountfs(devvp, mp, td))) { vrele(devvp); diff -urN /usr/src/sys/gnu/fs/ext2fs/ext2_vfsops.c src/sys/gnu/fs/ext2fs/ext2_vfsops.c --- /usr/src/sys/gnu/fs/ext2fs/ext2_vfsops.c Thu Jun 16 08:51:38 2005 +++ src/sys/gnu/fs/ext2fs/ext2_vfsops.c Wed Aug 31 02:49:38 2005 @@ -248,14 +248,14 @@ */ if (fspec == NULL) return (EINVAL); - NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, td); + NDINIT(ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, fspec, td); if ((error = namei(ndp)) != 0) return (error); NDFREE(ndp, NDF_ONLY_PNBUF); devvp = ndp->ni_vp; if (!vn_isdisk(devvp, &error)) { - vrele(devvp); + vput(devvp); return (error); } @@ -267,12 +267,10 @@ accessmode = VREAD; if ((mp->mnt_flag & MNT_RDONLY) == 0) accessmode |= VWRITE; - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td); if ((error = VOP_ACCESS(devvp, accessmode, td->td_ucred, td)) != 0) { vput(devvp); return (error); } - VOP_UNLOCK(devvp, 0, td); } if ((mp->mnt_flag & MNT_UPDATE) == 0) { @@ -281,7 +279,7 @@ if (devvp != ump->um_devvp) error = EINVAL; /* needs translation */ else - vrele(devvp); + vput(devvp); } if (error) { vrele(devvp); diff -urN /usr/src/sys/gnu/fs/reiserfs/reiserfs_vfsops.c src/sys/gnu/fs/reiserfs/reiserfs_vfsops.c --- /usr/src/sys/gnu/fs/reiserfs/reiserfs_vfsops.c Sat Jun 18 19:06:09 2005 +++ src/sys/gnu/fs/reiserfs/reiserfs_vfsops.c Wed Aug 31 02:51:16 2005 @@ -114,14 +114,14 @@ if (fspec == NULL) return (EINVAL); - NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, td); + NDINIT(ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, fspec, td); if ((error = namei(ndp)) != 0) return (error); NDFREE(ndp, NDF_ONLY_PNBUF); devvp = ndp->ni_vp; if (!vn_isdisk(devvp, &error)) { - vrele(devvp); + vput(devvp); return (error); } @@ -131,13 +131,11 @@ accessmode = VREAD; if ((mp->mnt_flag & MNT_RDONLY) == 0) accessmode |= VWRITE; - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td); if ((error = VOP_ACCESS(devvp, accessmode, td->td_ucred, td)) != 0) { vput(devvp); return (error); } - VOP_UNLOCK(devvp, 0, td); } if ((mp->mnt_flag & MNT_UPDATE) == 0) {