]> Pileus Git - ~andy/linux/blobdiff - fs/timerfd.c
switch simple cases of fget_light to fdget
[~andy/linux] / fs / timerfd.c
index dd91e9420c9e09fa1de66892aa605eaa66d8f370..d03822bbf1909080ff201acc372de185d10d50d5 100644 (file)
@@ -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;
 }