vfs_acl.c (90202) | vfs_acl.c (91406) |
---|---|
1/*- 2 * Copyright (c) 1999-2001 Robert N. M. Watson 3 * All rights reserved. 4 * 5 * This software was developed by Robert Watson for the TrustedBSD Project. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * | 1/*- 2 * Copyright (c) 1999-2001 Robert N. M. Watson 3 * All rights reserved. 4 * 5 * This software was developed by Robert Watson for the TrustedBSD Project. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * |
28 * $FreeBSD: head/sys/kern/vfs_acl.c 90202 2002-02-04 17:58:15Z rwatson $ | 28 * $FreeBSD: head/sys/kern/vfs_acl.c 91406 2002-02-27 18:32:23Z jhb $ |
29 */ 30/* 31 * Developed by the TrustedBSD Project. 32 * Support for POSIX.1e access control lists. 33 */ 34 35#include "opt_cap.h" 36 --- 537 unchanged lines hidden (view full) --- 574 int error; 575 576 error = copyin(aclp, &inkernacl, sizeof(struct acl)); 577 if (error) 578 return(error); 579 error = vn_start_write(vp, &mp, V_WAIT | PCATCH); 580 if (error != 0) 581 return (error); | 29 */ 30/* 31 * Developed by the TrustedBSD Project. 32 * Support for POSIX.1e access control lists. 33 */ 34 35#include "opt_cap.h" 36 --- 537 unchanged lines hidden (view full) --- 574 int error; 575 576 error = copyin(aclp, &inkernacl, sizeof(struct acl)); 577 if (error) 578 return(error); 579 error = vn_start_write(vp, &mp, V_WAIT | PCATCH); 580 if (error != 0) 581 return (error); |
582 VOP_LEASE(vp, td, td->td_proc->p_ucred, LEASE_WRITE); | 582 VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE); |
583 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); | 583 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); |
584 error = VOP_SETACL(vp, type, &inkernacl, td->td_proc->p_ucred, td); | 584 error = VOP_SETACL(vp, type, &inkernacl, td->td_ucred, td); |
585 VOP_UNLOCK(vp, 0, td); 586 vn_finished_write(mp); 587 return(error); 588} 589 590/* 591 * Given a vnode, get its ACL. 592 */ 593static int 594vacl_get_acl(struct thread *td, struct vnode *vp, acl_type_t type, 595 struct acl *aclp) 596{ 597 struct acl inkernelacl; 598 int error; 599 | 585 VOP_UNLOCK(vp, 0, td); 586 vn_finished_write(mp); 587 return(error); 588} 589 590/* 591 * Given a vnode, get its ACL. 592 */ 593static int 594vacl_get_acl(struct thread *td, struct vnode *vp, acl_type_t type, 595 struct acl *aclp) 596{ 597 struct acl inkernelacl; 598 int error; 599 |
600 VOP_LEASE(vp, td, td->td_proc->p_ucred, LEASE_WRITE); | 600 VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE); |
601 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); | 601 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); |
602 error = VOP_GETACL(vp, type, &inkernelacl, td->td_proc->p_ucred, td); | 602 error = VOP_GETACL(vp, type, &inkernelacl, td->td_ucred, td); |
603 VOP_UNLOCK(vp, 0, td); 604 if (error == 0) 605 error = copyout(&inkernelacl, aclp, sizeof(struct acl)); 606 return (error); 607} 608 609/* 610 * Given a vnode, delete its ACL. 611 */ 612static int 613vacl_delete(struct thread *td, struct vnode *vp, acl_type_t type) 614{ 615 struct mount *mp; 616 int error; 617 618 error = vn_start_write(vp, &mp, V_WAIT | PCATCH); 619 if (error) 620 return (error); | 603 VOP_UNLOCK(vp, 0, td); 604 if (error == 0) 605 error = copyout(&inkernelacl, aclp, sizeof(struct acl)); 606 return (error); 607} 608 609/* 610 * Given a vnode, delete its ACL. 611 */ 612static int 613vacl_delete(struct thread *td, struct vnode *vp, acl_type_t type) 614{ 615 struct mount *mp; 616 int error; 617 618 error = vn_start_write(vp, &mp, V_WAIT | PCATCH); 619 if (error) 620 return (error); |
621 VOP_LEASE(vp, td, td->td_proc->p_ucred, LEASE_WRITE); | 621 VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE); |
622 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); | 622 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); |
623 error = VOP_SETACL(vp, ACL_TYPE_DEFAULT, 0, td->td_proc->p_ucred, 624 td); | 623 error = VOP_SETACL(vp, ACL_TYPE_DEFAULT, 0, td->td_ucred, td); |
625 VOP_UNLOCK(vp, 0, td); 626 vn_finished_write(mp); 627 return (error); 628} 629 630/* 631 * Given a vnode, check whether an ACL is appropriate for it 632 */ 633static int 634vacl_aclcheck(struct thread *td, struct vnode *vp, acl_type_t type, 635 struct acl *aclp) 636{ 637 struct acl inkernelacl; 638 int error; 639 640 error = copyin(aclp, &inkernelacl, sizeof(struct acl)); 641 if (error) 642 return(error); | 624 VOP_UNLOCK(vp, 0, td); 625 vn_finished_write(mp); 626 return (error); 627} 628 629/* 630 * Given a vnode, check whether an ACL is appropriate for it 631 */ 632static int 633vacl_aclcheck(struct thread *td, struct vnode *vp, acl_type_t type, 634 struct acl *aclp) 635{ 636 struct acl inkernelacl; 637 int error; 638 639 error = copyin(aclp, &inkernelacl, sizeof(struct acl)); 640 if (error) 641 return(error); |
643 error = VOP_ACLCHECK(vp, type, &inkernelacl, td->td_proc->p_ucred, 644 td); | 642 error = VOP_ACLCHECK(vp, type, &inkernelacl, td->td_ucred, td); |
645 return (error); 646} 647 648/* 649 * syscalls -- convert the path/fd to a vnode, and call vacl_whatever. 650 * Don't need to lock, as the vacl_ code will get/release any locks 651 * required. 652 */ --- 179 unchanged lines hidden --- | 643 return (error); 644} 645 646/* 647 * syscalls -- convert the path/fd to a vnode, and call vacl_whatever. 648 * Don't need to lock, as the vacl_ code will get/release any locks 649 * required. 650 */ --- 179 unchanged lines hidden --- |