Tidy up locking in cd9660_mount; thrash the lock less, and make it
clear that the lock is only dropped when calling iso_mountfs(). While here, don't use the vnode pointer's value after vrele().
This commit is contained in:
parent
4b26aee1e1
commit
37ec3a866f
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: cd9660_vfsops.c,v 1.82 2014/03/23 15:21:15 hannken Exp $ */
|
||||
/* $NetBSD: cd9660_vfsops.c,v 1.83 2014/03/24 04:03:25 dholland Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1994
|
||||
|
@ -37,7 +37,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.82 2014/03/23 15:21:15 hannken Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.83 2014/03/24 04:03:25 dholland Exp $");
|
||||
|
||||
#if defined(_KERNEL_OPT)
|
||||
#include "opt_compat_netbsd.h"
|
||||
|
@ -258,34 +258,36 @@ cd9660_mount(struct mount *mp, const char *path, void *data, size_t *data_len)
|
|||
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;
|
||||
error = iso_mountfs(devvp, mp, l, args);
|
||||
if (error) {
|
||||
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
|
||||
(void)VOP_CLOSE(devvp, FREAD, NOCRED);
|
||||
VOP_UNLOCK(devvp);
|
||||
error = iso_mountfs(devvp, mp, l, args);
|
||||
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
|
||||
if (error) {
|
||||
(void)VOP_CLOSE(devvp, FREAD, NOCRED);
|
||||
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue