diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 986efd9511ac..fda70fedf56d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4877,6 +4877,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) } brelse(iloc.bh); ext4_set_inode_flags(inode); + if (ei->i_flags & EXT4_EA_INODE_FL) + ext4_xattr_inode_set_class(inode); unlock_new_inode(inode); return inode; diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 7dd80d16f98e..3d19be8f102e 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -107,6 +107,13 @@ const struct xattr_handler *ext4_xattr_handlers[] = { #define EXT4_GET_MB_CACHE(inode) (((struct ext4_sb_info *) \ inode->i_sb->s_fs_info)->s_mb_cache) +#ifdef CONFIG_LOCKDEP +void ext4_xattr_inode_set_class(struct inode *ea_inode) +{ + lockdep_set_subclass(&ea_inode->i_rwsem, 1); +} +#endif + static __le32 ext4_xattr_block_csum(struct inode *inode, sector_t block_nr, struct ext4_xattr_header *hdr) @@ -828,6 +835,7 @@ static struct inode *ext4_xattr_inode_create(handle_t *handle, ea_inode->i_op = &ext4_file_inode_operations; ea_inode->i_fop = &ext4_file_operations; ext4_set_aops(ea_inode); + ext4_xattr_inode_set_class(ea_inode); ea_inode->i_generation = inode->i_generation; EXT4_I(ea_inode)->i_flags |= EXT4_EA_INODE_FL; diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h index 6e10ff9393d4..e8bef79bdc38 100644 --- a/fs/ext4/xattr.h +++ b/fs/ext4/xattr.h @@ -196,3 +196,9 @@ static inline int ext4_init_security(handle_t *handle, struct inode *inode, return 0; } #endif + +#ifdef CONFIG_LOCKDEP +extern void ext4_xattr_inode_set_class(struct inode *ea_inode); +#else +static inline void ext4_xattr_inode_set_class(struct inode *ea_inode) { } +#endif