From 3f3834c35466324e3a7d7bf3a950dbcd99645f38 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 28 Jan 2013 14:42:42 -0500 Subject: 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 --- drivers/oprofile/oprofilefs.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'drivers/oprofile') 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; } -- cgit v1.2.3