diff options
Diffstat (limited to 'fs/ext4/xattr.c')
| -rw-r--r-- | fs/ext4/xattr.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 62f2ec599218..dadad29bd81b 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -88,8 +88,8 @@ static void ext4_xattr_rehash(struct ext4_xattr_header *);  static const struct xattr_handler * const ext4_xattr_handler_map[] = {  	[EXT4_XATTR_INDEX_USER]		     = &ext4_xattr_user_handler,  #ifdef CONFIG_EXT4_FS_POSIX_ACL -	[EXT4_XATTR_INDEX_POSIX_ACL_ACCESS]  = &posix_acl_access_xattr_handler, -	[EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT] = &posix_acl_default_xattr_handler, +	[EXT4_XATTR_INDEX_POSIX_ACL_ACCESS]  = &nop_posix_acl_access, +	[EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT] = &nop_posix_acl_default,  #endif  	[EXT4_XATTR_INDEX_TRUSTED]	     = &ext4_xattr_trusted_handler,  #ifdef CONFIG_EXT4_FS_SECURITY @@ -101,10 +101,6 @@ static const struct xattr_handler * const ext4_xattr_handler_map[] = {  const struct xattr_handler *ext4_xattr_handlers[] = {  	&ext4_xattr_user_handler,  	&ext4_xattr_trusted_handler, -#ifdef CONFIG_EXT4_FS_POSIX_ACL -	&posix_acl_access_xattr_handler, -	&posix_acl_default_xattr_handler, -#endif  #ifdef CONFIG_EXT4_FS_SECURITY  	&ext4_xattr_security_handler,  #endif @@ -173,14 +169,18 @@ static void ext4_xattr_block_csum_set(struct inode *inode,  						bh->b_blocknr, BHDR(bh));  } -static inline const struct xattr_handler * -ext4_xattr_handler(int name_index) +static inline const char *ext4_xattr_prefix(int name_index, +					    struct dentry *dentry)  {  	const struct xattr_handler *handler = NULL;  	if (name_index > 0 && name_index < ARRAY_SIZE(ext4_xattr_handler_map))  		handler = ext4_xattr_handler_map[name_index]; -	return handler; + +	if (!xattr_handler_can_list(handler, dentry)) +		return NULL; + +	return xattr_prefix(handler);  }  static int @@ -740,11 +740,10 @@ ext4_xattr_list_entries(struct dentry *dentry, struct ext4_xattr_entry *entry,  	size_t rest = buffer_size;  	for (; !IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry)) { -		const struct xattr_handler *handler = -			ext4_xattr_handler(entry->e_name_index); +		const char *prefix; -		if (handler && (!handler->list || handler->list(dentry))) { -			const char *prefix = handler->prefix ?: handler->name; +		prefix = ext4_xattr_prefix(entry->e_name_index, dentry); +		if (prefix) {  			size_t prefix_len = strlen(prefix);  			size_t size = prefix_len + entry->e_name_len + 1; @@ -2852,6 +2851,9 @@ shift:  			(void *)header, total_ino);  	EXT4_I(inode)->i_extra_isize = new_extra_isize; +	if (ext4_has_inline_data(inode)) +		error = ext4_find_inline_data_nolock(inode); +  cleanup:  	if (error && (mnt_count != le16_to_cpu(sbi->s_es->s_mnt_count))) {  		ext4_warning(inode->i_sb, "Unable to expand inode %lu. Delete some EAs or run e2fsck.",  |