PERFORCE change 144380 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Mon Jun 30 19:54:35 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=144380
Change 144380 by trasz at trasz_traszkan on 2008/06/30 19:53:55
Backout some old stuff that is not relevant to the current work.
Affected files ...
.. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/include/namespace.h#4 edit
.. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/sys/Symbol.map#4 edit
.. //depot/projects/soc2008/trasz_nfs4acl/lib/libc_r/uthread/Makefile.inc#3 edit
.. //depot/projects/soc2008/trasz_nfs4acl/sys/compat/freebsd32/syscalls.master#3 edit
.. //depot/projects/soc2008/trasz_nfs4acl/sys/kern/syscalls.master#3 edit
.. //depot/projects/soc2008/trasz_nfs4acl/sys/kern/vfs_acl.c#3 edit
.. //depot/projects/soc2008/trasz_nfs4acl/sys/kern/vnode_if.src#3 edit
.. //depot/projects/soc2008/trasz_nfs4acl/sys/sys/acl.h#4 edit
.. //depot/projects/soc2008/trasz_nfs4acl/sys/ufs/ufs/ufs_acl.c#4 edit
Differences ...
==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/include/namespace.h#4 (text+ko) ====
@@ -53,8 +53,6 @@
#define __acl_delete_fd ___acl_delete_fd
#define __acl_get_fd ___acl_get_fd
#define __acl_set_fd ___acl_set_fd
-#define acl _acl
-#define facl _facl
#define bind _bind
#define __cap_get_fd ___cap_get_fd
#define __cap_set_fd ___cap_set_fd
==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/sys/Symbol.map#4 (text) ====
@@ -20,8 +20,6 @@
__acl_set_fd;
__acl_set_file;
__acl_set_link;
- acl;
- facl;
__getcwd;
__mac_execve;
__mac_get_fd;
==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc_r/uthread/Makefile.inc#3 (text+ko) ====
@@ -9,7 +9,6 @@
uthread_acl_get_fd.c \
uthread_acl_set_fd.c \
uthread_acl_aclcheck_fd.c \
- uthread_facl.c \
uthread_aio_suspend.c \
uthread_atfork.c \
uthread_attr_destroy.c \
==== //depot/projects/soc2008/trasz_nfs4acl/sys/compat/freebsd32/syscalls.master#3 (text+ko) ====
@@ -795,8 +795,6 @@
480 AUE_FTRUNCATE STD { int freebsd32_ftruncate(int fd, \
u_int32_t lengthlo, u_int32_t lengthhi); }
481 AUE_KILL NOPROTO { int thr_kill2(pid_t pid, long id, int sig); }
-482 AUE_NULL STD { int acl(char *path, int cmd, int nentries, void *aclp); }
-483 AUE_NULL STD { int facl(int filedes, int cmd, int nentries, void *aclp); }
482 AUE_SHMOPEN NOPROTO { int shm_open(const char *path, int flags, \
mode_t mode); }
483 AUE_SHMUNLINK NOPROTO { int shm_unlink(const char *path); }
==== //depot/projects/soc2008/trasz_nfs4acl/sys/kern/syscalls.master#3 (text+ko) ====
@@ -843,8 +843,6 @@
479 AUE_TRUNCATE STD { int truncate(char *path, off_t length); }
480 AUE_FTRUNCATE STD { int ftruncate(int fd, off_t length); }
481 AUE_KILL STD { int thr_kill2(pid_t pid, long id, int sig); }
-482 AUE_NULL STD { int acl(char *path, int cmd, int nentries, void *aclp); }
-483 AUE_NULL STD { int facl(int filedes, int cmd, int nentries, void *aclp); }
482 AUE_SHMOPEN STD { int shm_open(const char *path, int flags, \
mode_t mode); }
483 AUE_SHMUNLINK STD { int shm_unlink(const char *path); }
==== //depot/projects/soc2008/trasz_nfs4acl/sys/kern/vfs_acl.c#3 (text+ko) ====
@@ -66,8 +66,6 @@
static int vacl_aclcheck(struct thread *td, struct vnode *vp,
acl_type_t type, struct acl *aclp);
-MALLOC_DEFINE(M_ACE, "acebuffers", "NFSv4 ACL buffers");
-
/*
* These calls wrap the real vnode operations, and are called by the syscall
* code once the syscall has converted the path or file descriptor to a vnode
@@ -422,157 +420,6 @@
return (error);
}
-static int
-kacl_get(struct thread *td, struct vnode *vp, int nentries, void *aclp)
-{
- void *inkernelacl;
- int error, count;
-
- if (nentries <= 0 || nentries > MAX_ACL_ENTRIES)
- return (EINVAL);
-
- inkernelacl = malloc(nentries * sizeof(ace_t), M_ACE, M_ZERO | M_WAITOK);
- KASSERT(inkernelacl != NULL, "null inkernelacl");
-
- VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
-#if 0
- error = mac_check_vnode_getacl(td->td_ucred, vp, ACL_TYPE_NFS4);
- if (error != 0)
- goto out;
-#endif
- error = VOP_GETACE(vp, nentries, &count, inkernelacl, td->td_ucred, td);
-#ifdef MAC
-out:
-#endif
- VOP_UNLOCK(vp, 0, td);
-
- if (error == 0) {
- td->td_retval[0] = count;
- error = copyout(inkernelacl, aclp, nentries * sizeof(ace_t));
- }
-
- free(inkernelacl, M_ACE);
-
- return (error);
-}
-
-static int
-kacl_getaclcnt(struct thread *td, struct vnode *vp, int nentries, void *notused)
-{
- int error, count;
-
- VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
-#if 0
- error = mac_check_vnode_getacl(td->td_ucred, vp, ACL_TYPE_NFS4);
- if (error != 0)
- goto out;
-#endif
- error = VOP_GETACECNT(vp, &count, td->td_ucred, td);
-#ifdef MAC
-out:
-#endif
- VOP_UNLOCK(vp, 0, td);
-
- if (error == 0)
- td->td_retval[0] = count;
-
- return (error);
-}
-
-static int
-kacl_set(struct thread *td, struct vnode *vp, int nentries, void *aclp)
-{
- struct mount *mp;
- void *inkernelacl;
- int error;
-
- if (nentries <= 0 || nentries > MAX_ACL_ENTRIES)
- return (EINVAL);
-
- inkernelacl = malloc(nentries * sizeof(ace_t), M_ACE, M_ZERO | M_WAITOK);
- KASSERT(inkernelacl != NULL, "null inkernelacl");
-
- error = copyin(aclp, inkernelacl, nentries * sizeof(ace_t));
- if (error)
- goto out_free;
-
- error = vn_start_write(vp, &mp, V_WAIT | PCATCH);
- if (error != 0)
- goto out_free;
-
- VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
-#if 0
- error = mac_check_vnode_setacl(td->td_ucred, vp, type, &inkernelacl);
- if (error != 0)
- goto out;
-#endif
- error = VOP_SETACE(vp, nentries, inkernelacl, td->td_ucred, td);
-#ifdef MAC
-out:
-#endif
- VOP_UNLOCK(vp, 0, td);
- vn_finished_write(mp);
-
-out_free:
- free(inkernelacl, M_ACE);
-
- return (error);
-}
-
-static int
-kacl(struct thread *td, struct vnode *vp, int cmd, int nentries, void *aclp)
-{
- switch (cmd) {
- case ACE_GETACL:
- return (kacl_get(td, vp, nentries, aclp));
-
- case ACE_GETACLCNT:
- return (kacl_getaclcnt(td, vp, nentries, aclp));
-
- case ACE_SETACL:
- return (kacl_set(td, vp, nentries, aclp));
-
- default:
- return (EINVAL);
- }
-}
-
-int
-acl(struct thread *td, struct acl_args *uap)
-{
- struct nameidata nd;
- int vfslocked, error;
-
- NDINIT(&nd, LOOKUP, MPSAFE|FOLLOW, UIO_USERSPACE, uap->path, td);
- error = namei(&nd);
- vfslocked = NDHASGIANT(&nd);
- if (error == 0) {
- error = kacl(td, nd.ni_vp, uap->cmd, uap->nentries, uap->aclp);
- NDFREE(&nd, 0);
- }
- VFS_UNLOCK_GIANT(vfslocked);
- return (error);
-}
-
-int
-facl(struct thread *td, struct facl_args *uap)
-{
- struct file *fp;
- int vfslocked, error;
-
- error = getvnode(td->td_proc->p_fd, uap->filedes, &fp);
- if (error == 0) {
- vfslocked = VFS_LOCK_GIANT(fp->f_vnode->v_mount);
- error = kacl(td, fp->f_vnode, uap->cmd, uap->nentries, uap->aclp);
- fdrop(fp, td);
- VFS_UNLOCK_GIANT(vfslocked);
- }
- return (error);
-}
-
/* ARGUSED */
static void
==== //depot/projects/soc2008/trasz_nfs4acl/sys/kern/vnode_if.src#3 (text+ko) ====
@@ -513,35 +513,6 @@
IN struct thread *td;
};
-%% getace vp L L L
-
-vop_getace {
- IN struct vnode *vp;
- IN int nentries;
- OUT int *count;
- OUT void *aclp;
- IN struct ucred *cred;
- IN struct thread *td;
-};
-
-%% getacecnt vp L L L
-
-vop_getacecnt {
- IN struct vnode *vp;
- OUT int *count;
- IN struct ucred *cred;
- IN struct thread *td;
-};
-
-%% setace vp E E E
-
-vop_setace {
- IN struct vnode *vp;
- IN int nentries;
- IN void *aclp;
- IN struct ucred *cred;
- IN struct thread *td;
-};
%% closeextattr vp L L L
==== //depot/projects/soc2008/trasz_nfs4acl/sys/sys/acl.h#4 (text+ko) ====
@@ -113,65 +113,8 @@
*/
#define ACL_UNDEFINED_ID ((uid_t)-1)
-/*
- * NFSv4 ACL types and related constants.
- */
-#ifndef _SOLARIS_C_SOURCE /* XXX: Otherwise zfs won't compile. */
-#define NFS4_ACL_EXTATTR_NAMESPACE EXTATTR_NAMESPACE_SYSTEM
-#define NFS4_ACL_EXTATTR_NAME "nfs4.acl"
-#define NFS4_ACLCNT_EXTATTR_NAME "nfs4.aclcount"
-
-#define MAX_ACL_ENTRIES 1024
-
-typedef uint32_t ace_type_t;
-typedef uint32_t ace_flags_t;
-typedef uint32_t ace_mask_t;
-
-struct ace_t_struct {
- ace_type_t a_type;
- ace_flags_t a_flags;
- ace_mask_t a_access_mask;
- uid_t a_who;
-};
-typedef struct ace_t_struct ace_t;
-
-/*
- * Possible values for a_type field.
- */
-#define ACE_ACCESS_ALLOWED_ACE_TYPE 0x00000000
-#define ACE_ACCESS_DENIED_ACE_TYPE 0x00000001
-#define ACE_SYSTEM_AUDIT_ACE_TYPE 0x00000002
-#define ACE_SYSTEM_ALARM_ACE_TYPE 0x00000003
-
-/*
- * Possible values for a_flags field.
- */
-#define ACE_FILE_INHERIT_ACE 0x00000001
-#define ACE_DIRECTORY_INHERIT_ACE 0x00000002
-#define ACE_NO_PROPAGATE_INHERIT_ACE 0x00000004
-#define ACE_INHERIT_ONLY_ACE 0x00000008
-#define ACE_SUCCESSFUL_ACCESS_ACE_FLAG 0x00000010
-#define ACE_FAILED_ACCESS_ACE_FLAG 0x00000020
-#define ACE_IDENTIFIER_GROUP 0x00000040
-
-/*
- * The following three values go into a_flags field and mean,
- * respectively, OWNER@, GROUP@ and EVERYONE at .
- */
-#define ACE_OWNER 0x10000000
-#define ACE_GROUP 0x20000000
-#define ACE_EVERYONE 0x40000000
-
-/*
- * Possible values for a_access_mask field.
- */
-#define ACE_READ_DATA 0x00000001
-#define ACE_LIST_DIRECTORY 0x00000001
-#define ACE_WRITE_DATA 0x00000002
-#define ACE_ADD_FILE 0x00000002
-#define ACE_APPEND_DATA 0x00000004
-#define ACE_ADD_SUBDIRECTORY 0x00000004
+#define ACE_ACE_ADD_SUBDIRECTORY 0x00000004
#define ACE_READ_NAMED_ATTRS 0x00000008
#define ACE_WRITE_NAMED_ATTRS 0x00000010
#define ACE_EXECUTE 0x00000020
@@ -195,8 +138,6 @@
#ifdef _KERNEL
-MALLOC_DECLARE(M_ACE);
-
extern uma_zone_t acl_zone;
/*
@@ -232,7 +173,7 @@
/*
* Syscall interface -- use the library calls instead as the syscalls have
- * strict acl entry ordering requirements. This does not support NFSv4 ACLs.
+ * strict acl entry ordering requirements.
*/
__BEGIN_DECLS
int __acl_aclcheck_fd(int _filedes, acl_type_t _type, struct acl *_aclp);
@@ -252,14 +193,6 @@
__END_DECLS
/*
- * SunOS-compatible syscall interface. It supports only NFSv4 ACLs (ace_t).
- */
-__BEGIN_DECLS
-int acl(char *_path, int _cmd, int _nentries, void *_aclp);
-int facl(int _filedes, int _cmd, int _nentries, void *_aclp);
-__END_DECLS
-
-/*
* Supported POSIX.1e ACL manipulation and assignment/retrieval API _np calls
* are local extensions that reflect an environment capable of opening file
* descriptors of directories, and allowing additional ACL type for different
==== //depot/projects/soc2008/trasz_nfs4acl/sys/ufs/ufs/ufs_acl.c#4 (text+ko) ====
@@ -438,263 +438,4 @@
return (acl_posix1e_check(ap->a_aclp));
}
-int
-ufs_load_acecnt(struct vnode *vp, int *nentries, struct thread *td)
-{
- int error, length;
-
- length = sizeof (*nentries);
-
- error = vn_extattr_get(vp, IO_NODELOCKED,
- NFS4_ACL_EXTATTR_NAMESPACE,
- NFS4_ACLCNT_EXTATTR_NAME, &length,
- (char *)nentries, td);
-
- if (error == 0 && length != sizeof (*nentries)) {
- printf("ufs_load_acecnt: short read (%d bytes)\n", length);
- return (EIO);
- }
-
- if (error != 0 && error != ENOATTR)
- printf("ufs_load_acecnt: error %d\n", error);
-
- return error;
-}
-
-static void
-ace_pair(ace_t *denied, ace_t *allowed, uint32_t flags, uint32_t allowed_mask, uint32_t denied_mask)
-{
- /* XXX: SunOS seems to put 0xffffffff here. */
- allowed->a_who = denied->a_who = 0;
- allowed->a_flags = denied->a_flags = flags;
- allowed->a_type = ACE_ACCESS_ALLOWED_ACE_TYPE;
- allowed->a_access_mask = allowed_mask;
- denied->a_type = ACE_ACCESS_DENIED_ACE_TYPE;
- denied->a_access_mask = denied_mask;
-}
-
-int
-ufs_nfs4acl_from_inode(struct vop_getace_args *ap)
-{
- struct inode *ip = VTOI(ap->a_vp);
- uint32_t allowed, denied;
- ace_t *aces = ap->a_aclp;
-
- if (ap->a_nentries < 6)
- return (ENOSPC);
-
- /* XXX: Where is this thing described in the spec? */
- allowed = 0;
- if (ip->i_mode & S_IRUSR)
- allowed |= ACE_READ_DATA;
- if (ip->i_mode & S_IWUSR)
- allowed |= ACE_WRITE_DATA | ACE_APPEND_DATA;
- if (ip->i_mode & S_IXUSR)
- allowed |= ACE_EXECUTE;
- denied = ~allowed & (ACE_READ_DATA | ACE_WRITE_DATA | ACE_APPEND_DATA | ACE_EXECUTE);
- allowed |= ACE_WRITE_NAMED_ATTRS | ACE_WRITE_ATTRIBUTES | ACE_WRITE_ACL | ACE_WRITE_OWNER;
-
- ace_pair(&aces[0], &aces[1], ACE_OWNER, allowed, denied);
-
- allowed = 0;
- if (ip->i_mode & S_IRGRP)
- allowed |= ACE_READ_DATA;
- if (ip->i_mode & S_IWGRP)
- allowed |= ACE_WRITE_DATA | ACE_APPEND_DATA;
- if (ip->i_mode & S_IXGRP)
- allowed |= ACE_EXECUTE;
- denied = ~allowed & (ACE_READ_DATA | ACE_WRITE_DATA | ACE_APPEND_DATA | ACE_EXECUTE);
-
- ace_pair(&aces[2], &aces[3], ACE_GROUP, allowed, denied);
-
- allowed = 0;
- if (ip->i_mode & S_IROTH)
- allowed |= ACE_READ_DATA;
- if (ip->i_mode & S_IWOTH)
- allowed |= ACE_WRITE_DATA | ACE_APPEND_DATA;
- if (ip->i_mode & S_IXOTH)
- allowed |= ACE_EXECUTE;
- denied = ~allowed & (ACE_READ_DATA | ACE_WRITE_DATA | ACE_APPEND_DATA | ACE_EXECUTE);
- denied |= ACE_WRITE_NAMED_ATTRS | ACE_WRITE_ATTRIBUTES | ACE_WRITE_ACL | ACE_WRITE_OWNER;
- allowed |= ACE_READ_NAMED_ATTRS | ACE_READ_ATTRIBUTES | ACE_READ_ACL | ACE_SYNCHRONIZE;
-
- ace_pair(&aces[4], &aces[5], ACE_EVERYONE, allowed, denied);
-
- *(ap->a_count) = 6;
-
- return (0);
-}
-
-void
-ufs_sync_inode_from_nfs4acl(ace_t *aclp, int nentries, struct inode *ip)
-{
-}
-
-int
-ufs_getace(struct vop_getace_args *ap)
-{
- int error, length, expected_length;
-
- /*
- * XXX: If ufs_getace() should work on file systems not supporting
- * ACLs, remove this check.
- */
- if ((ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) == 0)
- return (EOPNOTSUPP);
-
- error = ufs_load_acecnt(ap->a_vp, ap->a_count, ap->a_td);
- switch (error) {
- case ENOATTR:
- return (ufs_nfs4acl_from_inode(ap));
-
- case 0:
- break;
-
- default:
- return (EPERM);
- }
-
- if (*(ap->a_count) > ap->a_nentries)
- return (ENOSPC);
-
- expected_length = *(ap->a_count) * sizeof(ace_t);
- length = expected_length;
-
- error = vn_extattr_get(ap->a_vp, IO_NODELOCKED,
- NFS4_ACL_EXTATTR_NAMESPACE,
- NFS4_ACL_EXTATTR_NAME, &length, (char *)ap->a_aclp,
- ap->a_td);
-
- switch (error) {
- /* XXX: If ufs_getace() should work on filesystems without
- * the EA configured, add case EOPNOTSUPP here. */
- case ENOATTR:
- /*
- * Legitimately no ACL set on object, purely
- * emulate it through the inode. These fields will
- * be updated when the ACL is synchronized with
- * the inode later.
- */
- return (ufs_nfs4acl_from_inode(ap));
-
- case 0:
- if (length != expected_length) {
- /*
- * A short (or long) read, meaning that for
- * some reason the ACL is corrupted. Return
- * EPERM since the object DAC protections
- * are unsafe.
- */
- printf("ufs_getace(): short read, wanted %d bytes, "
- "got only %d.", expected_length, length);
-
- return (EPERM);
- }
-
- break;
-
- default:
- error = EINVAL;
- }
-
- return (error);
-}
-
-int
-ufs_getacecnt(struct vop_getacecnt_args *ap)
-{
- int error;
-
- /*
- * XXX: If ufs_getacecnt() should work on file systems not supporting
- * ACLs, remove this check.
- */
- if ((ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) == 0)
- return (EOPNOTSUPP);
-
- error = ufs_load_acecnt(ap->a_vp, ap->a_count, ap->a_td);
-
- if (error == ENOATTR) {
- *(ap->a_count) = 6;
- error = 0;
- }
-
- /* If the loaded ACE count is too big, return error. */
- if (*(ap->a_count) > MAX_ACL_ENTRIES)
- return (EIO);
-
- return (error);
-}
-
-int
-ufs_setace(struct vop_setace_args *ap)
-{
- struct inode *ip = VTOI(ap->a_vp);
- int error, nentries;
-
- if ((ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) == 0)
- return (EOPNOTSUPP);
-
- /*
- * XXX: Check if ACL is valid.
- */
-
- /*
- * XXX: Remove ACL if it's trivial.
- */
-
- if (ap->a_vp->v_mount->mnt_flag & MNT_RDONLY)
- return (EROFS);
-
- /*
- * Authorize the ACL operation.
- */
- if (ip->i_flags & (IMMUTABLE | APPEND))
- return (EPERM);
-
- /*
- * Must hold VADMIN (be file owner) or have appropriate privilege.
- */
- if ((error = VOP_ACCESS(ap->a_vp, VADMIN, ap->a_cred, ap->a_td)))
- return (error);
-
- nentries = ap->a_nentries;
-
- error = vn_extattr_set(ap->a_vp, IO_NODELOCKED,
- NFS4_ACL_EXTATTR_NAMESPACE,
- NFS4_ACLCNT_EXTATTR_NAME, sizeof(int),
- (char *)&nentries, ap->a_td);
-
- if (error == ENOATTR)
- return (EOPNOTSUPP);
-
- if (error != 0)
- return (error);
-
- error = vn_extattr_set(ap->a_vp, IO_NODELOCKED,
- NFS4_ACL_EXTATTR_NAMESPACE,
- NFS4_ACL_EXTATTR_NAME, ap->a_nentries * sizeof(ace_t),
- (char *)ap->a_aclp, ap->a_td);
-
- /*
- * Map lack of attribute definition in UFS_EXTATTR into lack of
- * support for ACLs on the filesystem.
- */
- if (error == ENOATTR)
- return (EOPNOTSUPP);
-
- if (error != 0)
- return (error);
-
- /*
- * Now that the EA is successfully updated, update the
- * inode and mark it as changed.
- */
- ufs_sync_inode_from_nfs4acl(ap->a_aclp, ap->a_nentries, ip);
- ip->i_flag |= IN_CHANGE;
-
- VN_KNOTE_UNLOCKED(ap->a_vp, NOTE_ATTRIB);
- return (0);
-}
-
#endif /* !UFS_ACL */
More information about the p4-projects
mailing list