From: David Howells <dhowells@redhat.com> To: torvalds@linux-foundation.org Cc: dhowells@redhat.com, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Casey Schaufler <casey@schaufler-ca.com>, Stephen Smalley <sds@tycho.nsa.gov>, nicolas.dichtel@6wind.com, raven@themaw.net, Christian Brauner <christian@brauner.io>, dhowells@redhat.com, keyrings@vger.kernel.org, linux-usb@vger.kernel.org, linux-block@vger.kernel.org, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications [ver #3] Date: Wed, 15 Jan 2020 13:31:47 +0000 [thread overview] Message-ID: <157909510770.20155.5306257642437087029.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <157909503552.20155.3030058841911628518.stgit@warthog.procyon.org.uk> Allow a buffer to be marked such that read() must return the entire buffer in one go or return ENOBUFS. Multiple buffers can be amalgamated into a single read, but a short read will occur if the next "whole" buffer won't fit. This is useful for watch queue notifications to make sure we don't split a notification across multiple reads, especially given that we need to fabricate an overrun record under some circumstances - and that isn't in the buffers. Signed-off-by: David Howells <dhowells@redhat.com> --- fs/pipe.c | 8 +++++++- include/linux/pipe_fs_i.h | 1 + kernel/watch_queue.c | 2 +- samples/watch_queue/watch_test.c | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 5352c07be47f..05d0b02ed08d 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -317,8 +317,14 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) size_t written; int error; - if (chars > total_len) + if (chars > total_len) { + if (buf->flags & PIPE_BUF_FLAG_WHOLE) { + if (ret == 0) + ret = -ENOBUFS; + break; + } chars = total_len; + } error = pipe_buf_confirm(pipe, buf); if (error) { diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index cef70acd99bf..f86ae087aaca 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -8,6 +8,7 @@ #define PIPE_BUF_FLAG_ATOMIC 0x02 /* was atomically mapped */ #define PIPE_BUF_FLAG_GIFT 0x04 /* page is a gift */ #define PIPE_BUF_FLAG_PACKET 0x08 /* read() as a packet */ +#define PIPE_BUF_FLAG_WHOLE 0x10 /* read() must return entire buffer or error */ /** * struct pipe_buffer - a linux kernel pipe buffer diff --git a/kernel/watch_queue.c b/kernel/watch_queue.c index e2e3344a2586..a01f2fed0983 100644 --- a/kernel/watch_queue.c +++ b/kernel/watch_queue.c @@ -115,7 +115,7 @@ static bool post_one_notification(struct watch_queue *wqueue, buf->ops = &watch_queue_pipe_buf_ops; buf->offset = offset; buf->len = len; - buf->flags = 0; + buf->flags = PIPE_BUF_FLAG_WHOLE; pipe->head = head + 1; if (!test_and_clear_bit(note, wqueue->notes_bitmap)) { diff --git a/samples/watch_queue/watch_test.c b/samples/watch_queue/watch_test.c index 9bf60abf5c7e..924e13a49c37 100644 --- a/samples/watch_queue/watch_test.c +++ b/samples/watch_queue/watch_test.c @@ -63,7 +63,7 @@ static void saw_key_change(struct watch_notification *n, size_t len) */ static void consumer(int fd) { - unsigned char buffer[4096], *p, *end; + unsigned char buffer[433], *p, *end; union { struct watch_notification n; unsigned char buf1[128];
WARNING: multiple messages have this Message-ID
From: David Howells <dhowells@redhat.com> To: torvalds@linux-foundation.org Cc: dhowells@redhat.com, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Casey Schaufler <casey@schaufler-ca.com>, Stephen Smalley <sds@tycho.nsa.gov>, nicolas.dichtel@6wind.com, raven@themaw.net, Christian Brauner <christian@brauner.io>dhowells@redhat.com, keyrings@vger.kernel.org, linux-usb@vger.kernel.org, linux-block@vger.kernel.org, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications [ver #3] Date: Wed, 15 Jan 2020 13:31:47 +0000 [thread overview] Message-ID: <157909510770.20155.5306257642437087029.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <157909503552.20155.3030058841911628518.stgit@warthog.procyon.org.uk> Allow a buffer to be marked such that read() must return the entire buffer in one go or return ENOBUFS. Multiple buffers can be amalgamated into a single read, but a short read will occur if the next "whole" buffer won't fit. This is useful for watch queue notifications to make sure we don't split a notification across multiple reads, especially given that we need to fabricate an overrun record under some circumstances - and that isn't in the buffers. Signed-off-by: David Howells <dhowells@redhat.com> --- fs/pipe.c | 8 +++++++- include/linux/pipe_fs_i.h | 1 + kernel/watch_queue.c | 2 +- samples/watch_queue/watch_test.c | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 5352c07be47f..05d0b02ed08d 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -317,8 +317,14 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) size_t written; int error; - if (chars > total_len) + if (chars > total_len) { + if (buf->flags & PIPE_BUF_FLAG_WHOLE) { + if (ret = 0) + ret = -ENOBUFS; + break; + } chars = total_len; + } error = pipe_buf_confirm(pipe, buf); if (error) { diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index cef70acd99bf..f86ae087aaca 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -8,6 +8,7 @@ #define PIPE_BUF_FLAG_ATOMIC 0x02 /* was atomically mapped */ #define PIPE_BUF_FLAG_GIFT 0x04 /* page is a gift */ #define PIPE_BUF_FLAG_PACKET 0x08 /* read() as a packet */ +#define PIPE_BUF_FLAG_WHOLE 0x10 /* read() must return entire buffer or error */ /** * struct pipe_buffer - a linux kernel pipe buffer diff --git a/kernel/watch_queue.c b/kernel/watch_queue.c index e2e3344a2586..a01f2fed0983 100644 --- a/kernel/watch_queue.c +++ b/kernel/watch_queue.c @@ -115,7 +115,7 @@ static bool post_one_notification(struct watch_queue *wqueue, buf->ops = &watch_queue_pipe_buf_ops; buf->offset = offset; buf->len = len; - buf->flags = 0; + buf->flags = PIPE_BUF_FLAG_WHOLE; pipe->head = head + 1; if (!test_and_clear_bit(note, wqueue->notes_bitmap)) { diff --git a/samples/watch_queue/watch_test.c b/samples/watch_queue/watch_test.c index 9bf60abf5c7e..924e13a49c37 100644 --- a/samples/watch_queue/watch_test.c +++ b/samples/watch_queue/watch_test.c @@ -63,7 +63,7 @@ static void saw_key_change(struct watch_notification *n, size_t len) */ static void consumer(int fd) { - unsigned char buffer[4096], *p, *end; + unsigned char buffer[433], *p, *end; union { struct watch_notification n; unsigned char buf1[128];
WARNING: multiple messages have this Message-ID
From: David Howells <dhowells@redhat.com> To: torvalds@linux-foundation.org Cc: dhowells@redhat.com, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Casey Schaufler <casey@schaufler-ca.com>, Stephen Smalley <sds@tycho.nsa.gov>, nicolas.dichtel@6wind.com, raven@themaw.net, Christian Brauner <christian@brauner.io>dhowells@redhat.com, keyrings@vger.kernel.org, linux-usb@vger.kernel.org, linux-block@vger.kernel.org, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.orglinux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications [ver #3] Date: Wed, 15 Jan 2020 13:31:47 +0000 [thread overview] Message-ID: <157909510770.20155.5306257642437087029.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <157909503552.20155.3030058841911628518.stgit@warthog.procyon.org.uk> Allow a buffer to be marked such that read() must return the entire buffer in one go or return ENOBUFS. Multiple buffers can be amalgamated into a single read, but a short read will occur if the next "whole" buffer won't fit. This is useful for watch queue notifications to make sure we don't split a notification across multiple reads, especially given that we need to fabricate an overrun record under some circumstances - and that isn't in the buffers. Signed-off-by: David Howells <dhowells@redhat.com> --- fs/pipe.c | 8 +++++++- include/linux/pipe_fs_i.h | 1 + kernel/watch_queue.c | 2 +- samples/watch_queue/watch_test.c | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 5352c07be47f..05d0b02ed08d 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -317,8 +317,14 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) size_t written; int error; - if (chars > total_len) + if (chars > total_len) { + if (buf->flags & PIPE_BUF_FLAG_WHOLE) { + if (ret == 0) + ret = -ENOBUFS; + break; + } chars = total_len; + } error = pipe_buf_confirm(pipe, buf); if (error) { diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index cef70acd99bf..f86ae087aaca 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h @@ -8,6 +8,7 @@ #define PIPE_BUF_FLAG_ATOMIC 0x02 /* was atomically mapped */ #define PIPE_BUF_FLAG_GIFT 0x04 /* page is a gift */ #define PIPE_BUF_FLAG_PACKET 0x08 /* read() as a packet */ +#define PIPE_BUF_FLAG_WHOLE 0x10 /* read() must return entire buffer or error */ /** * struct pipe_buffer - a linux kernel pipe buffer diff --git a/kernel/watch_queue.c b/kernel/watch_queue.c index e2e3344a2586..a01f2fed0983 100644 --- a/kernel/watch_queue.c +++ b/kernel/watch_queue.c @@ -115,7 +115,7 @@ static bool post_one_notification(struct watch_queue *wqueue, buf->ops = &watch_queue_pipe_buf_ops; buf->offset = offset; buf->len = len; - buf->flags = 0; + buf->flags = PIPE_BUF_FLAG_WHOLE; pipe->head = head + 1; if (!test_and_clear_bit(note, wqueue->notes_bitmap)) { diff --git a/samples/watch_queue/watch_test.c b/samples/watch_queue/watch_test.c index 9bf60abf5c7e..924e13a49c37 100644 --- a/samples/watch_queue/watch_test.c +++ b/samples/watch_queue/watch_test.c @@ -63,7 +63,7 @@ static void saw_key_change(struct watch_notification *n, size_t len) */ static void consumer(int fd) { - unsigned char buffer[4096], *p, *end; + unsigned char buffer[433], *p, *end; union { struct watch_notification n; unsigned char buf1[128];
next prev parent reply other threads:[~2020-01-15 13:32 UTC|newest] Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-15 13:30 [RFC PATCH 00/14] pipe: Keyrings, Block and USB " David Howells 2020-01-15 13:30 ` David Howells 2020-01-15 13:30 ` David Howells 2020-01-15 13:30 ` [RFC PATCH 01/14] uapi: General notification queue definitions " David Howells 2020-01-15 13:30 ` David Howells 2020-01-15 13:30 ` David Howells 2020-01-15 13:30 ` [RFC PATCH 02/14] security: Add hooks to rule on setting a watch " David Howells 2020-01-15 13:30 ` David Howells 2020-01-15 13:30 ` David Howells 2020-01-15 13:31 ` [RFC PATCH 03/14] security: Add a hook for the point of notification insertion " David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` [RFC PATCH 04/14] pipe: Add O_NOTIFICATION_PIPE " David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` [RFC PATCH 05/14] pipe: Add general notification queue support " David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` [RFC PATCH 06/14] keys: Add a notification facility " David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` [RFC PATCH 07/14] Add sample notification program " David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` David Howells 2020-01-26 15:47 ` Guenter Roeck 2020-01-26 15:47 ` Guenter Roeck 2020-01-26 15:47 ` Guenter Roeck 2020-01-15 13:31 ` David Howells [this message] 2020-01-15 13:31 ` [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications " David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` [RFC PATCH 09/14] pipe: Add notification lossage handling " David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:31 ` David Howells 2020-01-15 13:32 ` [RFC PATCH 10/14] Add a general, global device notification watch list " David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` [RFC PATCH 11/14] block: Add block layer notifications " David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` [RFC PATCH 12/14] usb: Add USB subsystem " David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` [RFC PATCH 13/14] selinux: Implement the watch_key security hook " David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` [RFC PATCH 14/14] smack: Implement the watch_key and post_notification hooks " David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 13:32 ` David Howells 2020-01-15 20:10 ` [RFC PATCH 00/14] pipe: Keyrings, Block and USB notifications " Linus Torvalds 2020-01-15 20:10 ` Linus Torvalds 2020-02-11 0:56 ` Andres Freund 2020-02-11 0:56 ` Andres Freund 2020-01-15 21:07 ` David Howells 2020-01-15 21:07 ` David Howells -- strict thread matches above, loose matches on Subject: below -- 2019-11-07 13:35 [RFC PATCH 00/14] pipe: Keyrings, Block and USB notifications [ver #2] David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` [RFC PATCH 01/14] uapi: General notification queue definitions " David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` [RFC PATCH 02/14] security: Add hooks to rule on setting a watch " David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` [RFC PATCH 03/14] security: Add a hook for the point of notification insertion " David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` [RFC PATCH 04/14] pipe: Add O_NOTIFICATION_PIPE " David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 13:35 ` David Howells 2019-11-07 18:16 ` Andy Lutomirski 2019-11-07 18:16 ` Andy Lutomirski 2019-11-07 18:48 ` David Howells 2019-11-08 5:06 ` Andy Lutomirski 2019-11-08 5:06 ` Andy Lutomirski 2019-11-08 6:42 ` David Howells 2019-11-07 13:36 ` [RFC PATCH 05/14] pipe: Add general notification queue support " David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` [RFC PATCH 06/14] keys: Add a notification facility " David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` [RFC PATCH 07/14] Add sample notification program " David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications " David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 18:15 ` Andy Lutomirski 2019-11-07 18:15 ` [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications [ver #2 Andy Lutomirski 2019-11-07 18:23 ` [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications [ver #2] David Howells 2019-11-07 18:23 ` [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications [ver #2 David Howells 2019-11-07 13:36 ` [RFC PATCH 09/14] pipe: Add notification lossage handling [ver #2] David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` [RFC PATCH 10/14] Add a general, global device notification watch list " David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:36 ` David Howells 2019-11-07 13:37 ` [RFC PATCH 11/14] block: Add block layer notifications " David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 13:37 ` [RFC PATCH 12/14] usb: Add USB subsystem " David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 13:37 ` [RFC PATCH 13/14] selinux: Implement the watch_key security hook " David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 13:37 ` [RFC PATCH 14/14] smack: Implement the watch_key and post_notification hooks " David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 13:37 ` David Howells 2019-11-07 17:16 ` [RFC PATCH 05/14] pipe: Add general notification queue support " David Howells
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=157909510770.20155.5306257642437087029.stgit@warthog.procyon.org.uk \ --to=dhowells@redhat.com \ --cc=casey@schaufler-ca.com \ --cc=christian@brauner.io \ --cc=gregkh@linuxfoundation.org \ --cc=keyrings@vger.kernel.org \ --cc=linux-api@vger.kernel.org \ --cc=linux-block@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-security-module@vger.kernel.org \ --cc=linux-usb@vger.kernel.org \ --cc=nicolas.dichtel@6wind.com \ --cc=raven@themaw.net \ --cc=sds@tycho.nsa.gov \ --cc=torvalds@linux-foundation.org \ --subject='Re: [RFC PATCH 08/14] pipe: Allow buffers to be marked read-whole-or-error for notifications [ver #3]' \ /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
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.