mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-01 12:04:08 +00:00
switch timerfd_[sg]ettime(2) to fget_light()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
5e196a9cf5
commit
4109633f4c
1 changed files with 9 additions and 8 deletions
17
fs/timerfd.c
17
fs/timerfd.c
|
@ -234,15 +234,15 @@ static const struct file_operations timerfd_fops = {
|
||||||
.llseek = noop_llseek,
|
.llseek = noop_llseek,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct file *timerfd_fget(int fd)
|
static struct file *timerfd_fget(int fd, int *fput_needed)
|
||||||
{
|
{
|
||||||
struct file *file;
|
struct file *file;
|
||||||
|
|
||||||
file = fget(fd);
|
file = fget_light(fd, fput_needed);
|
||||||
if (!file)
|
if (!file)
|
||||||
return ERR_PTR(-EBADF);
|
return ERR_PTR(-EBADF);
|
||||||
if (file->f_op != &timerfd_fops) {
|
if (file->f_op != &timerfd_fops) {
|
||||||
fput(file);
|
fput_light(file, *fput_needed);
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||||
struct file *file;
|
struct file *file;
|
||||||
struct timerfd_ctx *ctx;
|
struct timerfd_ctx *ctx;
|
||||||
struct itimerspec ktmr, kotmr;
|
struct itimerspec ktmr, kotmr;
|
||||||
int ret;
|
int ret, fput_needed;
|
||||||
|
|
||||||
if (copy_from_user(&ktmr, utmr, sizeof(ktmr)))
|
if (copy_from_user(&ktmr, utmr, sizeof(ktmr)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -297,7 +297,7 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||||
!timespec_valid(&ktmr.it_interval))
|
!timespec_valid(&ktmr.it_interval))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
file = timerfd_fget(ufd);
|
file = timerfd_fget(ufd, &fput_needed);
|
||||||
if (IS_ERR(file))
|
if (IS_ERR(file))
|
||||||
return PTR_ERR(file);
|
return PTR_ERR(file);
|
||||||
ctx = file->private_data;
|
ctx = file->private_data;
|
||||||
|
@ -334,7 +334,7 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||||
ret = timerfd_setup(ctx, flags, &ktmr);
|
ret = timerfd_setup(ctx, flags, &ktmr);
|
||||||
|
|
||||||
spin_unlock_irq(&ctx->wqh.lock);
|
spin_unlock_irq(&ctx->wqh.lock);
|
||||||
fput(file);
|
fput_light(file, fput_needed);
|
||||||
if (otmr && copy_to_user(otmr, &kotmr, sizeof(kotmr)))
|
if (otmr && copy_to_user(otmr, &kotmr, sizeof(kotmr)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
@ -346,8 +346,9 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
|
||||||
struct file *file;
|
struct file *file;
|
||||||
struct timerfd_ctx *ctx;
|
struct timerfd_ctx *ctx;
|
||||||
struct itimerspec kotmr;
|
struct itimerspec kotmr;
|
||||||
|
int fput_needed;
|
||||||
|
|
||||||
file = timerfd_fget(ufd);
|
file = timerfd_fget(ufd, &fput_needed);
|
||||||
if (IS_ERR(file))
|
if (IS_ERR(file))
|
||||||
return PTR_ERR(file);
|
return PTR_ERR(file);
|
||||||
ctx = file->private_data;
|
ctx = file->private_data;
|
||||||
|
@ -362,7 +363,7 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
|
||||||
kotmr.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
|
kotmr.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
|
||||||
kotmr.it_interval = ktime_to_timespec(ctx->tintv);
|
kotmr.it_interval = ktime_to_timespec(ctx->tintv);
|
||||||
spin_unlock_irq(&ctx->wqh.lock);
|
spin_unlock_irq(&ctx->wqh.lock);
|
||||||
fput(file);
|
fput_light(file, fput_needed);
|
||||||
|
|
||||||
return copy_to_user(otmr, &kotmr, sizeof(kotmr)) ? -EFAULT: 0;
|
return copy_to_user(otmr, &kotmr, sizeof(kotmr)) ? -EFAULT: 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue