oprofilefs: add missing ->i_mutex locking in object creation
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 28 Jan 2013 19:42:42 +0000 (14:42 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 23 Feb 2013 04:31:38 +0000 (23:31 -0500)
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>
drivers/oprofile/oprofilefs.c

index 849357c1045c57b5c7a229dee3ccae27a9c2a922..445ffda715ade70884bf52dda1bd3e0391b6bd5a 100644 (file)
@@ -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;
 }