diff options
author | rwatson <rwatson@FreeBSD.org> | 2000-09-21 18:43:32 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2000-09-21 18:43:32 +0000 |
commit | bda3a405627ec80f8878553eca0eb4033260a76c (patch) | |
tree | 238150d251e08d2ca310ec80d04b096a125c4345 | |
parent | 1023c32e1a3679b96f5d97f326b05c06529b214c (diff) | |
download | FreeBSD-src-bda3a405627ec80f8878553eca0eb4033260a76c.zip FreeBSD-src-bda3a405627ec80f8878553eca0eb4033260a76c.tar.gz |
o Change locking rules for VOP_GETACL() to indicate that vnode locks
must be held when retrieving ACLs from vnodes. This is required for
EA-based UFS ACL implementations.
o Update vacl_get_acl() so that it does appropriate vnode locking.
o Remove static from M_ACL malloc define so that it is accessible for
consumers of ACLs other than in kern_acl.c
Obtained from: TrustedBSD Project
-rw-r--r-- | sys/kern/kern_acl.c | 5 | ||||
-rw-r--r-- | sys/kern/subr_acl_posix1e.c | 5 | ||||
-rw-r--r-- | sys/kern/vfs_acl.c | 5 | ||||
-rw-r--r-- | sys/kern/vnode_if.src | 2 |
4 files changed, 13 insertions, 4 deletions
diff --git a/sys/kern/kern_acl.c b/sys/kern/kern_acl.c index 882d47b..3c9eb6e 100644 --- a/sys/kern/kern_acl.c +++ b/sys/kern/kern_acl.c @@ -46,7 +46,7 @@ #include <sys/stat.h> #include <sys/acl.h> -static MALLOC_DEFINE(M_ACL, "acl", "access control list"); +MALLOC_DEFINE(M_ACL, "acl", "access control list"); static int vacl_set_acl(struct proc *p, struct vnode *vp, acl_type_t type, struct acl *aclp); @@ -94,7 +94,10 @@ vacl_get_acl(struct proc *p, struct vnode *vp, acl_type_t type, struct acl inkernelacl; int error; + VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); error = VOP_GETACL(vp, type, &inkernelacl, p->p_ucred, p); + VOP_UNLOCK(vp, 0, p); if (error == 0) error = copyout(&inkernelacl, aclp, sizeof(struct acl)); return (error); diff --git a/sys/kern/subr_acl_posix1e.c b/sys/kern/subr_acl_posix1e.c index 882d47b..3c9eb6e 100644 --- a/sys/kern/subr_acl_posix1e.c +++ b/sys/kern/subr_acl_posix1e.c @@ -46,7 +46,7 @@ #include <sys/stat.h> #include <sys/acl.h> -static MALLOC_DEFINE(M_ACL, "acl", "access control list"); +MALLOC_DEFINE(M_ACL, "acl", "access control list"); static int vacl_set_acl(struct proc *p, struct vnode *vp, acl_type_t type, struct acl *aclp); @@ -94,7 +94,10 @@ vacl_get_acl(struct proc *p, struct vnode *vp, acl_type_t type, struct acl inkernelacl; int error; + VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); error = VOP_GETACL(vp, type, &inkernelacl, p->p_ucred, p); + VOP_UNLOCK(vp, 0, p); if (error == 0) error = copyout(&inkernelacl, aclp, sizeof(struct acl)); return (error); diff --git a/sys/kern/vfs_acl.c b/sys/kern/vfs_acl.c index 882d47b..3c9eb6e 100644 --- a/sys/kern/vfs_acl.c +++ b/sys/kern/vfs_acl.c @@ -46,7 +46,7 @@ #include <sys/stat.h> #include <sys/acl.h> -static MALLOC_DEFINE(M_ACL, "acl", "access control list"); +MALLOC_DEFINE(M_ACL, "acl", "access control list"); static int vacl_set_acl(struct proc *p, struct vnode *vp, acl_type_t type, struct acl *aclp); @@ -94,7 +94,10 @@ vacl_get_acl(struct proc *p, struct vnode *vp, acl_type_t type, struct acl inkernelacl; int error; + VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); error = VOP_GETACL(vp, type, &inkernelacl, p->p_ucred, p); + VOP_UNLOCK(vp, 0, p); if (error == 0) error = copyout(&inkernelacl, aclp, sizeof(struct acl)); return (error); diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src index 7a6d8ae..36911fb 100644 --- a/sys/kern/vnode_if.src +++ b/sys/kern/vnode_if.src @@ -502,7 +502,7 @@ vop_bwrite { }; # -#% getacl vp = = = +#% getacl vp L L L # vop_getacl { IN struct vnode *vp; |