From 988ee790d4e9e65ca1df196629bc69d1b9d42ddf Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Thu, 21 Sep 2000 18:43:32 +0000 Subject: [PATCH] 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 --- sys/kern/kern_acl.c | 5 ++++- sys/kern/subr_acl_posix1e.c | 5 ++++- sys/kern/vfs_acl.c | 5 ++++- 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 882d47b5fec..3c9eb6e4a37 100644 --- a/sys/kern/kern_acl.c +++ b/sys/kern/kern_acl.c @@ -46,7 +46,7 @@ #include #include -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 882d47b5fec..3c9eb6e4a37 100644 --- a/sys/kern/subr_acl_posix1e.c +++ b/sys/kern/subr_acl_posix1e.c @@ -46,7 +46,7 @@ #include #include -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 882d47b5fec..3c9eb6e4a37 100644 --- a/sys/kern/vfs_acl.c +++ b/sys/kern/vfs_acl.c @@ -46,7 +46,7 @@ #include #include -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 7a6d8ae7176..36911fb070e 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;