summaryrefslogtreecommitdiff
path: root/security/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'security/inode.c')
-rw-r--r--security/inode.c35
1 files changed, 13 insertions, 22 deletions
diff --git a/security/inode.c b/security/inode.c
index ab8d6a2acadb..81fb5d6dd33e 100644
--- a/security/inode.c
+++ b/security/inode.c
@@ -72,7 +72,7 @@ static struct file_system_type fs_type = {
.owner = THIS_MODULE,
.name = "securityfs",
.init_fs_context = securityfs_init_fs_context,
- .kill_sb = kill_litter_super,
+ .kill_sb = kill_anon_super,
};
/**
@@ -129,24 +129,19 @@ static struct dentry *securityfs_create_dentry(const char *name, umode_t mode,
parent = mount->mnt_root;
}
- dir = d_inode(parent);
-
- inode_lock(dir);
- dentry = lookup_noperm(&QSTR(name), parent);
- if (IS_ERR(dentry))
+ inode = new_inode(parent->d_sb);
+ if (unlikely(!inode)) {
+ dentry = ERR_PTR(-ENOMEM);
goto out;
-
- if (d_really_is_positive(dentry)) {
- error = -EEXIST;
- goto out1;
}
- inode = new_inode(dir->i_sb);
- if (!inode) {
- error = -ENOMEM;
- goto out1;
- }
+ dir = d_inode(parent);
+ dentry = simple_start_creating(parent, name);
+ if (IS_ERR(dentry)) {
+ iput(inode);
+ goto out;
+ }
inode->i_ino = get_next_ino();
inode->i_mode = mode;
simple_inode_init_ts(inode);
@@ -162,15 +157,11 @@ static struct dentry *securityfs_create_dentry(const char *name, umode_t mode,
} else {
inode->i_fop = fops;
}
- d_instantiate(dentry, inode);
- inode_unlock(dir);
- return dentry;
+ d_make_persistent(dentry, inode);
+ simple_done_creating(dentry);
+ return dentry; // borrowed
-out1:
- dput(dentry);
- dentry = ERR_PTR(error);
out:
- inode_unlock(dir);
if (pinned)
simple_release_fs(&mount, &mount_count);
return dentry;