Add UAPI definitions for the general notification queue, including the
following pieces:

 (*) struct watch_notification.

     This is the metadata header for notification messages.  It includes a
     type and subtype that indicate the source of the message
     (eg. WATCH_TYPE_MOUNT_NOTIFY) and the kind of the message
     (eg. NOTIFY_MOUNT_NEW_MOUNT).

     The header also contains an information field that conveys the
     following information:

        - WATCH_INFO_LENGTH.  The size of the entry (entries are variable
          length).

        - WATCH_INFO_ID.  The watch ID specified when the watchpoint was
          set.

        - WATCH_INFO_TYPE_INFO.  (Sub)type-specific information.

        - WATCH_INFO_FLAG_*.  Flag bits overlain on the type-specific
          information.  For use by the type.

     All the information in the header can be used in filtering messages at
     the point of writing into the buffer.

Signed-off-by: David Howells <dhowe...@redhat.com>
---

 include/uapi/linux/watch_queue.h |   55 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 include/uapi/linux/watch_queue.h

diff --git a/include/uapi/linux/watch_queue.h b/include/uapi/linux/watch_queue.h
new file mode 100644
index 000000000000..d90c5488d666
--- /dev/null
+++ b/include/uapi/linux/watch_queue.h
@@ -0,0 +1,55 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+#ifndef _UAPI_LINUX_WATCH_QUEUE_H
+#define _UAPI_LINUX_WATCH_QUEUE_H
+
+#include <linux/types.h>
+
+enum watch_notification_type {
+       WATCH_TYPE_META         = 0,    /* Special record */
+       WATCH_TYPE___NR         = 1
+};
+
+enum watch_meta_notification_subtype {
+       WATCH_META_REMOVAL_NOTIFICATION = 0,    /* Watched object was removed */
+       WATCH_META_LOSS_NOTIFICATION    = 1,    /* Data loss occurred */
+};
+
+/*
+ * Notification record header.  This is aligned to 64-bits so that subclasses
+ * can contain __u64 fields.
+ */
+struct watch_notification {
+       __u32                   type:24;        /* enum watch_notification_type 
*/
+       __u32                   subtype:8;      /* Type-specific subtype 
(filterable) */
+       __u32                   info;
+#define WATCH_INFO_LENGTH      0x0000007f      /* Length of record / 
sizeof(watch_notification) */
+#define WATCH_INFO_LENGTH__SHIFT 0
+#define WATCH_INFO_ID          0x0000ff00      /* ID of watchpoint, if 
type-appropriate */
+#define WATCH_INFO_ID__SHIFT   8
+#define WATCH_INFO_TYPE_INFO   0xffff0000      /* Type-specific info */
+#define WATCH_INFO_TYPE_INFO__SHIFT 16
+#define WATCH_INFO_FLAG_0      0x00010000      /* Type-specific info, flag bit 
0 */
+#define WATCH_INFO_FLAG_1      0x00020000      /* ... */
+#define WATCH_INFO_FLAG_2      0x00040000
+#define WATCH_INFO_FLAG_3      0x00080000
+#define WATCH_INFO_FLAG_4      0x00100000
+#define WATCH_INFO_FLAG_5      0x00200000
+#define WATCH_INFO_FLAG_6      0x00400000
+#define WATCH_INFO_FLAG_7      0x00800000
+};
+
+
+/*
+ * Extended watch removal notification.  This is used optionally if the type
+ * wants to indicate an identifier for the object being watched, if there is
+ * such.  This can be distinguished by the length.
+ *
+ * type -> WATCH_TYPE_META
+ * subtype -> WATCH_META_REMOVAL_NOTIFICATION
+ */
+struct watch_notification_removal {
+       struct watch_notification watch;
+       __u64   id;             /* Type-dependent identifier */
+};
+
+#endif /* _UAPI_LINUX_WATCH_QUEUE_H */

Reply via email to