X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=fs%2Feventfd.c;h=08bf558d04080ffe0a3ced77a5660d4af4e1182f;hb=f68ec0c24755e5cdb779be6240925f2175311d84;hp=a9f130cd50ac2be6009ed2091fce0ec21d134fdd;hpb=ab1ecbabb1c7b1599b1eb70c291407c557ea4ef3;p=cascardo%2Flinux.git diff --git a/fs/eventfd.c b/fs/eventfd.c index a9f130cd50ac..08bf558d0408 100644 --- a/fs/eventfd.c +++ b/fs/eventfd.c @@ -198,12 +198,17 @@ struct file *eventfd_fget(int fd) return file; } -asmlinkage long sys_eventfd(unsigned int count) +asmlinkage long sys_eventfd2(unsigned int count, int flags) { - int error, fd; + int fd; struct eventfd_ctx *ctx; - struct file *file; - struct inode *inode; + + /* Check the EFD_* constants for consistency. */ + BUILD_BUG_ON(EFD_CLOEXEC != O_CLOEXEC); + BUILD_BUG_ON(EFD_NONBLOCK != O_NONBLOCK); + + if (flags & ~(EFD_CLOEXEC | EFD_NONBLOCK)) + return -EINVAL; ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); if (!ctx) @@ -216,12 +221,15 @@ asmlinkage long sys_eventfd(unsigned int count) * When we call this, the initialization must be complete, since * anon_inode_getfd() will install the fd. */ - error = anon_inode_getfd(&fd, &inode, &file, "[eventfd]", - &eventfd_fops, ctx); - if (!error) - return fd; + fd = anon_inode_getfd("[eventfd]", &eventfd_fops, ctx, + flags & (O_CLOEXEC | O_NONBLOCK)); + if (fd < 0) + kfree(ctx); + return fd; +} - kfree(ctx); - return error; +asmlinkage long sys_eventfd(unsigned int count) +{ + return sys_eventfd2(count, 0); }