Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f3834c3 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 2248b87e
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -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;
}