diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-01-28 20:42:42 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-23 05:31:38 +0100 |
commit | 3f3834c35466324e3a7d7bf3a950dbcd99645f38 (patch) | |
tree | 7ce8af76f87049b672d4625a13317bb8ba3470d9 /drivers/oprofile/oprofilefs.c | |
parent | spufs_mkdir(): don't d_add() on negative parent (diff) | |
download | linux-3f3834c35466324e3a7d7bf3a950dbcd99645f38.tar.xz linux-3f3834c35466324e3a7d7bf3a950dbcd99645f38.zip |
oprofilefs: add missing ->i_mutex locking in object creation
Right now it's safe only during initial mount *and* functions are asking
to be abused for dynamic adding of objects.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'drivers/oprofile/oprofilefs.c')
-rw-r--r-- | drivers/oprofile/oprofilefs.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index 849357c1045c..445ffda715ad 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c @@ -139,17 +139,22 @@ static int __oprofilefs_create_file(struct super_block *sb, struct dentry *dentry; struct inode *inode; + mutex_lock(&root->d_inode->i_mutex); dentry = d_alloc_name(root, name); - if (!dentry) + if (!dentry) { + mutex_unlock(&root->d_inode->i_mutex); return -ENOMEM; + } inode = oprofilefs_get_inode(sb, S_IFREG | perm); if (!inode) { dput(dentry); + mutex_unlock(&root->d_inode->i_mutex); return -ENOMEM; } inode->i_fop = fops; + inode->i_private = priv; d_add(dentry, inode); - dentry->d_inode->i_private = priv; + mutex_unlock(&root->d_inode->i_mutex); return 0; } @@ -212,17 +217,22 @@ struct dentry *oprofilefs_mkdir(struct super_block *sb, struct dentry *dentry; struct inode *inode; + mutex_lock(&root->d_inode->i_mutex); dentry = d_alloc_name(root, name); - if (!dentry) + if (!dentry) { + mutex_unlock(&root->d_inode->i_mutex); return NULL; + } inode = oprofilefs_get_inode(sb, S_IFDIR | 0755); if (!inode) { dput(dentry); + mutex_unlock(&root->d_inode->i_mutex); return NULL; } inode->i_op = &simple_dir_inode_operations; inode->i_fop = &simple_dir_operations; d_add(dentry, inode); + mutex_unlock(&root->d_inode->i_mutex); return dentry; } |