ocfs2: add security EA and ACL support v3
Subsystems (3)
cover ocfs2: add security EA and ACL support v3
Hi,
These three patches fix the problems in the version two. And them base on the Tao's patches:
ocfs2/xattr: xattr improvement
The first patch fix some problem in xattr code.
The second patch add security EA support.
The third patch add ACL support.
Best regards,
tiger
PATCH 1/3 ocfs2/xattr: some fix in xattr
This patch fix some function declaration problem in xattr.
--- fs/ocfs2/xattr.c | 52 +++++++++++++++++++++++++++++----------------------- fs/ocfs2/xattr.h | 38 ++++++-------------------------------- 2 files changed, 35 insertions(+), 55 deletions(-)
fs/ocfs2/xattr.c +29 -23
@@ -3,25 +3,20 @@* * xattr.c * -* Copyright (C) 2008 Oracle. All rights reserved. +* Copyright (C) 2004, 2008 Oracle. All rights reserved. * * CREDITS: -* Lots of code in this file is taken from ext3. +* Lots of code in this file is copy from linux/fs/ext3/xattr.c. +* Copyright (C) 2001-2003 Andreas Gruenbacher, <[email protected]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public -* License as published by the Free Software Foundation; either -* version 2 of the License, or (at your option) any later version. +* License version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. -* -* You should have received a copy of the GNU General Public -* License along with this program; if not, write to the -* Free Software Foundation, Inc., 59 Temple Place - Suite 330, -* Boston, MA 021110-1307, USA. */ #include <linux/capability.h>
@@ -147,6 +142,24 @@ static int ocfs2_xattr_set_entry_index_block(struct inode *inode,static int ocfs2_delete_xattr_index_block (struct inode *inode,struct buffer_head *xb_bh); +static inline u16 ocfs2_xattr_buckets_per_cluster (struct ocfs2_super *osb) +{ +return (1 << osb->s_clustersize_bits) /OCFS2_XATTR_BUCKET_SIZE ; +} + +static inline u16 ocfs2_blocks_per_xattr_bucket (struct super_block *sb) +{ +return OCFS2_XATTR_BUCKET_SIZE / (1 << sb->s_blocksize_bits); +} + +static inline u16 ocfs2_xattr_max_xe_in_bucket (struct super_block *sb) +{ +u16 len = sb->s_blocksize - + offsetof(struct ocfs2_xattr_header , xh_entries); + +return len /sizeof (struct ocfs2_xattr_entry ); +} +static inline const char *ocfs2_xattr_prefix (int name_index) {struct xattr_handler *handler =NULL ;
@@ -800,11 +813,11 @@ cleanup:* Copy an extended attribute into the buffer provided. * Buffer is NULL to compute the size of buffer required. */ -int ocfs2_xattr_get (struct inode *inode, -int name_index, -const char *name, -void *buffer, -size_t buffer_size) +static int ocfs2_xattr_get (struct inode *inode, +int name_index, +const char *name, +void *buffer, +size_t buffer_size) {int ret;struct ocfs2_dinode *di =NULL ;
@@ -4925,14 +4938,11 @@ out:/* * 'trusted' attributes support */ - -#define XATTR_TRUSTED_PREFIX "trusted." -static size_t ocfs2_xattr_trusted_list (struct inode *inode,char *list,size_t list_size,const char *name,size_t name_len) { -const size_t prefix_len =sizeof (XATTR_TRUSTED_PREFIX ) -1 ; +const size_t prefix_len =XATTR_TRUSTED_PREFIX_LEN ;const size_t total_len = prefix_len + name_len +1 ;if (list && total_len <= list_size) {
@@ -4969,18 +4979,14 @@ struct xattr_handler ocfs2_xattr_trusted_handler = { .set = ocfs2_xattr_trusted_set, }; -/* * 'user' attributes support */ - -#define XATTR_USER_PREFIX "user." -static size_t ocfs2_xattr_user_list (struct inode *inode,char *list,size_t list_size,const char *name,size_t name_len) { -const size_t prefix_len =sizeof (XATTR_USER_PREFIX ) -1 ; +const size_t prefix_len =XATTR_USER_PREFIX_LEN ;const size_t total_len = prefix_len + name_len +1 ;struct ocfs2_super *osb =OCFS2_SB (inode->i_sb);
fs/ocfs2/xattr.h +6 -32
@@ -3,24 +3,16 @@* * xattr.h * -* Function prototypes -* -* Copyright (C) 2008 Oracle. All rights reserved. +* Copyright (C) 2004, 2008 Oracle. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public -* License as published by the Free Software Foundation; either -* version 2 of the License, or (at your option) any later version. +* License version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. -* -* You should have received a copy of the GNU General Public -* License along with this program; if not, write to the -* Free Software Foundation, Inc., 59 Temple Place - Suite 330, -* Boston, MA 021110-1307, USA. */ #ifndef OCFS2_XATTR_H
@@ -40,29 +32,11 @@ enum ocfs2_xattr_type {extern struct xattr_handler ocfs2_xattr_user_handler;extern struct xattr_handler ocfs2_xattr_trusted_handler; - -extern ssize_t ocfs2_listxattr (struct dentry *,char *,size_t ); -extern int ocfs2_xattr_get (struct inode *,int ,const char *,void *,size_t ); -extern int ocfs2_xattr_set (struct inode *,int ,const char *,const void *, -size_t ,int ); -extern int ocfs2_xattr_remove (struct inode *inode,struct buffer_head *di_bh);extern struct xattr_handler *ocfs2_xattr_handlers[]; -static inline u16 ocfs2_xattr_buckets_per_cluster (struct ocfs2_super *osb) -{ -return (1 << osb->s_clustersize_bits) /OCFS2_XATTR_BUCKET_SIZE ; -} - -static inline u16 ocfs2_blocks_per_xattr_bucket (struct super_block *sb) -{ -return OCFS2_XATTR_BUCKET_SIZE / (1 << sb->s_blocksize_bits); -} - -static inline u16 ocfs2_xattr_max_xe_in_bucket (struct super_block *sb) -{ -u16 len = sb->s_blocksize - - offsetof(struct ocfs2_xattr_header , xh_entries); +ssize_t ocfs2_listxattr (struct dentry *,char *,size_t ); +int ocfs2_xattr_set (struct inode *,int ,const char *,const void *, +size_t ,int ); +int ocfs2_xattr_remove (struct inode *,struct buffer_head *); -return len /sizeof (struct ocfs2_xattr_entry ); -}#endif /* OCFS2_XATTR_H */
Signature · 1 line
1.5.4.1
PATCH 2/3 ocfs2/xattr: Add security xattr support in ocfs2
In reply to Tiger YangThis patch add security extended attributes support in ocfs2.
--- fs/ocfs2/namei.c | 33 ++++++++++--- fs/ocfs2/xattr.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/ocfs2/xattr.h | 9 +++ 3 files changed, 180 insertions(+), 7 deletions(-)
fs/ocfs2/namei.c +26 -7
@@ -200,7 +200,9 @@ static int ocfs2_mknod(struct inode *dir,struct buffer_head *de_bh =NULL ;struct inode *inode =NULL ;struct ocfs2_alloc_context *inode_ac =NULL ; +struct ocfs2_alloc_context *meta_ac =NULL ;struct ocfs2_alloc_context *data_ac =NULL ; +int want_clusters =0 ; mlog_entry("(0x%p, 0x%p, %d, %lu, '%.*s')\n", dir, dentry, mode, (unsigned long)dev, dentry->d_name.len,
@@ -250,14 +252,21 @@ static int ocfs2_mknod(struct inode *dir, goto leave; } +/* reserve one metadata block for acl */ +if (dir->i_sb->s_blocksize ==OCFS2_MIN_BLOCKSIZE ) +ocfs2_reserve_new_metadata_blocks (osb,1 , &meta_ac); + +/* Reserve clusters for acl */ + want_clusters =ocfs2_clusters_for_bytes (dir->i_sb,XATTR_SIZE_MAX );/* Reserve a cluster if creating an extent based directory. */ -if (S_ISDIR (mode) && !ocfs2_supports_inline_data (osb)) { - status =ocfs2_reserve_clusters (osb,1 , &data_ac); -if (status <0 ) { -if (status != -ENOSPC ) -mlog_errno (status); - goto leave; - } +if (S_ISDIR (mode) && !ocfs2_supports_inline_data (osb)) + want_clusters +=1 ; + + status =ocfs2_reserve_clusters (osb, want_clusters, &data_ac); +if (status <0 ) { +if (status != -ENOSPC ) +mlog_errno (status); + goto leave; } handle =ocfs2_start_trans (osb,OCFS2_MKNOD_CREDITS );
@@ -300,6 +309,13 @@ static int ocfs2_mknod(struct inode *dir,inc_nlink (dir); } + status =ocfs2_init_security (handle, inode, dir, new_fe_bh, + meta_ac, data_ac); +if (status <0 ) { +mlog_errno (status); + goto leave; + } + status =ocfs2_add_entry (handle, dentry, inode,OCFS2_I (inode)->ip_blkno, parent_fe_bh, de_bh);
@@ -338,6 +354,9 @@ leave:if (inode_ac)ocfs2_free_alloc_context (inode_ac); +if (meta_ac) +ocfs2_free_alloc_context (meta_ac); +if (data_ac)ocfs2_free_alloc_context (data_ac);
fs/ocfs2/xattr.c +145 -0
175 lines not on this page · raw message
fs/ocfs2/xattr.h +9 -0
@@ -32,11 +32,20 @@ enum ocfs2_xattr_type {extern struct xattr_handler ocfs2_xattr_user_handler;extern struct xattr_handler ocfs2_xattr_trusted_handler; +extern struct xattr_handler ocfs2_xattr_security_handler;extern struct xattr_handler *ocfs2_xattr_handlers[];ssize_t ocfs2_listxattr (struct dentry *,char *,size_t );int ocfs2_xattr_set (struct inode *,int ,const char *,const void *,size_t ,int ); +int ocfs2_xattr_set_handle (handle_t *,struct inode *,struct buffer_head *, +int ,const char *,const void *,size_t ,int , +struct ocfs2_alloc_context *, +struct ocfs2_alloc_context *);int ocfs2_xattr_remove (struct inode *,struct buffer_head *); +int ocfs2_init_security (handle_t *,struct inode *, +struct inode *,struct buffer_head *, +struct ocfs2_alloc_context *, +struct ocfs2_alloc_context *);#endif /* OCFS2_XATTR_H */
Signature · 1 line
1.5.4.1
PATCH 3/3 ocfs2/xattr: Add POSIX ACLs support in ocfs2
In reply to Tiger YangThis patch add POSIX access control list in ocfs2.
--- Documentation/filesystems/ocfs2.txt | 4 +- fs/Kconfig | 9 + fs/ocfs2/Makefile | 1 + fs/ocfs2/acl.c | 530 +++++++++++++++++++++++++++++++++++ fs/ocfs2/acl.h | 61 ++++ fs/ocfs2/file.c | 11 +- fs/ocfs2/namei.c | 8 + fs/ocfs2/ocfs2.h | 1 + fs/ocfs2/super.c | 33 +++ fs/ocfs2/xattr.c | 50 +++- fs/ocfs2/xattr.h | 6 + 11 files changed, 699 insertions(+), 15 deletions(-) create mode 100644 fs/ocfs2/acl.c create mode 100644 fs/ocfs2/acl.h
Documentation/filesystems/ocfs2.txt +2 -2
@@ -28,13 +28,11 @@ Manish Singh <[email protected]> Caveats ======= Features which OCFS2 does not support yet: - - extended attributes - quotas - cluster aware flock - cluster aware lockf - Directory change notification (F_NOTIFY) - Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease) - - POSIX ACLs Mount options =============
@@ -82,3 +80,5 @@ inode64 Indicates that Ocfs2 is allowed to create inodes at bits of significance. user_xattr (*) Enables Extended User Attributes. nouser_xattr Disables Extended User Attributes. +acl Enables POSIX Access Control Lists support. +noacl (*) Disables POSIX Access Control Lists support.
fs/Kconfig +9 -0
@@ -507,6 +507,15 @@ config OCFS2_COMPAT_JBD is backwards compatible with JBD. It is safe to say N here. However, if you really want to use the original JBD, say Y here. +config OCFS2_FS_POSIX_ACL + bool "OCFS2 POSIX Access Control Lists" + depends on OCFS2_FS + select FS_POSIX_ACL + default n + help + Posix Access Control Lists (ACLs) support permissions for users and + groups beyond the owner/group/world scheme. + endif # BLOCK config DNOTIFY
fs/ocfs2/Makefile +1 -0
@@ -8,6 +8,7 @@ obj-$(CONFIG_OCFS2_FS) += \ obj-$(CONFIG_OCFS2_FS_O2CB) += ocfs2_stack_o2cb.o obj-$(CONFIG_OCFS2_FS_USERSPACE_CLUSTER) += ocfs2_stack_user.o +obj-$(CONFIG_OCFS2_FS_POSIX_ACL) += acl.o ocfs2-objs := \ alloc.o \
fs/ocfs2/acl.c new file +530 -0
530 lines not on this page · raw message
fs/ocfs2/acl.h new file +61 -0
61 lines not on this page · raw message
fs/ocfs2/file.c +10 -1
@@ -56,6 +56,7 @@#include "suballoc.h" #include "super.h" #include "xattr.h" +#include "acl.h" #include "buffer_head_io.h"
@@ -976,6 +977,14 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) goto bail_commit; } +if (attr->ia_valid &ATTR_MODE ) { + status =ocfs2_acl_chmod (handle, inode, bh); +if (status <0 ) { +mlog_errno (status); + goto bail_commit; + } + } + status =ocfs2_mark_inode_dirty (handle, inode, bh);if (status <0 )mlog_errno (status);
@@ -1036,7 +1045,7 @@ int ocfs2_permission(struct inode *inode, int mask) goto out; } - ret =generic_permission (inode, mask,NULL ); + ret =generic_permission (inode, mask, ocfs2_check_acl);ocfs2_inode_unlock (inode,0 ); out:
fs/ocfs2/namei.c +8 -0
@@ -61,6 +61,7 @@#include "sysfile.h" #include "uptodate.h" #include "xattr.h" +#include "acl.h" #include "buffer_head_io.h"
@@ -309,6 +310,13 @@ static int ocfs2_mknod(struct inode *dir,inc_nlink (dir); } + status =ocfs2_init_acl (handle, inode, dir, new_fe_bh, parent_fe_bh, + meta_ac, data_ac); +if (status <0 ) { +mlog_errno (status); + goto leave; + } + status =ocfs2_init_security (handle, inode, dir, new_fe_bh, meta_ac, data_ac);if (status <0 ) {
fs/ocfs2/ocfs2.h +1 -0
@@ -195,6 +195,7 @@ enum ocfs2_mount_optionsOCFS2_MOUNT_LOCALFLOCKS =1 <<5 ,/* No cluster aware user file locks */ OCFS2_MOUNT_NOUSERXATTR =1 <<6 ,/* No user xattr */ OCFS2_MOUNT_INODE64 =1 <<7 ,/* Allow inode numbers > 2^32 */ + OCFS2_MOUNT_POSIX_ACL = 1 << 8, /* POSIX access control lists */ };#define OCFS2_OSB_SOFT_RO 0x0001
fs/ocfs2/super.c +33 -0
@@ -158,6 +158,8 @@ enum { Opt_user_xattr, Opt_nouser_xattr, Opt_inode64, + Opt_acl, + Opt_noacl, Opt_err, };
@@ -180,6 +182,8 @@ static match_table_t tokens = { {Opt_user_xattr, "user_xattr"}, {Opt_nouser_xattr, "nouser_xattr"}, {Opt_inode64, "inode64"}, + {Opt_acl, "acl"}, + {Opt_noacl, "noacl"}, {Opt_err, NULL} };
@@ -466,6 +470,8 @@ unlock_osb:if (!ret) {/* Only save off the new mount options in case of a successful * remount. */ +if (!(osb->s_feature_incompat &OCFS2_FEATURE_INCOMPAT_XATTR )) + parsed_options.mount_opt &= ~OCFS2_MOUNT_POSIX_ACL ; osb->s_mount_opt = parsed_options.mount_opt; osb->s_atime_quantum = parsed_options.atime_quantum; osb->preferred_slot = parsed_options.slot;
@@ -651,6 +657,10 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) }brelse (bh); bh =NULL ; + +if (!(osb->s_feature_incompat &OCFS2_FEATURE_INCOMPAT_XATTR )) + parsed_options.mount_opt &= ~OCFS2_MOUNT_POSIX_ACL ; + osb->s_mount_opt = parsed_options.mount_opt; osb->s_atime_quantum = parsed_options.atime_quantum; osb->preferred_slot = parsed_options.slot;
@@ -664,6 +674,9 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) sb->s_magic =OCFS2_SUPER_MAGIC ; + sb->s_flags = (sb->s_flags & ~MS_POSIXACL ) | + ((osb->s_mount_opt &OCFS2_MOUNT_POSIX_ACL ) ?MS_POSIXACL :0 ); +/* Hard readonly mode only if: bdev_read_only, MS_RDONLY, * heartbeat=none */ if (bdev_read_only (sb->s_bdev)) {
@@ -945,6 +958,19 @@ static int ocfs2_parse_options(struct super_block *sb,case Opt_inode64: mopt->mount_opt |=OCFS2_MOUNT_INODE64 ;break ; +#ifdef CONFIG_OCFS2_FS_POSIX_ACL +case Opt_acl: + mopt->mount_opt |=OCFS2_MOUNT_POSIX_ACL ; +break ; +case Opt_noacl: + mopt->mount_opt &= ~OCFS2_MOUNT_POSIX_ACL ; +break ; +#else +case Opt_acl: +case Opt_noacl: +printk (KERN_INFO "ocfs2 (no)acl options not supported\n" ); +break ; +#endif default :mlog (ML_ERROR , "Unrecognized mount option \"%s\" "
@@ -1017,6 +1043,13 @@ static int ocfs2_show_options(struct seq_file *s, struct vfsmount *mnt)if (opts &OCFS2_MOUNT_INODE64 )seq_printf (s,",inode64" ); +#ifdef CONFIG_OCFS2_FS_POSIX_ACL +if (opts &OCFS2_MOUNT_POSIX_ACL ) +seq_printf (s,",acl" ); +else +seq_printf (s,",noacl" ); +#endif +return 0 ; }
fs/ocfs2/xattr.c +38 -12
86 lines not on this page · raw message
fs/ocfs2/xattr.h +6 -0
@@ -33,9 +33,15 @@ enum ocfs2_xattr_type {extern struct xattr_handler ocfs2_xattr_user_handler;extern struct xattr_handler ocfs2_xattr_trusted_handler;extern struct xattr_handler ocfs2_xattr_security_handler; +#ifdef CONFIG_OCFS2_FS_POSIX_ACL +extern struct xattr_handler ocfs2_xattr_acl_access_handler; +extern struct xattr_handler ocfs2_xattr_acl_default_handler; +#endif extern struct xattr_handler *ocfs2_xattr_handlers[];ssize_t ocfs2_listxattr (struct dentry *,char *,size_t ); +int ocfs2_xattr_get_nolock (struct inode *,struct buffer_head *,int , +const char *,void *,size_t );int ocfs2_xattr_set (struct inode *,int ,const char *,const void *,size_t ,int ); int ocfs2_xattr_set_handle(handle_t *, struct inode *, struct buffer_head *,
Signature · 1 line
1.5.4.1