105 lines · c
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */2#ifndef _UAPI_LINUX_WATCH_QUEUE_H3#define _UAPI_LINUX_WATCH_QUEUE_H4 5#include <linux/types.h>6#include <linux/fcntl.h>7#include <linux/ioctl.h>8 9#define O_NOTIFICATION_PIPE O_EXCL /* Parameter to pipe2() selecting notification pipe */10 11#define IOC_WATCH_QUEUE_SET_SIZE _IO('W', 0x60) /* Set the size in pages */12#define IOC_WATCH_QUEUE_SET_FILTER _IO('W', 0x61) /* Set the filter */13 14enum watch_notification_type {15 WATCH_TYPE_META = 0, /* Special record */16 WATCH_TYPE_KEY_NOTIFY = 1, /* Key change event notification */17 WATCH_TYPE__NR = 218};19 20enum watch_meta_notification_subtype {21 WATCH_META_REMOVAL_NOTIFICATION = 0, /* Watched object was removed */22 WATCH_META_LOSS_NOTIFICATION = 1, /* Data loss occurred */23};24 25/*26 * Notification record header. This is aligned to 64-bits so that subclasses27 * can contain __u64 fields.28 */29struct watch_notification {30 __u32 type:24; /* enum watch_notification_type */31 __u32 subtype:8; /* Type-specific subtype (filterable) */32 __u32 info;33#define WATCH_INFO_LENGTH 0x0000007f /* Length of record */34#define WATCH_INFO_LENGTH__SHIFT 035#define WATCH_INFO_ID 0x0000ff00 /* ID of watchpoint */36#define WATCH_INFO_ID__SHIFT 837#define WATCH_INFO_TYPE_INFO 0xffff0000 /* Type-specific info */38#define WATCH_INFO_TYPE_INFO__SHIFT 1639#define WATCH_INFO_FLAG_0 0x00010000 /* Type-specific info, flag bit 0 */40#define WATCH_INFO_FLAG_1 0x00020000 /* ... */41#define WATCH_INFO_FLAG_2 0x0004000042#define WATCH_INFO_FLAG_3 0x0008000043#define WATCH_INFO_FLAG_4 0x0010000044#define WATCH_INFO_FLAG_5 0x0020000045#define WATCH_INFO_FLAG_6 0x0040000046#define WATCH_INFO_FLAG_7 0x0080000047};48 49/*50 * Notification filtering rules (IOC_WATCH_QUEUE_SET_FILTER).51 */52struct watch_notification_type_filter {53 __u32 type; /* Type to apply filter to */54 __u32 info_filter; /* Filter on watch_notification::info */55 __u32 info_mask; /* Mask of relevant bits in info_filter */56 __u32 subtype_filter[8]; /* Bitmask of subtypes to filter on */57};58 59struct watch_notification_filter {60 __u32 nr_filters; /* Number of filters */61 __u32 __reserved; /* Must be 0 */62 struct watch_notification_type_filter filters[];63};64 65 66/*67 * Extended watch removal notification. This is used optionally if the type68 * wants to indicate an identifier for the object being watched, if there is69 * such. This can be distinguished by the length.70 *71 * type -> WATCH_TYPE_META72 * subtype -> WATCH_META_REMOVAL_NOTIFICATION73 */74struct watch_notification_removal {75 struct watch_notification watch;76 __u64 id; /* Type-dependent identifier */77};78 79/*80 * Type of key/keyring change notification.81 */82enum key_notification_subtype {83 NOTIFY_KEY_INSTANTIATED = 0, /* Key was instantiated (aux is error code) */84 NOTIFY_KEY_UPDATED = 1, /* Key was updated */85 NOTIFY_KEY_LINKED = 2, /* Key (aux) was added to watched keyring */86 NOTIFY_KEY_UNLINKED = 3, /* Key (aux) was removed from watched keyring */87 NOTIFY_KEY_CLEARED = 4, /* Keyring was cleared */88 NOTIFY_KEY_REVOKED = 5, /* Key was revoked */89 NOTIFY_KEY_INVALIDATED = 6, /* Key was invalidated */90 NOTIFY_KEY_SETATTR = 7, /* Key's attributes got changed */91};92 93/*94 * Key/keyring notification record.95 * - watch.type = WATCH_TYPE_KEY_NOTIFY96 * - watch.subtype = enum key_notification_type97 */98struct key_notification {99 struct watch_notification watch;100 __u32 key_id; /* The key/keyring affected */101 __u32 aux; /* Per-type auxiliary data */102};103 104#endif /* _UAPI_LINUX_WATCH_QUEUE_H */105