aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorCasey Schaufler <casey@schaufler-ca.com>2011-12-15 10:09:07 -0500
committerChris Mason <chris.mason@oracle.com>2011-12-15 10:50:38 -0500
commitad19db71f498fd858dd84ce603efcf97e321f184 (patch)
tree2e78aa71cf3108ce34fc3e97ca1fecfad63047d2 /fs
parent8f3b65a3d66bcc086e1eb040b7545e70681f2ed1 (diff)
BTRFS: Establish i_ops before calling d_instantiate
The Smack LSM hook for security_d_instantiate checks the inode's i_op->getxattr value to determine if the containing filesystem supports extended attributes. The BTRFS filesystem sets the inode's i_op value only after it has instantiated the inode. This results in Smack incorrectly giving new BTRFS inodes attributes from the filesystem defaults on the assumption that values can't be stored on the filesystem. This patch moves the assignment of inode operation vectors ahead of the calls to d_instantiate, letting Smack know that the filesystem supports extended attributes. There should be no impact on the performance or behavior of BTRFS. Signed-off-by: Casey Schaufler <casey@schaufler-ca.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/inode.c31
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,
4596 goto out_unlock; 4596 goto out_unlock;
4597 } 4597 }
4598 4598
4599 /*
4600 * If the active LSM wants to access the inode during
4601 * d_instantiate it needs these. Smack checks to see
4602 * if the filesystem supports xattrs by looking at the
4603 * ops vector.
4604 */
4605
4606 inode->i_op = &btrfs_special_inode_operations;
4599 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4607 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
4600 if (err) 4608 if (err)
4601 drop_inode = 1; 4609 drop_inode = 1;
4602 else { 4610 else {
4603 inode->i_op = &btrfs_special_inode_operations;
4604 init_special_inode(inode, inode->i_mode, rdev); 4611 init_special_inode(inode, inode->i_mode, rdev);
4605 btrfs_update_inode(trans, root, inode); 4612 btrfs_update_inode(trans, root, inode);
4606 } 4613 }
@@ -4654,14 +4661,21 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
4654 goto out_unlock; 4661 goto out_unlock;
4655 } 4662 }
4656 4663
4664 /*
4665 * If the active LSM wants to access the inode during
4666 * d_instantiate it needs these. Smack checks to see
4667 * if the filesystem supports xattrs by looking at the
4668 * ops vector.
4669 */
4670 inode->i_fop = &btrfs_file_operations;
4671 inode->i_op = &btrfs_file_inode_operations;
4672
4657 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 4673 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
4658 if (err) 4674 if (err)
4659 drop_inode = 1; 4675 drop_inode = 1;
4660 else { 4676 else {
4661 inode->i_mapping->a_ops = &btrfs_aops; 4677 inode->i_mapping->a_ops = &btrfs_aops;
4662 inode->i_mapping->backing_dev_info = &root->fs_info->bdi; 4678 inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
4663 inode->i_fop = &btrfs_file_operations;
4664 inode->i_op = &btrfs_file_inode_operations;
4665 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 4679 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
4666 } 4680 }
4667out_unlock: 4681out_unlock:
@@ -7117,14 +7131,21 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
7117 goto out_unlock; 7131 goto out_unlock;
7118 } 7132 }
7119 7133
7134 /*
7135 * If the active LSM wants to access the inode during
7136 * d_instantiate it needs these. Smack checks to see
7137 * if the filesystem supports xattrs by looking at the
7138 * ops vector.
7139 */
7140 inode->i_fop = &btrfs_file_operations;
7141 inode->i_op = &btrfs_file_inode_operations;
7142
7120 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); 7143 err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
7121 if (err) 7144 if (err)
7122 drop_inode = 1; 7145 drop_inode = 1;
7123 else { 7146 else {
7124 inode->i_mapping->a_ops = &btrfs_aops; 7147 inode->i_mapping->a_ops = &btrfs_aops;
7125 inode->i_mapping->backing_dev_info = &root->fs_info->bdi; 7148 inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
7126 inode->i_fop = &btrfs_file_operations;
7127 inode->i_op = &btrfs_file_inode_operations;
7128 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; 7149 BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
7129 } 7150 }
7130 if (drop_inode) 7151 if (drop_inode)