switch simple cases of fget_light to fdget

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2012-08-28 12:52:22 -04:00
parent a5b470ba06
commit 2903ff019b
44 changed files with 631 additions and 761 deletions

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}