summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2000-07-26 20:29:20 +0000
committerrwatson <rwatson@FreeBSD.org>2000-07-26 20:29:20 +0000
commit97118d11db99484338915c391830f5e9ad423dc2 (patch)
tree2bbeb7f46302685d328e67c944d7c446c4ff4af5 /sys/kern
parent393b0e393d3119b2ca201ce7ef8f5899621fa223 (diff)
downloadFreeBSD-src-97118d11db99484338915c391830f5e9ad423dc2.zip
FreeBSD-src-97118d11db99484338915c391830f5e9ad423dc2.tar.gz
o Lock vnode before calling extattr_* VOP's, and modify vnode spec to
allow for that. o Remember to call NDFREE() if exiting as a result of a failed vn_start_write() when snapshotting. Reviewed by: mckusick Obtained from: TrustedBSD Project
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_extattr.c17
-rw-r--r--sys/kern/vfs_syscalls.c17
-rw-r--r--sys/kern/vnode_if.src2
3 files changed, 23 insertions, 13 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index e8b6b25..d305c39 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -3548,11 +3548,14 @@ extattr_set_file(p, uap)
error = copyin(SCARG(uap, attrname), attrname, EXTATTR_MAXNAMELEN);
if (error)
return (error);
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return(error);
- if ((error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH)) != 0)
- goto done;
+ if ((error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH)) != 0) {
+ NDFREE(&nd, 0);
+ return (error);
+ }
iovlen = uap->iovcnt * sizeof(struct iovec);
if (uap->iovcnt > UIO_SMALLIOV) {
if (uap->iovcnt > UIO_MAXIOV) {
@@ -3617,7 +3620,8 @@ extattr_get_file(p, uap)
error = copyin(SCARG(uap, attrname), attrname, EXTATTR_MAXNAMELEN);
if (error)
return (error);
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
iovlen = uap->iovcnt * sizeof (struct iovec);
@@ -3681,11 +3685,12 @@ extattr_delete_file(p, uap)
error = copyin(SCARG(uap, attrname), attrname, EXTATTR_MAXNAMELEN);
if (error)
return(error);
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ NDINIT(&nd, LOOKUP | LOCKLEAF, FOLLOW, UIO_USERSPACE,
+ SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return(error);
if ((error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH)) != 0) {
- vrele(nd.ni_vp);
+ NDFREE(&nd, 0);
return (error);
}
error = VOP_SETEXTATTR(nd.ni_vp, attrname, NULL, p->p_cred->pc_ucred,
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index e8b6b25..d305c39 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -3548,11 +3548,14 @@ extattr_set_file(p, uap)
error = copyin(SCARG(uap, attrname), attrname, EXTATTR_MAXNAMELEN);
if (error)
return (error);
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return(error);
- if ((error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH)) != 0)
- goto done;
+ if ((error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH)) != 0) {
+ NDFREE(&nd, 0);
+ return (error);
+ }
iovlen = uap->iovcnt * sizeof(struct iovec);
if (uap->iovcnt > UIO_SMALLIOV) {
if (uap->iovcnt > UIO_MAXIOV) {
@@ -3617,7 +3620,8 @@ extattr_get_file(p, uap)
error = copyin(SCARG(uap, attrname), attrname, EXTATTR_MAXNAMELEN);
if (error)
return (error);
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
+ SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return (error);
iovlen = uap->iovcnt * sizeof (struct iovec);
@@ -3681,11 +3685,12 @@ extattr_delete_file(p, uap)
error = copyin(SCARG(uap, attrname), attrname, EXTATTR_MAXNAMELEN);
if (error)
return(error);
- NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
+ NDINIT(&nd, LOOKUP | LOCKLEAF, FOLLOW, UIO_USERSPACE,
+ SCARG(uap, path), p);
if ((error = namei(&nd)) != 0)
return(error);
if ((error = vn_start_write(nd.ni_vp, &mp, V_WAIT | PCATCH)) != 0) {
- vrele(nd.ni_vp);
+ NDFREE(&nd, 0);
return (error);
}
error = VOP_SETEXTATTR(nd.ni_vp, attrname, NULL, p->p_cred->pc_ucred,
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index bda7e98..866abfb 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -535,7 +535,7 @@ vop_aclcheck {
};
#
-#% getextattr vp = = =
+#% getextattr vp L L L
#
vop_getextattr {
IN struct vnode *vp;
OpenPOWER on IntegriCloud