diff options
Diffstat (limited to 'kernel/bpf/inode.c')
| -rw-r--r-- | kernel/bpf/inode.c | 26 | 
1 files changed, 23 insertions, 3 deletions
| diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c index be6d726e31c9..f2ece3c174a5 100644 --- a/kernel/bpf/inode.c +++ b/kernel/bpf/inode.c @@ -34,7 +34,7 @@ static void *bpf_any_get(void *raw, enum bpf_type type)  		atomic_inc(&((struct bpf_prog *)raw)->aux->refcnt);  		break;  	case BPF_TYPE_MAP: -		atomic_inc(&((struct bpf_map *)raw)->refcnt); +		bpf_map_inc(raw, true);  		break;  	default:  		WARN_ON_ONCE(1); @@ -51,7 +51,7 @@ static void bpf_any_put(void *raw, enum bpf_type type)  		bpf_prog_put(raw);  		break;  	case BPF_TYPE_MAP: -		bpf_map_put(raw); +		bpf_map_put_with_uref(raw);  		break;  	default:  		WARN_ON_ONCE(1); @@ -64,7 +64,7 @@ static void *bpf_fd_probe_obj(u32 ufd, enum bpf_type *type)  	void *raw;  	*type = BPF_TYPE_MAP; -	raw = bpf_map_get(ufd); +	raw = bpf_map_get_with_uref(ufd);  	if (IS_ERR(raw)) {  		*type = BPF_TYPE_PROG;  		raw = bpf_prog_get(ufd); @@ -187,11 +187,31 @@ static int bpf_mkobj(struct inode *dir, struct dentry *dentry, umode_t mode,  	}  } +static int bpf_link(struct dentry *old_dentry, struct inode *dir, +		    struct dentry *new_dentry) +{ +	if (bpf_dname_reserved(new_dentry)) +		return -EPERM; + +	return simple_link(old_dentry, dir, new_dentry); +} + +static int bpf_rename(struct inode *old_dir, struct dentry *old_dentry, +		      struct inode *new_dir, struct dentry *new_dentry) +{ +	if (bpf_dname_reserved(new_dentry)) +		return -EPERM; + +	return simple_rename(old_dir, old_dentry, new_dir, new_dentry); +} +  static const struct inode_operations bpf_dir_iops = {  	.lookup		= simple_lookup,  	.mknod		= bpf_mkobj,  	.mkdir		= bpf_mkdir,  	.rmdir		= simple_rmdir, +	.rename		= bpf_rename, +	.link		= bpf_link,  	.unlink		= simple_unlink,  }; | 
