diff options
Diffstat (limited to 'fs/eventpoll.c')
-rw-r--r-- | fs/eventpoll.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index deecc7294a67..9ad17b15b454 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/mutex.h> | 34 | #include <linux/mutex.h> |
35 | #include <linux/anon_inodes.h> | 35 | #include <linux/anon_inodes.h> |
36 | #include <linux/device.h> | 36 | #include <linux/device.h> |
37 | #include <linux/freezer.h> | ||
37 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
38 | #include <asm/io.h> | 39 | #include <asm/io.h> |
39 | #include <asm/mman.h> | 40 | #include <asm/mman.h> |
@@ -1602,7 +1603,8 @@ fetch_events: | |||
1602 | } | 1603 | } |
1603 | 1604 | ||
1604 | spin_unlock_irqrestore(&ep->lock, flags); | 1605 | spin_unlock_irqrestore(&ep->lock, flags); |
1605 | if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS)) | 1606 | if (!freezable_schedule_hrtimeout_range(to, slack, |
1607 | HRTIMER_MODE_ABS)) | ||
1606 | timed_out = 1; | 1608 | timed_out = 1; |
1607 | 1609 | ||
1608 | spin_lock_irqsave(&ep->lock, flags); | 1610 | spin_lock_irqsave(&ep->lock, flags); |
@@ -1975,8 +1977,8 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events, | |||
1975 | return -EINVAL; | 1977 | return -EINVAL; |
1976 | if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask))) | 1978 | if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask))) |
1977 | return -EFAULT; | 1979 | return -EFAULT; |
1978 | sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP)); | 1980 | sigsaved = current->blocked; |
1979 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | 1981 | set_current_blocked(&ksigmask); |
1980 | } | 1982 | } |
1981 | 1983 | ||
1982 | error = sys_epoll_wait(epfd, events, maxevents, timeout); | 1984 | error = sys_epoll_wait(epfd, events, maxevents, timeout); |
@@ -1993,7 +1995,7 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events, | |||
1993 | sizeof(sigsaved)); | 1995 | sizeof(sigsaved)); |
1994 | set_restore_sigmask(); | 1996 | set_restore_sigmask(); |
1995 | } else | 1997 | } else |
1996 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | 1998 | set_current_blocked(&sigsaved); |
1997 | } | 1999 | } |
1998 | 2000 | ||
1999 | return error; | 2001 | return error; |
@@ -2020,8 +2022,8 @@ COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd, | |||
2020 | if (copy_from_user(&csigmask, sigmask, sizeof(csigmask))) | 2022 | if (copy_from_user(&csigmask, sigmask, sizeof(csigmask))) |
2021 | return -EFAULT; | 2023 | return -EFAULT; |
2022 | sigset_from_compat(&ksigmask, &csigmask); | 2024 | sigset_from_compat(&ksigmask, &csigmask); |
2023 | sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP)); | 2025 | sigsaved = current->blocked; |
2024 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | 2026 | set_current_blocked(&ksigmask); |
2025 | } | 2027 | } |
2026 | 2028 | ||
2027 | err = sys_epoll_wait(epfd, events, maxevents, timeout); | 2029 | err = sys_epoll_wait(epfd, events, maxevents, timeout); |
@@ -2038,7 +2040,7 @@ COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd, | |||
2038 | sizeof(sigsaved)); | 2040 | sizeof(sigsaved)); |
2039 | set_restore_sigmask(); | 2041 | set_restore_sigmask(); |
2040 | } else | 2042 | } else |
2041 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | 2043 | set_current_blocked(&sigsaved); |
2042 | } | 2044 | } |
2043 | 2045 | ||
2044 | return err; | 2046 | return err; |