Commit c5055286 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1e508e05
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -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);
}