switch simple cases of fget_light to fdget
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
a5b470ba06
commit
2903ff019b
44 changed files with 631 additions and 761 deletions
|
|
@ -467,14 +467,13 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event,
|
|||
{
|
||||
struct perf_cgroup *cgrp;
|
||||
struct cgroup_subsys_state *css;
|
||||
struct file *file;
|
||||
int ret = 0, fput_needed;
|
||||
struct fd f = fdget(fd);
|
||||
int ret = 0;
|
||||
|
||||
file = fget_light(fd, &fput_needed);
|
||||
if (!file)
|
||||
if (!f.file)
|
||||
return -EBADF;
|
||||
|
||||
css = cgroup_css_from_dir(file, perf_subsys_id);
|
||||
css = cgroup_css_from_dir(f.file, perf_subsys_id);
|
||||
if (IS_ERR(css)) {
|
||||
ret = PTR_ERR(css);
|
||||
goto out;
|
||||
|
|
@ -500,7 +499,7 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event,
|
|||
ret = -EINVAL;
|
||||
}
|
||||
out:
|
||||
fput_light(file, fput_needed);
|
||||
fdput(f);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -3233,21 +3232,18 @@ unlock:
|
|||
|
||||
static const struct file_operations perf_fops;
|
||||
|
||||
static struct file *perf_fget_light(int fd, int *fput_needed)
|
||||
static inline int perf_fget_light(int fd, struct fd *p)
|
||||
{
|
||||
struct file *file;
|
||||
struct fd f = fdget(fd);
|
||||
if (!f.file)
|
||||
return -EBADF;
|
||||
|
||||
file = fget_light(fd, fput_needed);
|
||||
if (!file)
|
||||
return ERR_PTR(-EBADF);
|
||||
|
||||
if (file->f_op != &perf_fops) {
|
||||
fput_light(file, *fput_needed);
|
||||
*fput_needed = 0;
|
||||
return ERR_PTR(-EBADF);
|
||||
if (f.file->f_op != &perf_fops) {
|
||||
fdput(f);
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
return file;
|
||||
*p = f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int perf_event_set_output(struct perf_event *event,
|
||||
|
|
@ -3279,22 +3275,19 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
|
||||
case PERF_EVENT_IOC_SET_OUTPUT:
|
||||
{
|
||||
struct file *output_file = NULL;
|
||||
struct perf_event *output_event = NULL;
|
||||
int fput_needed = 0;
|
||||
int ret;
|
||||
|
||||
if (arg != -1) {
|
||||
output_file = perf_fget_light(arg, &fput_needed);
|
||||
if (IS_ERR(output_file))
|
||||
return PTR_ERR(output_file);
|
||||
output_event = output_file->private_data;
|
||||
struct perf_event *output_event;
|
||||
struct fd output;
|
||||
ret = perf_fget_light(arg, &output);
|
||||
if (ret)
|
||||
return ret;
|
||||
output_event = output.file->private_data;
|
||||
ret = perf_event_set_output(event, output_event);
|
||||
fdput(output);
|
||||
} else {
|
||||
ret = perf_event_set_output(event, NULL);
|
||||
}
|
||||
|
||||
ret = perf_event_set_output(event, output_event);
|
||||
if (output_event)
|
||||
fput_light(output_file, fput_needed);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -6229,12 +6222,11 @@ SYSCALL_DEFINE5(perf_event_open,
|
|||
struct perf_event_attr attr;
|
||||
struct perf_event_context *ctx;
|
||||
struct file *event_file = NULL;
|
||||
struct file *group_file = NULL;
|
||||
struct fd group = {NULL, 0};
|
||||
struct task_struct *task = NULL;
|
||||
struct pmu *pmu;
|
||||
int event_fd;
|
||||
int move_group = 0;
|
||||
int fput_needed = 0;
|
||||
int err;
|
||||
|
||||
/* for future expandability... */
|
||||
|
|
@ -6269,12 +6261,10 @@ SYSCALL_DEFINE5(perf_event_open,
|
|||
return event_fd;
|
||||
|
||||
if (group_fd != -1) {
|
||||
group_file = perf_fget_light(group_fd, &fput_needed);
|
||||
if (IS_ERR(group_file)) {
|
||||
err = PTR_ERR(group_file);
|
||||
err = perf_fget_light(group_fd, &group);
|
||||
if (err)
|
||||
goto err_fd;
|
||||
}
|
||||
group_leader = group_file->private_data;
|
||||
group_leader = group.file->private_data;
|
||||
if (flags & PERF_FLAG_FD_OUTPUT)
|
||||
output_event = group_leader;
|
||||
if (flags & PERF_FLAG_FD_NO_GROUP)
|
||||
|
|
@ -6450,7 +6440,7 @@ SYSCALL_DEFINE5(perf_event_open,
|
|||
* of the group leader will find the pointer to itself in
|
||||
* perf_group_detach().
|
||||
*/
|
||||
fput_light(group_file, fput_needed);
|
||||
fdput(group);
|
||||
fd_install(event_fd, event_file);
|
||||
return event_fd;
|
||||
|
||||
|
|
@ -6464,7 +6454,7 @@ err_task:
|
|||
if (task)
|
||||
put_task_struct(task);
|
||||
err_group_fd:
|
||||
fput_light(group_file, fput_needed);
|
||||
fdput(group);
|
||||
err_fd:
|
||||
put_unused_fd(event_fd);
|
||||
return err;
|
||||
|
|
|
|||
16
kernel/sys.c
16
kernel/sys.c
|
|
@ -1788,15 +1788,15 @@ SYSCALL_DEFINE1(umask, int, mask)
|
|||
#ifdef CONFIG_CHECKPOINT_RESTORE
|
||||
static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
|
||||
{
|
||||
struct file *exe_file;
|
||||
struct fd exe;
|
||||
struct dentry *dentry;
|
||||
int err, fput_needed;
|
||||
int err;
|
||||
|
||||
exe_file = fget_light(fd, &fput_needed);
|
||||
if (!exe_file)
|
||||
exe = fdget(fd);
|
||||
if (!exe.file)
|
||||
return -EBADF;
|
||||
|
||||
dentry = exe_file->f_path.dentry;
|
||||
dentry = exe.file->f_path.dentry;
|
||||
|
||||
/*
|
||||
* Because the original mm->exe_file points to executable file, make
|
||||
|
|
@ -1805,7 +1805,7 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
|
|||
*/
|
||||
err = -EACCES;
|
||||
if (!S_ISREG(dentry->d_inode->i_mode) ||
|
||||
exe_file->f_path.mnt->mnt_flags & MNT_NOEXEC)
|
||||
exe.file->f_path.mnt->mnt_flags & MNT_NOEXEC)
|
||||
goto exit;
|
||||
|
||||
err = inode_permission(dentry->d_inode, MAY_EXEC);
|
||||
|
|
@ -1839,12 +1839,12 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
|
|||
goto exit_unlock;
|
||||
|
||||
err = 0;
|
||||
set_mm_exe_file(mm, exe_file); /* this grabs a reference to exe_file */
|
||||
set_mm_exe_file(mm, exe.file); /* this grabs a reference to exe.file */
|
||||
exit_unlock:
|
||||
up_write(&mm->mmap_sem);
|
||||
|
||||
exit:
|
||||
fput_light(exe_file, fput_needed);
|
||||
fdput(exe);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -415,16 +415,15 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
|
|||
struct nlattr *na;
|
||||
size_t size;
|
||||
u32 fd;
|
||||
struct file *file;
|
||||
int fput_needed;
|
||||
struct fd f;
|
||||
|
||||
na = info->attrs[CGROUPSTATS_CMD_ATTR_FD];
|
||||
if (!na)
|
||||
return -EINVAL;
|
||||
|
||||
fd = nla_get_u32(info->attrs[CGROUPSTATS_CMD_ATTR_FD]);
|
||||
file = fget_light(fd, &fput_needed);
|
||||
if (!file)
|
||||
f = fdget(fd);
|
||||
if (!f.file)
|
||||
return 0;
|
||||
|
||||
size = nla_total_size(sizeof(struct cgroupstats));
|
||||
|
|
@ -444,7 +443,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, file->f_dentry);
|
||||
rc = cgroupstats_build(stats, f.file->f_dentry);
|
||||
if (rc < 0) {
|
||||
nlmsg_free(rep_skb);
|
||||
goto err;
|
||||
|
|
@ -453,7 +452,7 @@ static int cgroupstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
|
|||
rc = send_reply(rep_skb, info);
|
||||
|
||||
err:
|
||||
fput_light(file, fput_needed);
|
||||
fdput(f);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue