mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
convert bpf
object creation goes through the normal VFS paths or approximation
thereof (user_path_create()/done_path_create() in case of bpf_obj_do_pin(),
open-coded simple_{start,done}_creating() in bpf_iter_link_pin_kernel()
at mount time), removals go entirely through the normal VFS paths (and
->unlink() is simple_unlink() there).
Enough to have bpf_dentry_finalize() use d_make_persistent() instead
of dget() and we are done.
Convert bpf_iter_link_pin_kernel() to simple_{start,done}_creating(),
while we are at it.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -144,8 +144,7 @@ static int bpf_inode_type(const struct inode *inode, enum bpf_type *type)
|
||||
static void bpf_dentry_finalize(struct dentry *dentry, struct inode *inode,
|
||||
struct inode *dir)
|
||||
{
|
||||
d_instantiate(dentry, inode);
|
||||
dget(dentry);
|
||||
d_make_persistent(dentry, inode);
|
||||
|
||||
inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
|
||||
}
|
||||
@@ -420,16 +419,12 @@ static int bpf_iter_link_pin_kernel(struct dentry *parent,
|
||||
struct dentry *dentry;
|
||||
int ret;
|
||||
|
||||
inode_lock(parent->d_inode);
|
||||
dentry = lookup_noperm(&QSTR(name), parent);
|
||||
if (IS_ERR(dentry)) {
|
||||
inode_unlock(parent->d_inode);
|
||||
dentry = simple_start_creating(parent, name);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
}
|
||||
ret = bpf_mkobj_ops(dentry, mode, link, &bpf_link_iops,
|
||||
&bpf_iter_fops);
|
||||
dput(dentry);
|
||||
inode_unlock(parent->d_inode);
|
||||
simple_done_creating(dentry);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1080,7 +1075,7 @@ static void bpf_kill_super(struct super_block *sb)
|
||||
{
|
||||
struct bpf_mount_opts *opts = sb->s_fs_info;
|
||||
|
||||
kill_litter_super(sb);
|
||||
kill_anon_super(sb);
|
||||
kfree(opts);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user