diff options
| author | pooka <pooka@NetBSD.org> | 2010-05-21 16:48:55 +0000 |
|---|---|---|
| committer | pooka <pooka@NetBSD.org> | 2010-05-21 16:48:55 +0000 |
| commit | 42da46e1d2d2a839724d4e85264a91c5a8d47979 (patch) | |
| tree | df1c19b0d6608768c69934ddda8eea0377dd0425 /sys | |
| parent | d377aeaac44c708299506501131747dc82a99c35 (diff) | |
Don't namei while holding vnode lock. kern/43328
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/kern/vfs_xattr.c | 24 |
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); |
