diff options
Diffstat (limited to 'fs/ext2')
| -rw-r--r-- | fs/ext2/ialloc.c | 5 | ||||
| -rw-r--r-- | fs/ext2/inode.c | 2 | ||||
| -rw-r--r-- | fs/ext2/xattr.h | 8 | ||||
| -rw-r--r-- | fs/ext2/xattr_security.c | 22 | 
4 files changed, 37 insertions, 0 deletions
diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index 161f156d98c8..c8d07030c897 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -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 --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 53dceb0c6593..fdba4d1d3c60 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -71,6 +71,8 @@ void ext2_put_inode(struct inode *inode)   */  void ext2_delete_inode (struct inode * inode)  { +	truncate_inode_pages(&inode->i_data, 0); +  	if (is_bad_inode(inode))  		goto no_delete;  	EXT2_I(inode)->i_dtime	= get_seconds(); diff --git a/fs/ext2/xattr.h b/fs/ext2/xattr.h index 5f3bfde3b810..67cfeb66e897 100644 --- a/fs/ext2/xattr.h +++ b/fs/ext2/xattr.h @@ -116,3 +116,11 @@ exit_ext2_xattr(void)  # endif  /* CONFIG_EXT2_FS_XATTR */ +#ifdef CONFIG_EXT2_FS_SECURITY +extern int ext2_init_security(struct inode *inode, struct inode *dir); +#else +static inline int ext2_init_security(struct inode *inode, struct inode *dir) +{ +	return 0; +} +#endif diff --git a/fs/ext2/xattr_security.c b/fs/ext2/xattr_security.c index 6a6c59fbe599..a26612798471 100644 --- a/fs/ext2/xattr_security.c +++ b/fs/ext2/xattr_security.c @@ -8,6 +8,7 @@  #include <linux/fs.h>  #include <linux/smp_lock.h>  #include <linux/ext2_fs.h> +#include <linux/security.h>  #include "xattr.h"  static size_t @@ -45,6 +46,27 @@ ext2_xattr_security_set(struct inode *inode, const char *name,  			      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,  | 
