All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Jeff Moyer <jmoyer@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>,
	viro@zeniv.linux.org.uk, Avi Kivity <avi@scylladb.com>,
	linux-aio@kvack.org, linux-fsdevel@vger.kernel.org,
	netdev@vger.kernel.org, linux-api@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 32/32] aio: implement io_pgetevents
Date: Wed, 17 Jan 2018 08:36:52 +0100	[thread overview]
Message-ID: <20180117073652.GA27389@lst.de> (raw)
In-Reply-To: <x493735b9l7.fsf@segfault.boston.devel.redhat.com>

On Tue, Jan 16, 2018 at 07:41:24PM -0500, Jeff Moyer wrote:
> I'd be willing to bet the issue is in your io_syscall6 implementation.
> You pass in arg5 where arg6 should be used.  Don't feel bad, it took me
> the better part of today to figure that out.  :)
> 
> Here's an incremental diff on top of what you've posted.  Feel free to
> fold it into your patch (and format however you like).  You can find the
> libaio changes in my 'aio-poll' branch:
>   https://pagure.io/libaio/commits/aio-poll
> 
> These changes were run through the libaio test harness, 64 bit and 32
> bit, so the compat system call was tested.

Oops, yes.  Although I prefer the copy_from_user version, this is what
I had:


diff --git a/fs/aio.c b/fs/aio.c
index 9fe0a5539596..6c1bbfa9b06a 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1984,8 +1984,9 @@ SYSCALL_DEFINE6(io_pgetevents,
 		long, nr,
 		struct io_event __user *, events,
 		struct timespec __user *, timeout,
-		const sigset_t __user *, sigmask)
+		const struct __aio_sigset __user *, usig)
 {
+	struct __aio_sigset	ksig = { NULL, };
 	sigset_t		ksigmask, sigsaved;
 	struct timespec64	ts;
 	int ret;
@@ -1993,8 +1994,13 @@ SYSCALL_DEFINE6(io_pgetevents,
 	if (timeout && unlikely(get_timespec64(&ts, timeout)))
 		return -EFAULT;
 
-	if (sigmask) {
-		if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
+	if (usig && copy_from_user(&ksig, usig, sizeof(ksig)))
+		return -EFAULT;
+
+	if (ksig.sigmask) {
+		if (ksig.sigsetsize != sizeof(sigset_t))
+			return -EINVAL;
+		if (copy_from_user(&ksigmask, ksig.sigmask, sizeof(ksigmask)))
 			return -EFAULT;
 		sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
 		sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
@@ -2002,7 +2008,7 @@ SYSCALL_DEFINE6(io_pgetevents,
 
 	ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL);
 	if (signal_pending(current)) {
-		if (sigmask) {
+		if (ksig.sigmask) {
 			current->saved_sigmask = sigsaved;
 			set_restore_sigmask();
 		}
@@ -2010,7 +2016,7 @@ SYSCALL_DEFINE6(io_pgetevents,
 		if (!ret)
 			ret = -ERESTARTNOHAND;
 	} else {
-		if (sigmask)
+		if (ksig.sigmask)
 			sigprocmask(SIG_SETMASK, &sigsaved, NULL);
 	}
 
@@ -2036,14 +2042,21 @@ COMPAT_SYSCALL_DEFINE5(io_getevents, compat_aio_context_t, ctx_id,
 	return ret;
 }
 
+
+struct __compat_aio_sigset {
+	compat_sigset_t __user	*sigmask;
+	compat_size_t		sigsetsize;
+};
+
 COMPAT_SYSCALL_DEFINE6(io_pgetevents,
 		compat_aio_context_t, ctx_id,
 		compat_long_t, min_nr,
 		compat_long_t, nr,
 		struct io_event __user *, events,
 		struct compat_timespec __user *, timeout,
-		const compat_sigset_t __user *, sigmask)
+		const struct __compat_aio_sigset __user *, usig)
 {
+	struct __compat_aio_sigset ksig = { NULL, };
 	sigset_t ksigmask, sigsaved;
 	struct timespec64 t;
 	int ret;
@@ -2051,8 +2064,13 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
 	if (timeout && compat_get_timespec64(&t, timeout))
 		return -EFAULT;
 
-	if (sigmask) {
-		if (get_compat_sigset(&ksigmask, sigmask))
+	if (usig && copy_from_user(&ksig, usig, sizeof(ksig)))
+		return -EFAULT;
+
+	if (ksig.sigmask) {
+		if (ksig.sigsetsize != sizeof(compat_sigset_t))
+			return -EINVAL;
+		if (get_compat_sigset(&ksigmask, ksig.sigmask))
 			return -EFAULT;
 		sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
 		sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
@@ -2060,14 +2078,14 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
 
 	ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL);
 	if (signal_pending(current)) {
-		if (sigmask) {
+		if (ksig.sigmask) {
 			current->saved_sigmask = sigsaved;
 			set_restore_sigmask();
 		}
 		if (!ret)
 			ret = -ERESTARTNOHAND;
 	} else {
-		if (sigmask)
+		if (ksig.sigmask)
 			sigprocmask(SIG_SETMASK, &sigsaved, NULL);
 	}
 
diff --git a/include/linux/compat.h b/include/linux/compat.h
index a4cda98073f1..6c04450e961f 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -205,6 +205,7 @@ extern int put_compat_rusage(const struct rusage *,
 			     struct compat_rusage __user *);
 
 struct compat_siginfo;
+struct __compat_aio_sigset;
 
 extern asmlinkage long compat_sys_waitid(int, compat_pid_t,
 		struct compat_siginfo __user *, int,
@@ -541,7 +542,7 @@ asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
 					compat_long_t nr,
 					struct io_event __user *events,
 					struct compat_timespec __user *timeout,
-					const compat_sigset_t __user *sigmask);
+					const struct __compat_aio_sigset __user *usig);
 asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr,
 				     u32 __user *iocb);
 asmlinkage long compat_sys_mount(const char __user *dev_name,
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 3bc9a130f4a9..8515ec53c81b 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -544,7 +544,7 @@ asmlinkage long sys_io_pgetevents(aio_context_t ctx_id,
 				long nr,
 				struct io_event __user *events,
 				struct timespec __user *timeout,
-				const sigset_t __user *sigmask);
+				const struct __aio_sigset *sig);
 asmlinkage long sys_io_submit(aio_context_t, long,
 				struct iocb __user * __user *);
 asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h
index 28330105a4b6..ed0185945bb2 100644
--- a/include/uapi/linux/aio_abi.h
+++ b/include/uapi/linux/aio_abi.h
@@ -29,6 +29,7 @@
 
 #include <linux/types.h>
 #include <linux/fs.h>
+#include <linux/signal.h>
 #include <asm/byteorder.h>
 
 typedef __kernel_ulong_t aio_context_t;
@@ -106,5 +107,10 @@ struct iocb {
 #undef IFBIG
 #undef IFLITTLE
 
+struct __aio_sigset {
+	sigset_t __user	*sigmask;
+	size_t		sigsetsize;
+};
+
 #endif /* __LINUX__AIO_ABI_H */
 

--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org.  For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>

WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: Jeff Moyer <jmoyer@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>,
	viro@zeniv.linux.org.uk, Avi Kivity <avi@scylladb.com>,
	linux-aio@kvack.org, linux-fsdevel@vger.kernel.org,
	netdev@vger.kernel.org, linux-api@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 32/32] aio: implement io_pgetevents
Date: Wed, 17 Jan 2018 08:36:52 +0100	[thread overview]
Message-ID: <20180117073652.GA27389@lst.de> (raw)
In-Reply-To: <x493735b9l7.fsf@segfault.boston.devel.redhat.com>

On Tue, Jan 16, 2018 at 07:41:24PM -0500, Jeff Moyer wrote:
> I'd be willing to bet the issue is in your io_syscall6 implementation.
> You pass in arg5 where arg6 should be used.  Don't feel bad, it took me
> the better part of today to figure that out.  :)
> 
> Here's an incremental diff on top of what you've posted.  Feel free to
> fold it into your patch (and format however you like).  You can find the
> libaio changes in my 'aio-poll' branch:
>   https://pagure.io/libaio/commits/aio-poll
> 
> These changes were run through the libaio test harness, 64 bit and 32
> bit, so the compat system call was tested.

Oops, yes.  Although I prefer the copy_from_user version, this is what
I had:


diff --git a/fs/aio.c b/fs/aio.c
index 9fe0a5539596..6c1bbfa9b06a 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1984,8 +1984,9 @@ SYSCALL_DEFINE6(io_pgetevents,
 		long, nr,
 		struct io_event __user *, events,
 		struct timespec __user *, timeout,
-		const sigset_t __user *, sigmask)
+		const struct __aio_sigset __user *, usig)
 {
+	struct __aio_sigset	ksig = { NULL, };
 	sigset_t		ksigmask, sigsaved;
 	struct timespec64	ts;
 	int ret;
@@ -1993,8 +1994,13 @@ SYSCALL_DEFINE6(io_pgetevents,
 	if (timeout && unlikely(get_timespec64(&ts, timeout)))
 		return -EFAULT;
 
-	if (sigmask) {
-		if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask)))
+	if (usig && copy_from_user(&ksig, usig, sizeof(ksig)))
+		return -EFAULT;
+
+	if (ksig.sigmask) {
+		if (ksig.sigsetsize != sizeof(sigset_t))
+			return -EINVAL;
+		if (copy_from_user(&ksigmask, ksig.sigmask, sizeof(ksigmask)))
 			return -EFAULT;
 		sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
 		sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
@@ -2002,7 +2008,7 @@ SYSCALL_DEFINE6(io_pgetevents,
 
 	ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &ts : NULL);
 	if (signal_pending(current)) {
-		if (sigmask) {
+		if (ksig.sigmask) {
 			current->saved_sigmask = sigsaved;
 			set_restore_sigmask();
 		}
@@ -2010,7 +2016,7 @@ SYSCALL_DEFINE6(io_pgetevents,
 		if (!ret)
 			ret = -ERESTARTNOHAND;
 	} else {
-		if (sigmask)
+		if (ksig.sigmask)
 			sigprocmask(SIG_SETMASK, &sigsaved, NULL);
 	}
 
@@ -2036,14 +2042,21 @@ COMPAT_SYSCALL_DEFINE5(io_getevents, compat_aio_context_t, ctx_id,
 	return ret;
 }
 
+
+struct __compat_aio_sigset {
+	compat_sigset_t __user	*sigmask;
+	compat_size_t		sigsetsize;
+};
+
 COMPAT_SYSCALL_DEFINE6(io_pgetevents,
 		compat_aio_context_t, ctx_id,
 		compat_long_t, min_nr,
 		compat_long_t, nr,
 		struct io_event __user *, events,
 		struct compat_timespec __user *, timeout,
-		const compat_sigset_t __user *, sigmask)
+		const struct __compat_aio_sigset __user *, usig)
 {
+	struct __compat_aio_sigset ksig = { NULL, };
 	sigset_t ksigmask, sigsaved;
 	struct timespec64 t;
 	int ret;
@@ -2051,8 +2064,13 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
 	if (timeout && compat_get_timespec64(&t, timeout))
 		return -EFAULT;
 
-	if (sigmask) {
-		if (get_compat_sigset(&ksigmask, sigmask))
+	if (usig && copy_from_user(&ksig, usig, sizeof(ksig)))
+		return -EFAULT;
+
+	if (ksig.sigmask) {
+		if (ksig.sigsetsize != sizeof(compat_sigset_t))
+			return -EINVAL;
+		if (get_compat_sigset(&ksigmask, ksig.sigmask))
 			return -EFAULT;
 		sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
 		sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
@@ -2060,14 +2078,14 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
 
 	ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL);
 	if (signal_pending(current)) {
-		if (sigmask) {
+		if (ksig.sigmask) {
 			current->saved_sigmask = sigsaved;
 			set_restore_sigmask();
 		}
 		if (!ret)
 			ret = -ERESTARTNOHAND;
 	} else {
-		if (sigmask)
+		if (ksig.sigmask)
 			sigprocmask(SIG_SETMASK, &sigsaved, NULL);
 	}
 
diff --git a/include/linux/compat.h b/include/linux/compat.h
index a4cda98073f1..6c04450e961f 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -205,6 +205,7 @@ extern int put_compat_rusage(const struct rusage *,
 			     struct compat_rusage __user *);
 
 struct compat_siginfo;
+struct __compat_aio_sigset;
 
 extern asmlinkage long compat_sys_waitid(int, compat_pid_t,
 		struct compat_siginfo __user *, int,
@@ -541,7 +542,7 @@ asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
 					compat_long_t nr,
 					struct io_event __user *events,
 					struct compat_timespec __user *timeout,
-					const compat_sigset_t __user *sigmask);
+					const struct __compat_aio_sigset __user *usig);
 asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr,
 				     u32 __user *iocb);
 asmlinkage long compat_sys_mount(const char __user *dev_name,
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 3bc9a130f4a9..8515ec53c81b 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -544,7 +544,7 @@ asmlinkage long sys_io_pgetevents(aio_context_t ctx_id,
 				long nr,
 				struct io_event __user *events,
 				struct timespec __user *timeout,
-				const sigset_t __user *sigmask);
+				const struct __aio_sigset *sig);
 asmlinkage long sys_io_submit(aio_context_t, long,
 				struct iocb __user * __user *);
 asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h
index 28330105a4b6..ed0185945bb2 100644
--- a/include/uapi/linux/aio_abi.h
+++ b/include/uapi/linux/aio_abi.h
@@ -29,6 +29,7 @@
 
 #include <linux/types.h>
 #include <linux/fs.h>
+#include <linux/signal.h>
 #include <asm/byteorder.h>
 
 typedef __kernel_ulong_t aio_context_t;
@@ -106,5 +107,10 @@ struct iocb {
 #undef IFBIG
 #undef IFLITTLE
 
+struct __aio_sigset {
+	sigset_t __user	*sigmask;
+	size_t		sigsetsize;
+};
+
 #endif /* __LINUX__AIO_ABI_H */
 

  parent reply	other threads:[~2018-01-17  7:36 UTC|newest]

Thread overview: 118+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-10 15:58 aio poll, io_pgetevents and a new in-kernel poll API V2 Christoph Hellwig
2018-01-10 15:58 ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 01/32] fs: update documentation for __poll_t Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 02/32] fs: add new vfs_poll and file_can_poll helpers Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 03/32] fs: introduce new ->get_poll_head and ->poll_mask methods Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 21:04   ` Al Viro
2018-01-10 21:04     ` Al Viro
2018-01-11  5:22     ` Al Viro
2018-01-11  5:22       ` Al Viro
2018-01-11  8:28       ` Christoph Hellwig
2018-01-11  8:28         ` Christoph Hellwig
2018-01-11 11:32       ` Christoph Hellwig
2018-01-11 11:32         ` Christoph Hellwig
2018-01-11 11:36     ` Christoph Hellwig
2018-01-11 11:36       ` Christoph Hellwig
2018-01-11 17:47       ` Al Viro
2018-01-11 17:47         ` Al Viro
2018-01-12  9:06         ` Christoph Hellwig
2018-01-12  9:06           ` Christoph Hellwig
2018-01-17 16:05         ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 04/32] net: refactor socket_poll Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 05/32] net: add support for ->poll_mask in proto_ops Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 06/32] net: remove sock_no_poll Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 07/32] net/tcp: convert to ->poll_mask Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 08/32] net/unix: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 09/32] net: convert datagram_poll users tp ->poll_mask Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 10/32] net/dccp: convert to ->poll_mask Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 11/32] net/atm: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 12/32] net/vmw_vsock: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 13/32] net/tipc: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 19:32   ` Jon Maloy
2018-01-10 19:32     ` Jon Maloy
2018-01-10 15:58 ` [PATCH 14/32] net/sctp: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 15/32] net/bluetooth: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 16/32] net/caif: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 17/32] net/nfc: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 18/32] net/phonet: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 19/32] net/iucv: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 20/32] net/rxrpc: " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 21/32] pipe: " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 22/32] eventfd: switch " Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 23/32] timerfd: convert " Christoph Hellwig
2018-01-10 15:58 ` [PATCH 24/32] aio: don't print the page size at boot time Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 25/32] aio: remove an outdated comment in aio_complete Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 26/32] aio: refactor read/write iocb setup Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 21:19   ` Jeff Moyer
2018-01-10 21:19     ` Jeff Moyer
2018-01-11 13:38     ` Christoph Hellwig
2018-01-11 13:38       ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 27/32] aio: sanitize ki_list handling Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 21:29   ` Jeff Moyer
2018-01-10 21:29     ` Jeff Moyer
2018-01-10 15:58 ` [PATCH 28/32] aio: simplify cancellation Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 22:50   ` Jeff Moyer
2018-01-10 15:58 ` [PATCH 29/32] aio: delete iocbs from the active_reqs list in kiocb_cancel Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 22:52   ` Jeff Moyer
2018-01-10 22:52     ` Jeff Moyer
2018-01-10 15:58 ` [PATCH 30/32] aio: add delayed cancel support Christoph Hellwig
2018-01-10 15:58   ` Christoph Hellwig
2018-01-10 22:59   ` Jeff Moyer
2018-01-10 22:59     ` Jeff Moyer
2018-01-10 23:26     ` Jeff Moyer
2018-01-10 23:26       ` Jeff Moyer
2018-01-11 13:43       ` Christoph Hellwig
2018-01-11 13:43         ` Christoph Hellwig
2018-01-11 15:27         ` Jeff Moyer
2018-01-11 15:27           ` Jeff Moyer
2018-01-15  8:54           ` Christoph Hellwig
2018-01-10 15:58 ` [PATCH 31/32] aio: implement IOCB_CMD_POLL Christoph Hellwig
2018-01-10 15:58 ` [PATCH 32/32] aio: implement io_pgetevents Christoph Hellwig
     [not found]   ` <20180110155853.32348-33-hch-jcswGhMUV9g@public.gmane.org>
2018-01-12 20:44     ` Jeff Moyer
2018-01-12 20:44       ` Jeff Moyer
2018-01-15  8:53       ` Christoph Hellwig
2018-01-15  8:53         ` Christoph Hellwig
2018-01-16 12:04         ` Christoph Hellwig
2018-01-17  0:41           ` Jeff Moyer
2018-01-17  0:41             ` Jeff Moyer
2018-01-17  4:27             ` Al Viro
2018-01-17  4:27               ` Al Viro
2018-01-17  7:08               ` Christoph Hellwig
2018-01-17  7:08                 ` Christoph Hellwig
2018-01-17 13:49                 ` Jeff Moyer
2018-01-17 13:49                   ` Jeff Moyer
2018-01-17  7:36             ` Christoph Hellwig [this message]
2018-01-17  7:36               ` Christoph Hellwig
2018-01-17 13:51               ` Jeff Moyer
2018-01-17 13:51                 ` Jeff Moyer
2018-01-10 22:36 ` aio poll, io_pgetevents and a new in-kernel poll API V2 Michael Kerrisk (man-pages)
2018-01-10 22:36   ` Michael Kerrisk (man-pages)
2018-01-10 23:34   ` Jeff Moyer
2018-01-10 23:34     ` Jeff Moyer
2018-01-10 23:34     ` Jeff Moyer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180117073652.GA27389@lst.de \
    --to=hch@lst.de \
    --cc=avi@scylladb.com \
    --cc=jmoyer@redhat.com \
    --cc=linux-aio@kvack.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.