switch simple cases of fget_light to fdget
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
48
fs/timerfd.c
48
fs/timerfd.c
@@ -234,19 +234,17 @@ static const struct file_operations timerfd_fops = {
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static struct file *timerfd_fget(int fd, int *fput_needed)
|
||||
static int timerfd_fget(int fd, struct fd *p)
|
||||
{
|
||||
struct file *file;
|
||||
|
||||
file = fget_light(fd, fput_needed);
|
||||
if (!file)
|
||||
return ERR_PTR(-EBADF);
|
||||
if (file->f_op != &timerfd_fops) {
|
||||
fput_light(file, *fput_needed);
|
||||
return ERR_PTR(-EINVAL);
|
||||
struct fd f = fdget(fd);
|
||||
if (!f.file)
|
||||
return -EBADF;
|
||||
if (f.file->f_op != &timerfd_fops) {
|
||||
fdput(f);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return file;
|
||||
*p = f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
|
||||
@@ -284,10 +282,10 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||
const struct itimerspec __user *, utmr,
|
||||
struct itimerspec __user *, otmr)
|
||||
{
|
||||
struct file *file;
|
||||
struct fd f;
|
||||
struct timerfd_ctx *ctx;
|
||||
struct itimerspec ktmr, kotmr;
|
||||
int ret, fput_needed;
|
||||
int ret;
|
||||
|
||||
if (copy_from_user(&ktmr, utmr, sizeof(ktmr)))
|
||||
return -EFAULT;
|
||||
@@ -297,10 +295,10 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||
!timespec_valid(&ktmr.it_interval))
|
||||
return -EINVAL;
|
||||
|
||||
file = timerfd_fget(ufd, &fput_needed);
|
||||
if (IS_ERR(file))
|
||||
return PTR_ERR(file);
|
||||
ctx = file->private_data;
|
||||
ret = timerfd_fget(ufd, &f);
|
||||
if (ret)
|
||||
return ret;
|
||||
ctx = f.file->private_data;
|
||||
|
||||
timerfd_setup_cancel(ctx, flags);
|
||||
|
||||
@@ -334,7 +332,7 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||
ret = timerfd_setup(ctx, flags, &ktmr);
|
||||
|
||||
spin_unlock_irq(&ctx->wqh.lock);
|
||||
fput_light(file, fput_needed);
|
||||
fdput(f);
|
||||
if (otmr && copy_to_user(otmr, &kotmr, sizeof(kotmr)))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -343,15 +341,13 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||
|
||||
SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
|
||||
{
|
||||
struct file *file;
|
||||
struct fd f;
|
||||
struct timerfd_ctx *ctx;
|
||||
struct itimerspec kotmr;
|
||||
int fput_needed;
|
||||
|
||||
file = timerfd_fget(ufd, &fput_needed);
|
||||
if (IS_ERR(file))
|
||||
return PTR_ERR(file);
|
||||
ctx = file->private_data;
|
||||
int ret = timerfd_fget(ufd, &f);
|
||||
if (ret)
|
||||
return ret;
|
||||
ctx = f.file->private_data;
|
||||
|
||||
spin_lock_irq(&ctx->wqh.lock);
|
||||
if (ctx->expired && ctx->tintv.tv64) {
|
||||
@@ -363,7 +359,7 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
|
||||
kotmr.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
|
||||
kotmr.it_interval = ktime_to_timespec(ctx->tintv);
|
||||
spin_unlock_irq(&ctx->wqh.lock);
|
||||
fput_light(file, fput_needed);
|
||||
fdput(f);
|
||||
|
||||
return copy_to_user(otmr, &kotmr, sizeof(kotmr)) ? -EFAULT: 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user