ext2/3 updates for 2.5.44 (9/11): core acl support 3
PATCH 1/1 ext2/3 updates for 2.5.44 (9/11): core acl support 3
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/10/20 [email protected] 1.818
# Port 0.8.50 acl-xattr patch to 2.5 (harmonize header file with SGI/XFS) #
# This patch provides converts extended attributes passed in from user
# space to a generic Posix ACL representation. # -------------------------------------------- # # fs/Makefile | 4 - # fs/xattr_acl.c | 99 ++++++++++++++++++++++++++++++++++++++++ # include/linux/posix_acl_xattr.h | 55 ++++++++++++++++++++++ # include/linux/xattr_acl.h | 50 ++++++++++++++++++++ # 4 files changed, 206 insertions(+), 2 deletions(-) # diff -Nru a/fs/Makefile b/fs/Makefile --- a/fs/Makefile Sun Oct 20 04:41:57 2002 +++ b/fs/Makefile Sun Oct 20 04:41:57 2002 @@ -6,7 +6,7 @@ #
export-objs := open.o dcache.o buffer.o bio.o inode.o dquot.o mpage.o aio.o \
- fcntl.o read_write.o dcookies.o mbcache.o
+ fcntl.o read_write.o dcookies.o mbcache.o xattr_acl.o
obj-y := open.o read_write.o devices.o file_table.o buffer.o \
bio.o super.o block_dev.o char_dev.o stat.o exec.o pipe.o \
@@ -31,7 +31,7 @@
obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o
obj-$(CONFIG_FS_MBCACHE) += mbcache.o
-obj-$(CONFIG_FS_POSIX_ACL) += posix_acl.o
+obj-$(CONFIG_FS_POSIX_ACL) += posix_acl.o xattr_acl.o
obj-$(CONFIG_QUOTA) += dquot.o
obj-$(CONFIG_QFMT_V1) += quota_v1.o
fs/xattr_acl.c new file +99 -0
@@ -0,0 +1,99 @@ +/* +* linux/fs/xattr_acl.c +* +* Almost all from linux/fs/ext2/acl.c: +* Copyright (C) 2001 by Andreas Gruenbacher, <[email protected]> +*/ + +#include <linux/module.h> +#include <linux/sched.h> +#include <linux/slab.h> +#include <linux/fs.h> +#include <linux/posix_acl_xattr.h> + + +/* +* Convert from extended attribute to in-memory representation. +*/ +struct posix_acl * +posix_acl_from_xattr (const void *value,size_t size) +{ +posix_acl_xattr_header *header = (posix_acl_xattr_header *)value; +posix_acl_xattr_entry *entry = (posix_acl_xattr_entry *)(header+1 ), *end; +int count; +struct posix_acl *acl; +struct posix_acl_entry *acl_e; + +if (!value) +return NULL ; +if (size <sizeof (posix_acl_xattr_header)) +return ERR_PTR (-EINVAL ); +if (header->a_version !=cpu_to_le32 (POSIX_ACL_XATTR_VERSION )) +return ERR_PTR (-EINVAL ); + + count =posix_acl_xattr_count (size); +if (count <0 ) +return ERR_PTR (-EINVAL ); +if (count ==0 ) +return NULL ; + + acl =posix_acl_alloc (count,GFP_KERNEL ); +if (!acl) +return ERR_PTR (-ENOMEM ); + acl_e = acl->a_entries; + +for (end = entry + count; entry != end; acl_e++, entry++) { + acl_e->e_tag =le16_to_cpu (entry->e_tag); + acl_e->e_perm =le16_to_cpu (entry->e_perm); + +switch (acl_e->e_tag) { +case ACL_USER_OBJ : +case ACL_GROUP_OBJ : +case ACL_MASK : +case ACL_OTHER : + acl_e->e_id =ACL_UNDEFINED_ID ; +break ; + +case ACL_USER : +case ACL_GROUP : + acl_e->e_id =le32_to_cpu (entry->e_id); +break ; + +default : + goto fail; + } + } +return acl; + +fail: +posix_acl_release (acl); +return ERR_PTR (-EINVAL ); +} +EXPORT_SYMBOL (posix_acl_from_xattr); + +/* +* Convert from in-memory to extended attribute representation. +*/ +int +posix_acl_to_xattr (const struct posix_acl *acl,void *buffer,size_t size) +{ +posix_acl_xattr_header *ext_acl = (posix_acl_xattr_header *)buffer; +posix_acl_xattr_entry *ext_entry = ext_acl->a_entries; +int real_size, n; + + real_size =posix_acl_xattr_size (acl->a_count); +if (!buffer) +return real_size; +if (real_size > size) +return -ERANGE ; + + ext_acl->a_version =cpu_to_le32 (POSIX_ACL_XATTR_VERSION ); + +for (n=0 ; n < acl->a_count; n++, ext_entry++) { + ext_entry->e_tag =cpu_to_le16 (acl->a_entries[n].e_tag); + ext_entry->e_perm =cpu_to_le16 (acl->a_entries[n].e_perm); + ext_entry->e_id =cpu_to_le32 (acl->a_entries[n].e_id); + } +return real_size; +} +EXPORT_SYMBOL (posix_acl_to_xattr);
include/linux/posix_acl_xattr.h new file +55 -0
55 lines not on this page · raw message
include/linux/xattr_acl.h new file +50 -0
50 lines not on this page · raw message