Module Name: src
Committed By: riz
Date: Sat Jun 12 00:59:57 UTC 2010
Modified Files:
src/sys/kern [netbsd-5]: vfs_xattr.c
Log Message:
Pull up following revision(s) (requested by pooka in ticket #1405):
sys/kern/vfs_xattr.c: revision 1.21 via patch
Don't namei while holding vnode lock. kern/43328
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.19.6.1 src/sys/kern/vfs_xattr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/vfs_xattr.c
diff -u src/sys/kern/vfs_xattr.c:1.19 src/sys/kern/vfs_xattr.c:1.19.6.1
--- src/sys/kern/vfs_xattr.c:1.19 Mon Jun 23 11:30:41 2008
+++ src/sys/kern/vfs_xattr.c Sat Jun 12 00:59:57 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_xattr.c,v 1.19 2008/06/23 11:30:41 ad Exp $ */
+/* $NetBSD: vfs_xattr.c,v 1.19.6.1 2010/06/12 00:59:57 riz 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.19 2008/06/23 11:30:41 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_xattr.c,v 1.19.6.1 2010/06/12 00:59:57 riz Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -149,7 +149,7 @@
syscallarg(int) attrnamespace;
syscallarg(const char *) attrname;
} */
- struct vnode *vp;
+ struct vnode *vp, *path_vp;
struct nameidata nd;
char attrname[EXTATTR_MAXNAMELEN];
int error;
@@ -161,30 +161,32 @@
return (error);
}
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path));
+ error = namei(&nd);
+ if (error) {
+ return (error);
+ }
+ path_vp = nd.ni_vp;
+
vp = NULL;
if (SCARG(uap, filename) != NULL) {
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
SCARG(uap, filename));
error = namei(&nd);
- if (error)
+ if (error) {
+ vrele(path_vp);
return (error);
+ }
vp = nd.ni_vp;
}
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path));
- error = namei(&nd);
- if (error) {
- if (vp != NULL)
- vput(vp);
- return (error);
- }
-
- error = VFS_EXTATTRCTL(nd.ni_vp->v_mount, SCARG(uap, cmd), vp,
+ error = VFS_EXTATTRCTL(path_vp->v_mount, SCARG(uap, cmd), vp,
SCARG(uap, attrnamespace),
SCARG(uap, attrname) != NULL ? attrname : NULL);
if (vp != NULL)
vrele(vp);
+ vrele(path_vp);
return (error);
}