From: Stephen Smalley This patch modifies ext2 to call the inode_init_security LSM hook to obtain the security attribute for a newly created inode and to set the resulting attribute on the new inode. This parallels the existing processing for setting ACLs on newly created inodes. Signed-off-by: Andrew Morton --- fs/ext2/ialloc.c | 5 +++++ fs/ext2/xattr.h | 1 + fs/ext2/xattr_security.c | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff -puN fs/ext2/ialloc.c~ext2-enable-atomic-inode-security-labeling fs/ext2/ialloc.c --- devel/fs/ext2/ialloc.c~ext2-enable-atomic-inode-security-labeling 2005-07-25 22:01:53.000000000 -0700 +++ devel-akpm/fs/ext2/ialloc.c 2005-07-25 22:01:53.000000000 -0700 @@ -615,6 +615,11 @@ got: DQUOT_DROP(inode); goto fail2; } + err = ext2_init_security(inode,dir); + if (err) { + DQUOT_FREE_INODE(inode); + goto fail2; + } mark_inode_dirty(inode); ext2_debug("allocating inode %lu\n", inode->i_ino); ext2_preread_inode(inode); diff -puN fs/ext2/xattr.h~ext2-enable-atomic-inode-security-labeling fs/ext2/xattr.h --- devel/fs/ext2/xattr.h~ext2-enable-atomic-inode-security-labeling 2005-07-25 22:01:53.000000000 -0700 +++ devel-akpm/fs/ext2/xattr.h 2005-07-25 22:01:53.000000000 -0700 @@ -64,6 +64,7 @@ extern struct xattr_handler ext2_xattr_s extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); +extern int ext2_init_security(struct inode *inode, struct inode *dir); extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); diff -puN fs/ext2/xattr_security.c~ext2-enable-atomic-inode-security-labeling fs/ext2/xattr_security.c --- devel/fs/ext2/xattr_security.c~ext2-enable-atomic-inode-security-labeling 2005-07-25 22:01:53.000000000 -0700 +++ devel-akpm/fs/ext2/xattr_security.c 2005-07-25 22:01:53.000000000 -0700 @@ -8,6 +8,7 @@ #include #include #include +#include #include "xattr.h" static size_t @@ -45,6 +46,27 @@ ext2_xattr_security_set(struct inode *in value, size, flags); } +int +ext2_init_security(struct inode *inode, struct inode *dir) +{ + int err; + size_t len; + void *value; + char *name; + + err = security_inode_init_security(inode, dir, &name, &value, &len); + if (err) { + if (err == -EOPNOTSUPP) + return 0; + return err; + } + err = ext2_xattr_set(inode, EXT2_XATTR_INDEX_SECURITY, + name, value, len, 0); + kfree(name); + kfree(value); + return err; +} + struct xattr_handler ext2_xattr_security_handler = { .prefix = XATTR_SECURITY_PREFIX, .list = ext2_xattr_security_list, _