Merge tag 'pull-stable-struct_fd' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull 'struct fd' updates from Al Viro: "Just the 'struct fd' layout change, with conversion to accessor helpers" * tag 'pull-stable-struct_fd' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: add struct fd constructors, get rid of __to_fd() struct fd: representation change introduce fd_file(), convert all accessors to it.
This commit is contained in:
@@ -80,10 +80,10 @@ static void *bpf_fd_inode_storage_lookup_elem(struct bpf_map *map, void *key)
|
||||
struct bpf_local_storage_data *sdata;
|
||||
struct fd f = fdget_raw(*(int *)key);
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
|
||||
sdata = inode_storage_lookup(file_inode(f.file), map, true);
|
||||
sdata = inode_storage_lookup(file_inode(fd_file(f)), map, true);
|
||||
fdput(f);
|
||||
return sdata ? sdata->data : NULL;
|
||||
}
|
||||
@@ -94,14 +94,14 @@ static long bpf_fd_inode_storage_update_elem(struct bpf_map *map, void *key,
|
||||
struct bpf_local_storage_data *sdata;
|
||||
struct fd f = fdget_raw(*(int *)key);
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
if (!inode_storage_ptr(file_inode(f.file))) {
|
||||
if (!inode_storage_ptr(file_inode(fd_file(f)))) {
|
||||
fdput(f);
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
sdata = bpf_local_storage_update(file_inode(f.file),
|
||||
sdata = bpf_local_storage_update(file_inode(fd_file(f)),
|
||||
(struct bpf_local_storage_map *)map,
|
||||
value, map_flags, GFP_ATOMIC);
|
||||
fdput(f);
|
||||
@@ -126,10 +126,10 @@ static long bpf_fd_inode_storage_delete_elem(struct bpf_map *map, void *key)
|
||||
struct fd f = fdget_raw(*(int *)key);
|
||||
int err;
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
|
||||
err = inode_storage_delete(file_inode(f.file), map);
|
||||
err = inode_storage_delete(file_inode(fd_file(f)), map);
|
||||
fdput(f);
|
||||
return err;
|
||||
}
|
||||
|
||||
+3
-3
@@ -7715,15 +7715,15 @@ struct btf *btf_get_by_fd(int fd)
|
||||
|
||||
f = fdget(fd);
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
|
||||
if (f.file->f_op != &btf_fops) {
|
||||
if (fd_file(f)->f_op != &btf_fops) {
|
||||
fdput(f);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
btf = f.file->private_data;
|
||||
btf = fd_file(f)->private_data;
|
||||
refcount_inc(&btf->refcnt);
|
||||
fdput(f);
|
||||
|
||||
|
||||
+21
-21
@@ -837,7 +837,7 @@ static int bpf_map_release(struct inode *inode, struct file *filp)
|
||||
|
||||
static fmode_t map_get_sys_perms(struct bpf_map *map, struct fd f)
|
||||
{
|
||||
fmode_t mode = f.file->f_mode;
|
||||
fmode_t mode = fd_file(f)->f_mode;
|
||||
|
||||
/* Our file permissions may have been overridden by global
|
||||
* map permissions facing syscall side.
|
||||
@@ -1430,14 +1430,14 @@ put_token:
|
||||
*/
|
||||
struct bpf_map *__bpf_map_get(struct fd f)
|
||||
{
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
if (f.file->f_op != &bpf_map_fops) {
|
||||
if (fd_file(f)->f_op != &bpf_map_fops) {
|
||||
fdput(f);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
return f.file->private_data;
|
||||
return fd_file(f)->private_data;
|
||||
}
|
||||
|
||||
void bpf_map_inc(struct bpf_map *map)
|
||||
@@ -1658,7 +1658,7 @@ static int map_update_elem(union bpf_attr *attr, bpfptr_t uattr)
|
||||
goto free_key;
|
||||
}
|
||||
|
||||
err = bpf_map_update_value(map, f.file, key, value, attr->flags);
|
||||
err = bpf_map_update_value(map, fd_file(f), key, value, attr->flags);
|
||||
if (!err)
|
||||
maybe_wait_bpf_programs(map);
|
||||
|
||||
@@ -2416,14 +2416,14 @@ int bpf_prog_new_fd(struct bpf_prog *prog)
|
||||
|
||||
static struct bpf_prog *____bpf_prog_get(struct fd f)
|
||||
{
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
if (f.file->f_op != &bpf_prog_fops) {
|
||||
if (fd_file(f)->f_op != &bpf_prog_fops) {
|
||||
fdput(f);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
return f.file->private_data;
|
||||
return fd_file(f)->private_data;
|
||||
}
|
||||
|
||||
void bpf_prog_add(struct bpf_prog *prog, int i)
|
||||
@@ -3266,14 +3266,14 @@ struct bpf_link *bpf_link_get_from_fd(u32 ufd)
|
||||
struct fd f = fdget(ufd);
|
||||
struct bpf_link *link;
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
if (f.file->f_op != &bpf_link_fops && f.file->f_op != &bpf_link_fops_poll) {
|
||||
if (fd_file(f)->f_op != &bpf_link_fops && fd_file(f)->f_op != &bpf_link_fops_poll) {
|
||||
fdput(f);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
link = f.file->private_data;
|
||||
link = fd_file(f)->private_data;
|
||||
bpf_link_inc(link);
|
||||
fdput(f);
|
||||
|
||||
@@ -4989,19 +4989,19 @@ static int bpf_obj_get_info_by_fd(const union bpf_attr *attr,
|
||||
return -EINVAL;
|
||||
|
||||
f = fdget(ufd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADFD;
|
||||
|
||||
if (f.file->f_op == &bpf_prog_fops)
|
||||
err = bpf_prog_get_info_by_fd(f.file, f.file->private_data, attr,
|
||||
if (fd_file(f)->f_op == &bpf_prog_fops)
|
||||
err = bpf_prog_get_info_by_fd(fd_file(f), fd_file(f)->private_data, attr,
|
||||
uattr);
|
||||
else if (f.file->f_op == &bpf_map_fops)
|
||||
err = bpf_map_get_info_by_fd(f.file, f.file->private_data, attr,
|
||||
else if (fd_file(f)->f_op == &bpf_map_fops)
|
||||
err = bpf_map_get_info_by_fd(fd_file(f), fd_file(f)->private_data, attr,
|
||||
uattr);
|
||||
else if (f.file->f_op == &btf_fops)
|
||||
err = bpf_btf_get_info_by_fd(f.file, f.file->private_data, attr, uattr);
|
||||
else if (f.file->f_op == &bpf_link_fops || f.file->f_op == &bpf_link_fops_poll)
|
||||
err = bpf_link_get_info_by_fd(f.file, f.file->private_data,
|
||||
else if (fd_file(f)->f_op == &btf_fops)
|
||||
err = bpf_btf_get_info_by_fd(fd_file(f), fd_file(f)->private_data, attr, uattr);
|
||||
else if (fd_file(f)->f_op == &bpf_link_fops || fd_file(f)->f_op == &bpf_link_fops_poll)
|
||||
err = bpf_link_get_info_by_fd(fd_file(f), fd_file(f)->private_data,
|
||||
attr, uattr);
|
||||
else
|
||||
err = -EINVAL;
|
||||
@@ -5222,7 +5222,7 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
|
||||
else if (cmd == BPF_MAP_LOOKUP_AND_DELETE_BATCH)
|
||||
BPF_DO_BATCH(map->ops->map_lookup_and_delete_batch, map, attr, uattr);
|
||||
else if (cmd == BPF_MAP_UPDATE_BATCH)
|
||||
BPF_DO_BATCH(map->ops->map_update_batch, map, f.file, attr, uattr);
|
||||
BPF_DO_BATCH(map->ops->map_update_batch, map, fd_file(f), attr, uattr);
|
||||
else
|
||||
BPF_DO_BATCH(map->ops->map_delete_batch, map, attr, uattr);
|
||||
err_put:
|
||||
|
||||
+5
-5
@@ -122,10 +122,10 @@ int bpf_token_create(union bpf_attr *attr)
|
||||
int err, fd;
|
||||
|
||||
f = fdget(attr->token_create.bpffs_fd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
|
||||
path = f.file->f_path;
|
||||
path = fd_file(f)->f_path;
|
||||
path_get(&path);
|
||||
fdput(f);
|
||||
|
||||
@@ -235,14 +235,14 @@ struct bpf_token *bpf_token_get_from_fd(u32 ufd)
|
||||
struct fd f = fdget(ufd);
|
||||
struct bpf_token *token;
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
if (f.file->f_op != &bpf_token_fops) {
|
||||
if (fd_file(f)->f_op != &bpf_token_fops) {
|
||||
fdput(f);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
token = f.file->private_data;
|
||||
token = fd_file(f)->private_data;
|
||||
bpf_token_inc(token);
|
||||
fdput(f);
|
||||
|
||||
|
||||
@@ -6968,10 +6968,10 @@ struct cgroup *cgroup_v1v2_get_from_fd(int fd)
|
||||
{
|
||||
struct cgroup *cgrp;
|
||||
struct fd f = fdget_raw(fd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
|
||||
cgrp = cgroup_v1v2_get_from_file(f.file);
|
||||
cgrp = cgroup_v1v2_get_from_file(fd_file(f));
|
||||
fdput(f);
|
||||
return cgrp;
|
||||
}
|
||||
|
||||
@@ -969,10 +969,10 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event,
|
||||
struct fd f = fdget(fd);
|
||||
int ret = 0;
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
|
||||
css = css_tryget_online_from_dir(f.file->f_path.dentry,
|
||||
css = css_tryget_online_from_dir(fd_file(f)->f_path.dentry,
|
||||
&perf_event_cgrp_subsys);
|
||||
if (IS_ERR(css)) {
|
||||
ret = PTR_ERR(css);
|
||||
@@ -6001,10 +6001,10 @@ static const struct file_operations perf_fops;
|
||||
static inline int perf_fget_light(int fd, struct fd *p)
|
||||
{
|
||||
struct fd f = fdget(fd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
|
||||
if (f.file->f_op != &perf_fops) {
|
||||
if (fd_file(f)->f_op != &perf_fops) {
|
||||
fdput(f);
|
||||
return -EBADF;
|
||||
}
|
||||
@@ -6064,7 +6064,7 @@ static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned lon
|
||||
ret = perf_fget_light(arg, &output);
|
||||
if (ret)
|
||||
return ret;
|
||||
output_event = output.file->private_data;
|
||||
output_event = fd_file(output)->private_data;
|
||||
ret = perf_event_set_output(event, output_event);
|
||||
fdput(output);
|
||||
} else {
|
||||
@@ -12665,7 +12665,7 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
struct perf_event_attr attr;
|
||||
struct perf_event_context *ctx;
|
||||
struct file *event_file = NULL;
|
||||
struct fd group = {NULL, 0};
|
||||
struct fd group = EMPTY_FD;
|
||||
struct task_struct *task = NULL;
|
||||
struct pmu *pmu;
|
||||
int event_fd;
|
||||
@@ -12740,7 +12740,7 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
err = perf_fget_light(group_fd, &group);
|
||||
if (err)
|
||||
goto err_fd;
|
||||
group_leader = group.file->private_data;
|
||||
group_leader = fd_file(group)->private_data;
|
||||
if (flags & PERF_FLAG_FD_OUTPUT)
|
||||
output_event = group_leader;
|
||||
if (flags & PERF_FLAG_FD_NO_GROUP)
|
||||
|
||||
@@ -3234,7 +3234,7 @@ SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)
|
||||
return -EINVAL;
|
||||
|
||||
f = fdget(fd);
|
||||
err = idempotent_init_module(f.file, uargs, flags);
|
||||
err = idempotent_init_module(fd_file(f), uargs, flags);
|
||||
fdput(f);
|
||||
return err;
|
||||
}
|
||||
|
||||
+6
-6
@@ -550,15 +550,15 @@ SYSCALL_DEFINE2(setns, int, fd, int, flags)
|
||||
struct nsset nsset = {};
|
||||
int err = 0;
|
||||
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
|
||||
if (proc_ns_file(f.file)) {
|
||||
ns = get_proc_ns(file_inode(f.file));
|
||||
if (proc_ns_file(fd_file(f))) {
|
||||
ns = get_proc_ns(file_inode(fd_file(f)));
|
||||
if (flags && (ns->ops->type != flags))
|
||||
err = -EINVAL;
|
||||
flags = ns->ops->type;
|
||||
} else if (!IS_ERR(pidfd_pid(f.file))) {
|
||||
} else if (!IS_ERR(pidfd_pid(fd_file(f)))) {
|
||||
err = check_setns_flags(flags);
|
||||
} else {
|
||||
err = -EINVAL;
|
||||
@@ -570,10 +570,10 @@ SYSCALL_DEFINE2(setns, int, fd, int, flags)
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (proc_ns_file(f.file))
|
||||
if (proc_ns_file(fd_file(f)))
|
||||
err = validate_ns(&nsset, ns);
|
||||
else
|
||||
err = validate_nsset(&nsset, pidfd_pid(f.file));
|
||||
err = validate_nsset(&nsset, pidfd_pid(fd_file(f)));
|
||||
if (!err) {
|
||||
commit_nsset(&nsset);
|
||||
perf_event_namespaces(current);
|
||||
|
||||
+5
-5
@@ -540,13 +540,13 @@ struct pid *pidfd_get_pid(unsigned int fd, unsigned int *flags)
|
||||
struct pid *pid;
|
||||
|
||||
f = fdget(fd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return ERR_PTR(-EBADF);
|
||||
|
||||
pid = pidfd_pid(f.file);
|
||||
pid = pidfd_pid(fd_file(f));
|
||||
if (!IS_ERR(pid)) {
|
||||
get_pid(pid);
|
||||
*flags = f.file->f_flags;
|
||||
*flags = fd_file(f)->f_flags;
|
||||
}
|
||||
|
||||
fdput(f);
|
||||
@@ -755,10 +755,10 @@ SYSCALL_DEFINE3(pidfd_getfd, int, pidfd, int, fd,
|
||||
return -EINVAL;
|
||||
|
||||
f = fdget(pidfd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
|
||||
pid = pidfd_pid(f.file);
|
||||
pid = pidfd_pid(fd_file(f));
|
||||
if (IS_ERR(pid))
|
||||
ret = PTR_ERR(pid);
|
||||
else
|
||||
|
||||
+3
-3
@@ -3941,11 +3941,11 @@ SYSCALL_DEFINE4(pidfd_send_signal, int, pidfd, int, sig,
|
||||
return -EINVAL;
|
||||
|
||||
f = fdget(pidfd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return -EBADF;
|
||||
|
||||
/* Is this a pidfd? */
|
||||
pid = pidfd_to_pid(f.file);
|
||||
pid = pidfd_to_pid(fd_file(f));
|
||||
if (IS_ERR(pid)) {
|
||||
ret = PTR_ERR(pid);
|
||||
goto err;
|
||||
@@ -3958,7 +3958,7 @@ SYSCALL_DEFINE4(pidfd_send_signal, int, pidfd, int, sig,
|
||||
switch (flags) {
|
||||
case 0:
|
||||
/* Infer scope from the type of pidfd. */
|
||||
if (f.file->f_flags & PIDFD_THREAD)
|
||||
if (fd_file(f)->f_flags & PIDFD_THREAD)
|
||||
type = PIDTYPE_PID;
|
||||
else
|
||||
type = PIDTYPE_TGID;
|
||||
|
||||
+5
-5
@@ -1916,10 +1916,10 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
|
||||
int err;
|
||||
|
||||
exe = fdget(fd);
|
||||
if (!exe.file)
|
||||
if (!fd_file(exe))
|
||||
return -EBADF;
|
||||
|
||||
inode = file_inode(exe.file);
|
||||
inode = file_inode(fd_file(exe));
|
||||
|
||||
/*
|
||||
* Because the original mm->exe_file points to executable file, make
|
||||
@@ -1927,14 +1927,14 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
|
||||
* overall picture.
|
||||
*/
|
||||
err = -EACCES;
|
||||
if (!S_ISREG(inode->i_mode) || path_noexec(&exe.file->f_path))
|
||||
if (!S_ISREG(inode->i_mode) || path_noexec(&fd_file(exe)->f_path))
|
||||
goto exit;
|
||||
|
||||
err = file_permission(exe.file, MAY_EXEC);
|
||||
err = file_permission(fd_file(exe), MAY_EXEC);
|
||||
if (err)
|
||||
goto exit;
|
||||
|
||||
err = replace_mm_exe_file(mm, exe.file);
|
||||
err = replace_mm_exe_file(mm, fd_file(exe));
|
||||
exit:
|
||||
fdput(exe);
|
||||
return err;
|
||||
|
||||
+2
-2
@@ -419,7 +419,7 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
fd = nla_get_u32(info->attrs[CGROUPSTATS_CMD_ATTR_FD]);
|
||||
f = fdget(fd);
|
||||
if (!f.file)
|
||||
if (!fd_file(f))
|
||||
return 0;
|
||||
|
||||
size = nla_total_size(sizeof(struct cgroupstats));
|
||||
@@ -440,7 +440,7 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
|
||||
stats = nla_data(na);
|
||||
memset(stats, 0, sizeof(*stats));
|
||||
|
||||
rc = cgroupstats_build(stats, f.file->f_path.dentry);
|
||||
rc = cgroupstats_build(stats, fd_file(f)->f_path.dentry);
|
||||
if (rc < 0) {
|
||||
nlmsg_free(rep_skb);
|
||||
goto err;
|
||||
|
||||
@@ -666,8 +666,8 @@ struct watch_queue *get_watch_queue(int fd)
|
||||
struct fd f;
|
||||
|
||||
f = fdget(fd);
|
||||
if (f.file) {
|
||||
pipe = get_pipe_info(f.file, false);
|
||||
if (fd_file(f)) {
|
||||
pipe = get_pipe_info(fd_file(f), false);
|
||||
if (pipe && pipe->watch_queue) {
|
||||
wqueue = pipe->watch_queue;
|
||||
kref_get(&wqueue->usage);
|
||||
|
||||
Reference in New Issue
Block a user