summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@digeo.com>2003-02-11 21:08:51 -0800
committerLinus Torvalds <torvalds@penguin.transmeta.com>2003-02-11 21:08:51 -0800
commite19690cdb5685041de3afdaf2d44f8cd46bfec4a (patch)
treee3a172072d3e5a068e1aa0d0ada9260bf7f0b664
parent2b8a659cd318133765f3556e169b984f09fd76bb (diff)
[PATCH] epoll timeout and syscall return types
Patch from Davide Libenzi <davidel@xmailserver.org> Changes : - Timeout overflow check - Ceil()ing of ms->jif conversion - Syscalls return type int->long
-rw-r--r--fs/eventpoll.c20
-rw-r--r--include/linux/eventpoll.h8
2 files changed, 15 insertions, 13 deletions
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index ff4282e71288..dd886ac3488b 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -261,7 +261,7 @@ static int ep_send_events(struct eventpoll *ep, struct epitem **aepi, int nepi,
struct epoll_event *events);
static int ep_events_transfer(struct eventpoll *ep, struct epoll_event *events, int maxevents);
static int ep_poll(struct eventpoll *ep, struct epoll_event *events, int maxevents,
- int timeout);
+ long timeout);
static int eventpollfs_delete_dentry(struct dentry *dentry);
static struct inode *ep_eventpoll_inode(void);
static struct super_block *eventpollfs_get_sb(struct file_system_type *fs_type,
@@ -446,7 +446,7 @@ void eventpoll_release(struct file *file)
* file descriptors inside the epoll interface. It is the kernel part of
* the userspace epoll_create(2).
*/
-asmlinkage int sys_epoll_create(int size)
+asmlinkage long sys_epoll_create(int size)
{
int error, fd;
unsigned int hashbits;
@@ -492,7 +492,7 @@ eexit_1:
* file that enable the insertion/removal/change of file descriptors inside
* the interest set. It rapresents the kernel part of the user spcae epoll_ctl(2).
*/
-asmlinkage int sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
+asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
{
int error;
struct file *file, *tfile;
@@ -596,8 +596,8 @@ eexit_1:
* Implement the event wait interface for the eventpoll file. It is the kernel
* part of the user space epoll_wait(2).
*/
-asmlinkage int sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
- int timeout)
+asmlinkage long sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
+ int timeout)
{
int error;
struct file *file;
@@ -1420,7 +1420,7 @@ static int ep_events_transfer(struct eventpoll *ep, struct epoll_event *events,
static int ep_poll(struct eventpoll *ep, struct epoll_event *events, int maxevents,
- int timeout)
+ long timeout)
{
int res, eavail;
unsigned long flags;
@@ -1428,10 +1428,12 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event *events, int maxeven
wait_queue_t wait;
/*
- * Calculate the timeout by checking for the "infinite" value ( -1 ).
- * The passed timeout is in milliseconds, that why (t * HZ) / 1000.
+ * Calculate the timeout by checking for the "infinite" value ( -1 )
+ * and the overflow condition. The passed timeout is in milliseconds,
+ * that why (t * HZ) / 1000.
*/
- jtimeout = timeout == -1 ? MAX_SCHEDULE_TIMEOUT: (timeout * HZ) / 1000;
+ jtimeout = timeout == -1 || timeout > (MAX_SCHEDULE_TIMEOUT - 1000) / HZ ?
+ MAX_SCHEDULE_TIMEOUT: (timeout * HZ + 999) / 1000;
retry:
write_lock_irqsave(&ep->lock, flags);
diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h
index 64ba5c38f2a6..199ce93d09d0 100644
--- a/include/linux/eventpoll.h
+++ b/include/linux/eventpoll.h
@@ -32,10 +32,10 @@ struct file;
/* Kernel space functions implementing the user space "epoll" API */
-asmlinkage int sys_epoll_create(int size);
-asmlinkage int sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
-asmlinkage int sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
- int timeout);
+asmlinkage long sys_epoll_create(int size);
+asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
+asmlinkage long sys_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
+ int timeout);
/* Used to initialize the epoll bits inside the "struct file" */
void eventpoll_init_file(struct file *file);