diff options
author | ssouhlal <ssouhlal@FreeBSD.org> | 2005-09-02 15:27:23 +0000 |
---|---|---|
committer | ssouhlal <ssouhlal@FreeBSD.org> | 2005-09-02 15:27:23 +0000 |
commit | f8217f350bcfc82b94c814a04faf8cdd5326d033 (patch) | |
tree | 6d3fd63626ff1d58add99ac395ebda844196e694 /sys/fs/ntfs | |
parent | 912d183e0b4eff2d1cfeacc98dc5720f1461a947 (diff) | |
download | FreeBSD-src-f8217f350bcfc82b94c814a04faf8cdd5326d033.zip FreeBSD-src-f8217f350bcfc82b94c814a04faf8cdd5326d033.tar.gz |
*_mountfs() (if the filesystem mounts from a device) needs devvp to be
locked, so lock it.
Glanced at by: phk
MFC after: 3 days
Diffstat (limited to 'sys/fs/ntfs')
-rw-r--r-- | sys/fs/ntfs/ntfs_vfsops.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/sys/fs/ntfs/ntfs_vfsops.c b/sys/fs/ntfs/ntfs_vfsops.c index 1aae24a..5180d83 100644 --- a/sys/fs/ntfs/ntfs_vfsops.c +++ b/sys/fs/ntfs/ntfs_vfsops.c @@ -191,7 +191,7 @@ ntfs_mount ( * 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 @@ ntfs_mount ( 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 @@ ntfs_mount ( if (devvp != ntmp->um_devvp) err = EINVAL; /* needs translation */ - else - vrele(devvp); + vput(devvp); + if (err) + return (err); #endif } else { /* @@ -237,17 +241,12 @@ ntfs_mount ( 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, ...) */ |