aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-05-02 13:51:00 -0400
committerChristoph Hellwig <hch@lst.de>2018-05-02 13:57:24 -0400
commit7a074e96dee62586c935c80cecd931431bfdd0be (patch)
treea1a29dad896070e82827d7447cfcc9a064e5a63d /include/linux
parenta3c0d439e4d92411c2b4b21a526a4de720d0806b (diff)
aio: implement io_pgetevents
This is the io_getevents equivalent of ppoll/pselect and allows to properly mix signals and aio completions (especially with IOCB_CMD_POLL) and atomically executes the following sequence: sigset_t origmask; pthread_sigmask(SIG_SETMASK, &sigmask, &origmask); ret = io_getevents(ctx, min_nr, nr, events, timeout); pthread_sigmask(SIG_SETMASK, &origmask, NULL); Note that unlike many other signal related calls we do not pass a sigmask size, as that would get us to 7 arguments, which aren't easily supported by the syscall infrastructure. It seems a lot less painful to just add a new syscall variant in the unlikely case we're going to increase the sigset size. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/compat.h7
-rw-r--r--include/linux/syscalls.h6
2 files changed, 13 insertions, 0 deletions
diff --git a/include/linux/compat.h b/include/linux/compat.h
index 081281ad5772..ad192057b887 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -330,6 +330,7 @@ extern int put_compat_rusage(const struct rusage *,
330 struct compat_rusage __user *); 330 struct compat_rusage __user *);
331 331
332struct compat_siginfo; 332struct compat_siginfo;
333struct __compat_aio_sigset;
333 334
334struct compat_dirent { 335struct compat_dirent {
335 u32 d_ino; 336 u32 d_ino;
@@ -553,6 +554,12 @@ asmlinkage long compat_sys_io_getevents(compat_aio_context_t ctx_id,
553 compat_long_t nr, 554 compat_long_t nr,
554 struct io_event __user *events, 555 struct io_event __user *events,
555 struct compat_timespec __user *timeout); 556 struct compat_timespec __user *timeout);
557asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
558 compat_long_t min_nr,
559 compat_long_t nr,
560 struct io_event __user *events,
561 struct compat_timespec __user *timeout,
562 const struct __compat_aio_sigset __user *usig);
556 563
557/* fs/cookies.c */ 564/* fs/cookies.c */
558asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t); 565asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t);
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 70fcda1a9049..811172fcb916 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -290,6 +290,12 @@ asmlinkage long sys_io_getevents(aio_context_t ctx_id,
290 long nr, 290 long nr,
291 struct io_event __user *events, 291 struct io_event __user *events,
292 struct timespec __user *timeout); 292 struct timespec __user *timeout);
293asmlinkage long sys_io_pgetevents(aio_context_t ctx_id,
294 long min_nr,
295 long nr,
296 struct io_event __user *events,
297 struct timespec __user *timeout,
298 const struct __aio_sigset *sig);
293 299
294/* fs/xattr.c */ 300/* fs/xattr.c */
295asmlinkage long sys_setxattr(const char __user *path, const char __user *name, 301asmlinkage long sys_setxattr(const char __user *path, const char __user *name,