summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorpooka <pooka@NetBSD.org>2010-05-21 16:48:55 +0000
committerpooka <pooka@NetBSD.org>2010-05-21 16:48:55 +0000
commit42da46e1d2d2a839724d4e85264a91c5a8d47979 (patch)
treedf1c19b0d6608768c69934ddda8eea0377dd0425 /sys
parentd377aeaac44c708299506501131747dc82a99c35 (diff)
Don't namei while holding vnode lock. kern/43328
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_xattr.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/sys/kern/vfs_xattr.c b/sys/kern/vfs_xattr.c
index 74bf8009e5f..22b506b5dfa 100644
--- a/sys/kern/vfs_xattr.c
+++ b/sys/kern/vfs_xattr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_xattr.c,v 1.20 2009/06/29 05:08:18 dholland Exp $ */
+/* $NetBSD: vfs_xattr.c,v 1.21 2010/05/21 16:48:55 pooka Exp $ */
/*-
* Copyright (c) 2005, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_xattr.c,v 1.20 2009/06/29 05:08:18 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_xattr.c,v 1.21 2010/05/21 16:48:55 pooka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -161,32 +161,30 @@ sys_extattrctl(struct lwp *l, const struct sys_extattrctl_args *uap, register_t
return (error);
}
+ error = namei_simple_user(SCARG(uap, path),
+ NSM_FOLLOW_NOEMULROOT, &path_vp);
+ if (error) {
+ return (error);
+ }
+
file_vp = NULL;
if (SCARG(uap, filename) != NULL) {
NDINIT(&file_nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
SCARG(uap, filename));
error = namei(&file_nd);
- if (error)
+ if (error) {
+ vrele(path_vp);
return (error);
+ }
file_vp = file_nd.ni_vp;
}
- error = namei_simple_user(SCARG(uap, path),
- NSM_FOLLOW_NOEMULROOT, &path_vp);
- if (error) {
- if (file_vp != NULL)
- vput(file_vp);
- return (error);
- }
-
error = VFS_EXTATTRCTL(path_vp->v_mount, SCARG(uap, cmd), file_vp,
SCARG(uap, attrnamespace),
SCARG(uap, attrname) != NULL ? attrname : NULL);
if (file_vp != NULL)
vrele(file_vp);
-
- /* XXX missing in the original code - am *I* missing something? */
vrele(path_vp);
return (error);