diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2013-01-28 14:42:42 -0500 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-22 23:31:38 -0500 | 
| commit | 3f3834c35466324e3a7d7bf3a950dbcd99645f38 (patch) | |
| tree | 7ce8af76f87049b672d4625a13317bb8ba3470d9 /drivers/oprofile | |
| parent | 2248b87ec1d9f59001d8c69513b2892ac04a2a3d (diff) | |
| download | linux-3f3834c35466324e3a7d7bf3a950dbcd99645f38.tar.bz2 | |
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')
| -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;  } |