pipe: Add general notification queue support
Make it possible to have a general notification queue built on top of a
standard pipe. Notifications are 'spliced' into the pipe and then read
out. splice(), vmsplice() and sendfile() are forbidden on pipes used for
notifications as post_one_notification() cannot take pipe->mutex. This
means that notifications could be posted in between individual pipe
buffers, making iov_iter_revert() difficult to effect.
The way the notification queue is used is:
(1) An application opens a pipe with a special flag and indicates the
number of messages it wishes to be able to queue at once (this can
only be set once):
pipe2(fds, O_NOTIFICATION_PIPE);
ioctl(fds[0], IOC_WATCH_QUEUE_SET_SIZE, queue_depth);
(2) The application then uses poll() and read() as normal to extract data
from the pipe. read() will return multiple notifications if the
buffer is big enough, but it will not split a notification across
buffers - rather it will return a short read or EMSGSIZE.
Notification messages include a length in the header so that the
caller can split them up.
Each message has a header that describes it:
struct watch_notification {
__u32 type:24;
__u32 subtype:8;
__u32 info;
};
The type indicates the source (eg. mount tree changes, superblock events,
keyring changes, block layer events) and the subtype indicates the event
type (eg. mount, unmount; EIO, EDQUOT; link, unlink). The info field
indicates a number of things, including the entry length, an ID assigned to
a watchpoint contributing to this buffer and type-specific flags.
Supplementary data, such as the key ID that generated an event, can be
attached in additional slots. The maximum message size is 127 bytes.
Messages may not be padded or aligned, so there is no guarantee, for
example, that the notification type will be on a 4-byte bounary.
Signed-off-by:
David Howells <dhowells@redhat.com>
-
mentioned in commit 2ed147f0
-
mentioned in commit 4edc0760
-
mentioned in commit d729d4e9
-
mentioned in commit 880acbb7
-
mentioned in commit e2b52ca4
-
mentioned in commit 2039900a
-
mentioned in commit 06ab8444
-
mentioned in commit 24d26813
-
mentioned in commit ec03510e
-
mentioned in commit 648895da
-
mentioned in commit 1b09f28f
-
mentioned in commit ccd03c30
-
mentioned in commit d453d0e5
-
mentioned in commit b022b6a0
-
mentioned in commit 8275b669
-
mentioned in commit eb38c2e9
-
mentioned in commit ffb8fd39
-
mentioned in commit 82ff8a22
-
mentioned in commit 7169f601
-
mentioned in commit 4913daec
-
mentioned in commit 7fa8999b
-
mentioned in commit 45a84f04
-
mentioned in commit 093610f2
-
mentioned in commit c9c01dd3
-
mentioned in commit 68e51bdb
-
mentioned in commit b87a1229
-
mentioned in commit de487952