diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 31 | 
1 files changed, 26 insertions, 5 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 4a31493d97a..d4a9195c7f0 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4596,11 +4596,18 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,  		goto out_unlock;  	} +	/* +	* If the active LSM wants to access the inode during +	* d_instantiate it needs these. Smack checks to see +	* if the filesystem supports xattrs by looking at the +	* ops vector. +	*/ + +	inode->i_op = &btrfs_special_inode_operations;  	err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);  	if (err)  		drop_inode = 1;  	else { -		inode->i_op = &btrfs_special_inode_operations;  		init_special_inode(inode, inode->i_mode, rdev);  		btrfs_update_inode(trans, root, inode);  	} @@ -4654,14 +4661,21 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,  		goto out_unlock;  	} +	/* +	* If the active LSM wants to access the inode during +	* d_instantiate it needs these. Smack checks to see +	* if the filesystem supports xattrs by looking at the +	* ops vector. +	*/ +	inode->i_fop = &btrfs_file_operations; +	inode->i_op = &btrfs_file_inode_operations; +  	err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);  	if (err)  		drop_inode = 1;  	else {  		inode->i_mapping->a_ops = &btrfs_aops;  		inode->i_mapping->backing_dev_info = &root->fs_info->bdi; -		inode->i_fop = &btrfs_file_operations; -		inode->i_op = &btrfs_file_inode_operations;  		BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;  	}  out_unlock: @@ -7117,14 +7131,21 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,  		goto out_unlock;  	} +	/* +	* If the active LSM wants to access the inode during +	* d_instantiate it needs these. Smack checks to see +	* if the filesystem supports xattrs by looking at the +	* ops vector. +	*/ +	inode->i_fop = &btrfs_file_operations; +	inode->i_op = &btrfs_file_inode_operations; +  	err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);  	if (err)  		drop_inode = 1;  	else {  		inode->i_mapping->a_ops = &btrfs_aops;  		inode->i_mapping->backing_dev_info = &root->fs_info->bdi; -		inode->i_fop = &btrfs_file_operations; -		inode->i_op = &btrfs_file_inode_operations;  		BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;  	}  	if (drop_inode)  |