mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
do_poll: return -EINTR when signalled
do_poll() checks signal_pending() but returns 0 when interrupted. This means the caller has to check signal_pending() again. Change it to return -EINTR when signal_pending() and count == 0. Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Cc: Andi Kleen <ak@suse.de> Cc: Davide Libenzi <davidel@xmailserver.org> Cc: Vadim Lobanov <vlobanov@speakeasy.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
252e5725cf
commit
9bf084f70f
14
fs/select.c
14
fs/select.c
@ -586,7 +586,7 @@ static int do_poll(unsigned int nfds, struct poll_list *list,
|
|||||||
/* Optimise the no-wait case */
|
/* Optimise the no-wait case */
|
||||||
if (!(*timeout))
|
if (!(*timeout))
|
||||||
pt = NULL;
|
pt = NULL;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct poll_list *walk;
|
struct poll_list *walk;
|
||||||
long __timeout;
|
long __timeout;
|
||||||
@ -616,10 +616,12 @@ static int do_poll(unsigned int nfds, struct poll_list *list,
|
|||||||
* a poll_table to them on the next loop iteration.
|
* a poll_table to them on the next loop iteration.
|
||||||
*/
|
*/
|
||||||
pt = NULL;
|
pt = NULL;
|
||||||
if (count || !*timeout || signal_pending(current))
|
if (!count) {
|
||||||
break;
|
count = wait->error;
|
||||||
count = wait->error;
|
if (signal_pending(current))
|
||||||
if (count)
|
count = -EINTR;
|
||||||
|
}
|
||||||
|
if (count || !*timeout)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (*timeout < 0) {
|
if (*timeout < 0) {
|
||||||
@ -689,8 +691,6 @@ int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, s64 *timeout)
|
|||||||
|
|
||||||
poll_initwait(&table);
|
poll_initwait(&table);
|
||||||
fdcount = do_poll(nfds, head, &table, timeout);
|
fdcount = do_poll(nfds, head, &table, timeout);
|
||||||
if (!fdcount && signal_pending(current))
|
|
||||||
fdcount = -EINTR;
|
|
||||||
poll_freewait(&table);
|
poll_freewait(&table);
|
||||||
|
|
||||||
for (walk = head; walk; walk = walk->next) {
|
for (walk = head; walk; walk = walk->next) {
|
||||||
|
Loading…
Reference in New Issue
Block a user