Index: sys/fs/cd9660/cd9660_vfsops.c =================================================================== RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_vfsops.c,v retrieving revision 1.78 diff -u -p -r1.78 cd9660_vfsops.c --- sys/fs/cd9660/cd9660_vfsops.c 23 Jun 2013 07:28:36 -0000 1.78 +++ sys/fs/cd9660/cd9660_vfsops.c 2 Oct 2013 05:31:39 -0000 @@ -266,34 +266,36 @@ cd9660_mount(struct mount *mp, const cha vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_MOUNT, KAUTH_REQ_SYSTEM_MOUNT_DEVICE, mp, devvp, KAUTH_ARG(VREAD)); - VOP_UNLOCK(devvp); if (error) { - vrele(devvp); - return (error); + goto fail; } if ((mp->mnt_flag & MNT_UPDATE) == 0) { - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, FREAD, FSCRED); - VOP_UNLOCK(devvp); if (error) goto fail; + VOP_UNLOCK(devvp); error = iso_mountfs(devvp, mp, l, args); + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); if (error) { - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); (void)VOP_CLOSE(devvp, FREAD, NOCRED); - VOP_UNLOCK(devvp); goto fail; } + VOP_UNLOCK(devvp); + /* reference to devvp is donated through iso_mountfs */ } else { - vrele(devvp); if (devvp != imp->im_devvp && - devvp->v_rdev != imp->im_devvp->v_rdev) - return (EINVAL); /* needs translation */ + devvp->v_rdev != imp->im_devvp->v_rdev) { + error = EINVAL; /* needs translation */ + goto fail; + } + VOP_UNLOCK(devvp); + vrele(devvp); } return set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l); fail: + VOP_UNLOCK(devvp); vrele(devvp); return (error); }