All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] Mount notifications
@ 2020-07-24 13:11 David Howells
  2020-07-24 13:11 ` [PATCH 1/4] watch_queue: Make watch_sizeof() check record size David Howells
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: David Howells @ 2020-07-24 13:11 UTC (permalink / raw)
  To: viro
  Cc: linux-security-module, Casey Schaufler, James Morris,
	Stephen Smalley, Miklos Szeredi, dhowells, torvalds, casey, sds,
	nicolas.dichtel, raven, christian, jlayton, kzak, mszeredi,
	linux-api, linux-fsdevel, linux-security-module, linux-kernel


Here's a set of patches to add notifications for mount topology events,
such as mounting, unmounting, mount expiry, mount reconfiguration.

An LSM hook is included to an LSM to rule on whether or not a mount watch
may be set on a particular path.

Why do we want mount notifications?  Whilst /proc/mounts can be polled, it
only tells you that something changed in your namespace.  To find out, you
have to trawl /proc/mounts or similar to work out what changed in the mount
object attributes and mount topology.  I'm told that the proc file holding
the namespace_sem is a point of contention, especially as the process of
generating the text descriptions of the mounts/superblocks can be quite
involved.

The notification generated here directly indicates the mounts involved in
any particular event and gives an idea of what the change was.

This is combined with a new fsinfo() system call that allows, amongst other
things, the ability to retrieve in one go an { id, change_counter } tuple
from all the children of a specified mount, allowing buffer overruns to be
dealt with quickly.

This is of use to systemd to improve efficiency:

	https://lore.kernel.org/linux-fsdevel/20200227151421.3u74ijhqt6ekbiss@ws.net.home/

And it's not just Red Hat that's potentially interested in this:

	https://lore.kernel.org/linux-fsdevel/293c9bd3-f530-d75e-c353-ddeabac27cf6@6wind.com/

The kernel patches can also be found here:

	https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/log/?h=notifications-pipe-core

David
---
David Howells (4):
      watch_queue: Make watch_sizeof() check record size
      watch_queue: Add security hooks to rule on setting mount watches
      watch_queue: Implement mount topology and attribute change notifications
      watch_queue: sample: Display mount tree change notifications


 Documentation/watch_queue.rst               |  12 +-
 arch/alpha/kernel/syscalls/syscall.tbl      |   1 +
 arch/arm/tools/syscall.tbl                  |   1 +
 arch/arm64/include/asm/unistd32.h           |   2 +
 arch/ia64/kernel/syscalls/syscall.tbl       |   1 +
 arch/m68k/kernel/syscalls/syscall.tbl       |   1 +
 arch/microblaze/kernel/syscalls/syscall.tbl |   1 +
 arch/mips/kernel/syscalls/syscall_n32.tbl   |   1 +
 arch/mips/kernel/syscalls/syscall_n64.tbl   |   1 +
 arch/mips/kernel/syscalls/syscall_o32.tbl   |   1 +
 arch/parisc/kernel/syscalls/syscall.tbl     |   1 +
 arch/powerpc/kernel/syscalls/syscall.tbl    |   1 +
 arch/s390/kernel/syscalls/syscall.tbl       |   1 +
 arch/sh/kernel/syscalls/syscall.tbl         |   1 +
 arch/sparc/kernel/syscalls/syscall.tbl      |   1 +
 arch/x86/entry/syscalls/syscall_32.tbl      |   1 +
 arch/x86/entry/syscalls/syscall_64.tbl      |   1 +
 arch/xtensa/kernel/syscalls/syscall.tbl     |   1 +
 fs/Kconfig                                  |   9 +
 fs/Makefile                                 |   1 +
 fs/mount.h                                  |  21 ++
 fs/mount_notify.c                           | 228 ++++++++++++++++++++
 fs/namespace.c                              |  22 ++
 include/linux/dcache.h                      |   1 +
 include/linux/lsm_hook_defs.h               |   3 +
 include/linux/lsm_hooks.h                   |   6 +
 include/linux/security.h                    |   8 +
 include/linux/syscalls.h                    |   2 +
 include/uapi/asm-generic/unistd.h           |   4 +-
 include/uapi/linux/watch_queue.h            |  36 +++-
 kernel/sys_ni.c                             |   3 +
 samples/watch_queue/watch_test.c            |  44 +++-
 security/security.c                         |   7 +
 33 files changed, 421 insertions(+), 4 deletions(-)
 create mode 100644 fs/mount_notify.c



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/4] watch_queue: Make watch_sizeof() check record size
  2020-07-24 13:11 [PATCH 0/4] Mount notifications David Howells
@ 2020-07-24 13:11 ` David Howells
  2020-07-24 13:11 ` [PATCH 2/4] watch_queue: Add security hooks to rule on setting mount watches David Howells
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: David Howells @ 2020-07-24 13:11 UTC (permalink / raw)
  To: viro
  Cc: Miklos Szeredi, dhowells, torvalds, casey, sds, nicolas.dichtel,
	raven, christian, jlayton, kzak, mszeredi, linux-api,
	linux-fsdevel, linux-security-module, linux-kernel

Make watch_sizeof() give a build error if the size of the struct won't fit
into the size field in the header.

Reported-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
---

 include/linux/watch_queue.h |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/include/linux/watch_queue.h b/include/linux/watch_queue.h
index 5e08db2adc31..38e04c7a7951 100644
--- a/include/linux/watch_queue.h
+++ b/include/linux/watch_queue.h
@@ -120,7 +120,12 @@ static inline void remove_watch_list(struct watch_list *wlist, u64 id)
  * watch_sizeof - Calculate the information part of the size of a watch record,
  * given the structure size.
  */
-#define watch_sizeof(STRUCT) (sizeof(STRUCT) << WATCH_INFO_LENGTH__SHIFT)
+#define watch_sizeof(STRUCT) \
+	({								\
+		size_t max = WATCH_INFO_LENGTH >> WATCH_INFO_LENGTH__SHIFT; \
+		BUILD_BUG_ON(sizeof(STRUCT) > max);			\
+		sizeof(STRUCT) << WATCH_INFO_LENGTH__SHIFT;		\
+	})
 
 #endif
 



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/4] watch_queue: Add security hooks to rule on setting mount watches
  2020-07-24 13:11 [PATCH 0/4] Mount notifications David Howells
  2020-07-24 13:11 ` [PATCH 1/4] watch_queue: Make watch_sizeof() check record size David Howells
@ 2020-07-24 13:11 ` David Howells
  2020-07-24 13:11 ` [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications David Howells
  2020-07-24 13:11 ` [PATCH 4/4] watch_queue: sample: Display mount tree " David Howells
  3 siblings, 0 replies; 10+ messages in thread
From: David Howells @ 2020-07-24 13:11 UTC (permalink / raw)
  To: viro
  Cc: James Morris, Casey Schaufler, Stephen Smalley,
	linux-security-module, dhowells, torvalds, casey, sds,
	nicolas.dichtel, raven, christian, jlayton, kzak, mszeredi,
	linux-api, linux-fsdevel, linux-security-module, linux-kernel

Add a security hook that will allow an LSM to rule on whether or not a
watch may be set on a mount.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: James Morris <jamorris@linux.microsoft.com>
cc: Casey Schaufler <casey@schaufler-ca.com>
cc: Stephen Smalley <sds@tycho.nsa.gov>
cc: linux-security-module@vger.kernel.org
---

 include/linux/lsm_hook_defs.h |    3 +++
 include/linux/lsm_hooks.h     |    6 ++++++
 include/linux/security.h      |    8 ++++++++
 security/security.c           |    7 +++++++
 4 files changed, 24 insertions(+)

diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h
index af998f93d256..f6eaf8bd617b 100644
--- a/include/linux/lsm_hook_defs.h
+++ b/include/linux/lsm_hook_defs.h
@@ -264,6 +264,9 @@ LSM_HOOK(int, 0, post_notification, const struct cred *w_cred,
 #if defined(CONFIG_SECURITY) && defined(CONFIG_KEY_NOTIFICATIONS)
 LSM_HOOK(int, 0, watch_key, struct key *key)
 #endif /* CONFIG_SECURITY && CONFIG_KEY_NOTIFICATIONS */
+#ifdef CONFIG_MOUNT_NOTIFICATIONS
+LSM_HOOK(int, 0, watch_mount, struct watch *watch, struct path *path)
+#endif
 
 #ifdef CONFIG_SECURITY_NETWORK
 LSM_HOOK(int, 0, unix_stream_connect, struct sock *sock, struct sock *other,
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
index 95b7c1d32062..56275145b91d 100644
--- a/include/linux/lsm_hooks.h
+++ b/include/linux/lsm_hooks.h
@@ -1468,6 +1468,12 @@
  *	from a key or keyring.
  *	@key: The key to watch.
  *
+ * @watch_mount:
+ *	Check to see if a process is allowed to watch for mount topology change
+ *	notifications on a mount subtree.
+ *	@watch: The watch object
+ *	@path: The root of the subtree to watch.
+ *
  * Security hooks for using the eBPF maps and programs functionalities through
  * eBPF syscalls.
  *
diff --git a/include/linux/security.h b/include/linux/security.h
index 0a0a03b36a3b..318fdfe7f4d6 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -1314,6 +1314,14 @@ static inline int security_watch_key(struct key *key)
 	return 0;
 }
 #endif
+#if defined(CONFIG_SECURITY) && defined(CONFIG_MOUNT_NOTIFICATIONS)
+int security_watch_mount(struct watch *watch, struct path *path);
+#else
+static inline int security_watch_mount(struct watch *watch, struct path *path)
+{
+	return 0;
+}
+#endif
 
 #ifdef CONFIG_SECURITY_NETWORK
 
diff --git a/security/security.c b/security/security.c
index 70a7ad357bc6..3cdf5039f727 100644
--- a/security/security.c
+++ b/security/security.c
@@ -2067,6 +2067,13 @@ int security_watch_key(struct key *key)
 }
 #endif
 
+#ifdef CONFIG_MOUNT_NOTIFICATIONS
+int security_watch_mount(struct watch *watch, struct path *path)
+{
+	return call_int_hook(watch_mount, 0, watch, path);
+}
+#endif
+
 #ifdef CONFIG_SECURITY_NETWORK
 
 int security_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk)



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications
  2020-07-24 13:11 [PATCH 0/4] Mount notifications David Howells
  2020-07-24 13:11 ` [PATCH 1/4] watch_queue: Make watch_sizeof() check record size David Howells
  2020-07-24 13:11 ` [PATCH 2/4] watch_queue: Add security hooks to rule on setting mount watches David Howells
@ 2020-07-24 13:11 ` David Howells
  2020-07-24 19:14   ` Linus Torvalds
                     ` (2 more replies)
  2020-07-24 13:11 ` [PATCH 4/4] watch_queue: sample: Display mount tree " David Howells
  3 siblings, 3 replies; 10+ messages in thread
From: David Howells @ 2020-07-24 13:11 UTC (permalink / raw)
  To: viro
  Cc: dhowells, torvalds, casey, sds, nicolas.dichtel, raven,
	christian, jlayton, kzak, mszeredi, linux-api, linux-fsdevel,
	linux-security-module, linux-kernel

Add a mount notification facility whereby notifications about changes in
mount topology and configuration can be received.  Note that this only
covers vfsmount topology changes and not superblock events.  A separate
facility will be added for that.

Every mount is given a change counter than counts the number of topological
rearrangements in which it is involved and the number of attribute changes
it undergoes.  This allows notification loss to be dealt with.  Later
patches will provide a way to quickly retrieve this value, along with
information about topology and parameters for the superblock.

Firstly, a watch queue needs to be created:

	pipe2(fds, O_NOTIFICATION_PIPE);
	ioctl(fds[1], IOC_WATCH_QUEUE_SET_SIZE, 256);

then a notification can be set up to report notifications via that queue:

	struct watch_notification_filter filter = {
		.nr_filters = 1,
		.filters = {
			[0] = {
				.type = WATCH_TYPE_MOUNT_NOTIFY,
				.subtype_filter[0] = UINT_MAX,
			},
		},
	};
	ioctl(fds[1], IOC_WATCH_QUEUE_SET_FILTER, &filter);
	watch_mount(AT_FDCWD, "/", 0, fds[1], 0x02);

In this case, it would let me monitor the mount topology subtree rooted at
"/" for events.  Mount notifications propagate up the tree towards the
root, so a watch will catch all of the events happening in the subtree
rooted at the watch.

After setting the watch, records will be placed into the queue when, for
example, as superblock switches between read-write and read-only.  Records
are of the following format:

	struct mount_notification {
		struct watch_notification watch;
		__u32	triggered_on;
		__u32	auxiliary_mount;
		__u32	topology_changes;
		__u32	attr_changes;
		__u32	aux_topology_changes;
	} *n;

Where:

	n->watch.type will be WATCH_TYPE_MOUNT_NOTIFY.

	n->watch.subtype will indicate the type of event, such as
	NOTIFY_MOUNT_NEW_MOUNT.

	n->watch.info & WATCH_INFO_LENGTH will indicate the length of the
	record.

	n->watch.info & WATCH_INFO_ID will be the fifth argument to
	watch_mount(), shifted.

	n->watch.info & NOTIFY_MOUNT_IN_SUBTREE if true indicates that the
	notification was generated in the mount subtree rooted at the
	watch, and not actually in the watch itself.

	n->watch.info & NOTIFY_MOUNT_IS_RECURSIVE if true indicates that
	the notification was generated by an event (eg. SETATTR) that was
	applied recursively.  The notification is only generated for the
	object that initially triggered it.

	n->watch.info & NOTIFY_MOUNT_IS_NOW_RO will be used for
	NOTIFY_MOUNT_READONLY, being set if the mount becomes R/O, and
	being cleared otherwise, and for NOTIFY_MOUNT_NEW_MOUNT, being set
	if the new mount is readonly.

	n->watch.info & NOTIFY_MOUNT_IS_SUBMOUNT if true indicates that the
	NOTIFY_MOUNT_NEW_MOUNT notification is in response to a mount
	performed by the kernel (e.g. an automount).

	n->triggered_on indicates the ID of the mount to which the change
	was accounted (e.g. the new parent of a new mount).

	n->axiliary_mount indicates the ID of an additional mount that was
	affected (e.g. a new mount itself) or 0.

	n->topology_changes provides the value of the topology change
	counter of the triggered-on mount at the conclusion of the
	operation.

	n->attr_changes provides the value of the attribute change counter
	of the triggered-on mount at the conclusion of the operation.

	n->aux_topology_changes provides the value of the topology change
	counter of the auxiliary mount at the conclusion of the operation.

Note that it is permissible for event records to be of variable length -
or, at least, the length may be dependent on the subtype.  Note also that
the queue can be shared between multiple notifications of various types.

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

 Documentation/watch_queue.rst               |   12 +
 arch/alpha/kernel/syscalls/syscall.tbl      |    1 
 arch/arm/tools/syscall.tbl                  |    1 
 arch/arm64/include/asm/unistd32.h           |    2 
 arch/ia64/kernel/syscalls/syscall.tbl       |    1 
 arch/m68k/kernel/syscalls/syscall.tbl       |    1 
 arch/microblaze/kernel/syscalls/syscall.tbl |    1 
 arch/mips/kernel/syscalls/syscall_n32.tbl   |    1 
 arch/mips/kernel/syscalls/syscall_n64.tbl   |    1 
 arch/mips/kernel/syscalls/syscall_o32.tbl   |    1 
 arch/parisc/kernel/syscalls/syscall.tbl     |    1 
 arch/powerpc/kernel/syscalls/syscall.tbl    |    1 
 arch/s390/kernel/syscalls/syscall.tbl       |    1 
 arch/sh/kernel/syscalls/syscall.tbl         |    1 
 arch/sparc/kernel/syscalls/syscall.tbl      |    1 
 arch/x86/entry/syscalls/syscall_32.tbl      |    1 
 arch/x86/entry/syscalls/syscall_64.tbl      |    1 
 arch/xtensa/kernel/syscalls/syscall.tbl     |    1 
 fs/Kconfig                                  |    9 +
 fs/Makefile                                 |    1 
 fs/mount.h                                  |   21 ++
 fs/mount_notify.c                           |  228 +++++++++++++++++++++++++++
 fs/namespace.c                              |   22 +++
 include/linux/dcache.h                      |    1 
 include/linux/syscalls.h                    |    2 
 include/uapi/asm-generic/unistd.h           |    4 
 include/uapi/linux/watch_queue.h            |   36 ++++
 kernel/sys_ni.c                             |    3 
 28 files changed, 354 insertions(+), 3 deletions(-)
 create mode 100644 fs/mount_notify.c

diff --git a/Documentation/watch_queue.rst b/Documentation/watch_queue.rst
index 849fad6893ef..3e647992be31 100644
--- a/Documentation/watch_queue.rst
+++ b/Documentation/watch_queue.rst
@@ -8,6 +8,7 @@ opened by userspace.  This can be used in conjunction with::
 
   * Key/keyring notifications
 
+  * Mount notifications.
 
 The notifications buffers can be enabled by:
 
@@ -233,6 +234,11 @@ Any particular buffer can be fed from multiple sources.  Sources include:
 
     See Documentation/security/keys/core.rst for more information.
 
+  * WATCH_TYPE_MOUNT_NOTIFY
+
+    Notifications of this type indicate changes to mount attributes and the
+    mount topology within the subtree at the indicated point.
+
 
 Event Filtering
 ===============
@@ -292,9 +298,10 @@ A buffer is created with something like the following::
 	pipe2(fds, O_TMPFILE);
 	ioctl(fds[1], IOC_WATCH_QUEUE_SET_SIZE, 256);
 
-It can then be set to receive keyring change notifications::
+It can then be set to receive notifications::
 
 	keyctl(KEYCTL_WATCH_KEY, KEY_SPEC_SESSION_KEYRING, fds[1], 0x01);
+	watch_mount(AT_FDCWD, "/", 0, fds[1], 0x02);
 
 The notifications can then be consumed by something like the following::
 
@@ -331,6 +338,9 @@ The notifications can then be consumed by something like the following::
 				case WATCH_TYPE_KEY_NOTIFY:
 					saw_key_change(&n.n);
 					break;
+				case WATCH_TYPE_MOUNT_NOTIFY:
+					saw_mount_change(&n.n);
+					break;
 				}
 
 				p += len;
diff --git a/arch/alpha/kernel/syscalls/syscall.tbl b/arch/alpha/kernel/syscalls/syscall.tbl
index 5ddd128d4b7a..b6cf8403da35 100644
--- a/arch/alpha/kernel/syscalls/syscall.tbl
+++ b/arch/alpha/kernel/syscalls/syscall.tbl
@@ -478,3 +478,4 @@
 547	common	openat2				sys_openat2
 548	common	pidfd_getfd			sys_pidfd_getfd
 549	common	faccessat2			sys_faccessat2
+550	common	watch_mount			sys_watch_mount
diff --git a/arch/arm/tools/syscall.tbl b/arch/arm/tools/syscall.tbl
index d5cae5ffede0..27cc1f53f4a0 100644
--- a/arch/arm/tools/syscall.tbl
+++ b/arch/arm/tools/syscall.tbl
@@ -452,3 +452,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h
index 6d95d0c8bf2f..4f9cf98cdf0f 100644
--- a/arch/arm64/include/asm/unistd32.h
+++ b/arch/arm64/include/asm/unistd32.h
@@ -885,6 +885,8 @@ __SYSCALL(__NR_openat2, sys_openat2)
 __SYSCALL(__NR_pidfd_getfd, sys_pidfd_getfd)
 #define __NR_faccessat2 439
 __SYSCALL(__NR_faccessat2, sys_faccessat2)
+#define __NR_watch_mount 440
+__SYSCALL(__NR_watch_mount, sys_watch_mount)
 
 /*
  * Please add new compat syscalls above this comment and update
diff --git a/arch/ia64/kernel/syscalls/syscall.tbl b/arch/ia64/kernel/syscalls/syscall.tbl
index 49e325b604b3..fc6d87903781 100644
--- a/arch/ia64/kernel/syscalls/syscall.tbl
+++ b/arch/ia64/kernel/syscalls/syscall.tbl
@@ -359,3 +359,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/m68k/kernel/syscalls/syscall.tbl b/arch/m68k/kernel/syscalls/syscall.tbl
index f71b1bbcc198..c671aa0e4d25 100644
--- a/arch/m68k/kernel/syscalls/syscall.tbl
+++ b/arch/m68k/kernel/syscalls/syscall.tbl
@@ -438,3 +438,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/microblaze/kernel/syscalls/syscall.tbl b/arch/microblaze/kernel/syscalls/syscall.tbl
index edacc4561f2b..65cc53f129ef 100644
--- a/arch/microblaze/kernel/syscalls/syscall.tbl
+++ b/arch/microblaze/kernel/syscalls/syscall.tbl
@@ -444,3 +444,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/syscalls/syscall_n32.tbl
index f777141f5256..7f034a239930 100644
--- a/arch/mips/kernel/syscalls/syscall_n32.tbl
+++ b/arch/mips/kernel/syscalls/syscall_n32.tbl
@@ -377,3 +377,4 @@
 437	n32	openat2				sys_openat2
 438	n32	pidfd_getfd			sys_pidfd_getfd
 439	n32	faccessat2			sys_faccessat2
+440	n32	watch_mount			sys_watch_mount
diff --git a/arch/mips/kernel/syscalls/syscall_n64.tbl b/arch/mips/kernel/syscalls/syscall_n64.tbl
index da8c76394e17..d39b90de3642 100644
--- a/arch/mips/kernel/syscalls/syscall_n64.tbl
+++ b/arch/mips/kernel/syscalls/syscall_n64.tbl
@@ -353,3 +353,4 @@
 437	n64	openat2				sys_openat2
 438	n64	pidfd_getfd			sys_pidfd_getfd
 439	n64	faccessat2			sys_faccessat2
+440	n64	watch_mount			sys_watch_mount
diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/syscalls/syscall_o32.tbl
index 13280625d312..09f426cb45b1 100644
--- a/arch/mips/kernel/syscalls/syscall_o32.tbl
+++ b/arch/mips/kernel/syscalls/syscall_o32.tbl
@@ -426,3 +426,4 @@
 437	o32	openat2				sys_openat2
 438	o32	pidfd_getfd			sys_pidfd_getfd
 439	o32	faccessat2			sys_faccessat2
+440	o32	watch_mount			sys_watch_mount
diff --git a/arch/parisc/kernel/syscalls/syscall.tbl b/arch/parisc/kernel/syscalls/syscall.tbl
index 5a758fa6ec52..52ff3454baa1 100644
--- a/arch/parisc/kernel/syscalls/syscall.tbl
+++ b/arch/parisc/kernel/syscalls/syscall.tbl
@@ -436,3 +436,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
index f833a3190822..10b7ed3c7a1b 100644
--- a/arch/powerpc/kernel/syscalls/syscall.tbl
+++ b/arch/powerpc/kernel/syscalls/syscall.tbl
@@ -528,3 +528,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/syscalls/syscall.tbl
index bfdcb7633957..86f317bf52df 100644
--- a/arch/s390/kernel/syscalls/syscall.tbl
+++ b/arch/s390/kernel/syscalls/syscall.tbl
@@ -441,3 +441,4 @@
 437  common	openat2			sys_openat2			sys_openat2
 438  common	pidfd_getfd		sys_pidfd_getfd			sys_pidfd_getfd
 439  common	faccessat2		sys_faccessat2			sys_faccessat2
+440	common	watch_mount		sys_watch_mount			sys_watch_mount
diff --git a/arch/sh/kernel/syscalls/syscall.tbl b/arch/sh/kernel/syscalls/syscall.tbl
index acc35daa1b79..0bb0f0b372c7 100644
--- a/arch/sh/kernel/syscalls/syscall.tbl
+++ b/arch/sh/kernel/syscalls/syscall.tbl
@@ -441,3 +441,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/sparc/kernel/syscalls/syscall.tbl b/arch/sparc/kernel/syscalls/syscall.tbl
index 8004a276cb74..369ab65c1e9a 100644
--- a/arch/sparc/kernel/syscalls/syscall.tbl
+++ b/arch/sparc/kernel/syscalls/syscall.tbl
@@ -484,3 +484,4 @@
 437	common	openat2			sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
index d8f8a1a69ed1..e760ba92c58d 100644
--- a/arch/x86/entry/syscalls/syscall_32.tbl
+++ b/arch/x86/entry/syscalls/syscall_32.tbl
@@ -443,3 +443,4 @@
 437	i386	openat2			sys_openat2
 438	i386	pidfd_getfd		sys_pidfd_getfd
 439	i386	faccessat2		sys_faccessat2
+440	i386	watch_mount		sys_watch_mount
diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
index 78847b32e137..5b58621d4f75 100644
--- a/arch/x86/entry/syscalls/syscall_64.tbl
+++ b/arch/x86/entry/syscalls/syscall_64.tbl
@@ -360,6 +360,7 @@
 437	common	openat2			sys_openat2
 438	common	pidfd_getfd		sys_pidfd_getfd
 439	common	faccessat2		sys_faccessat2
+440	common	watch_mount		sys_watch_mount
 
 #
 # x32-specific system call numbers start at 512 to avoid cache impact
diff --git a/arch/xtensa/kernel/syscalls/syscall.tbl b/arch/xtensa/kernel/syscalls/syscall.tbl
index 69d0d73876b3..5b28ee39f70f 100644
--- a/arch/xtensa/kernel/syscalls/syscall.tbl
+++ b/arch/xtensa/kernel/syscalls/syscall.tbl
@@ -409,3 +409,4 @@
 437	common	openat2				sys_openat2
 438	common	pidfd_getfd			sys_pidfd_getfd
 439	common	faccessat2			sys_faccessat2
+440	common	watch_mount			sys_watch_mount
diff --git a/fs/Kconfig b/fs/Kconfig
index a88aa3af73c1..1a55e56d5c54 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -117,6 +117,15 @@ source "fs/verity/Kconfig"
 
 source "fs/notify/Kconfig"
 
+config MOUNT_NOTIFICATIONS
+	bool "Mount topology change notifications"
+	select WATCH_QUEUE
+	help
+	  This option provides support for getting change notifications on the
+	  mount tree topology.  This makes use of the /dev/watch_queue misc
+	  device to handle the notification buffer and provides the
+	  mount_notify() system call to enable/disable watchpoints.
+
 source "fs/quota/Kconfig"
 
 source "fs/autofs/Kconfig"
diff --git a/fs/Makefile b/fs/Makefile
index 2ce5112b02c8..dd0d87e2ef19 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -22,6 +22,7 @@ obj-y +=	no-block.o
 endif
 
 obj-$(CONFIG_PROC_FS) += proc_namespace.o
+obj-$(CONFIG_MOUNT_NOTIFICATIONS) += mount_notify.o
 
 obj-y				+= notify/
 obj-$(CONFIG_EPOLL)		+= eventpoll.o
diff --git a/fs/mount.h b/fs/mount.h
index c7abb7b394d8..1c777f651446 100644
--- a/fs/mount.h
+++ b/fs/mount.h
@@ -4,6 +4,7 @@
 #include <linux/poll.h>
 #include <linux/ns_common.h>
 #include <linux/fs_pin.h>
+#include <linux/watch_queue.h>
 
 struct mnt_namespace {
 	atomic_t		count;
@@ -78,6 +79,12 @@ struct mount {
 	int mnt_expiry_mark;		/* true if marked for expiry */
 	struct hlist_head mnt_pins;
 	struct hlist_head mnt_stuck_children;
+#ifdef CONFIG_MOUNT_NOTIFICATIONS
+	atomic_t mnt_topology_changes;	/* Number of topology changes applied */
+	atomic_t mnt_attr_changes;	/* Number of attribute changes applied */
+	atomic_t mnt_subtree_notifications;	/* Number of notifications in subtree */
+	struct watch_list *mnt_watchers; /* Watches on dentries within this mount */
+#endif
 } __randomize_layout;
 
 #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */
@@ -159,3 +166,17 @@ static inline bool is_anon_ns(struct mnt_namespace *ns)
 }
 
 extern void mnt_cursor_del(struct mnt_namespace *ns, struct mount *cursor);
+
+#ifdef CONFIG_MOUNT_NOTIFICATIONS
+extern void notify_mount(struct mount *triggered,
+			 struct mount *aux,
+			 enum mount_notification_subtype subtype,
+			 u32 info_flags);
+#else
+static inline void notify_mount(struct mount *triggered,
+				struct mount *aux,
+				enum mount_notification_subtype subtype,
+				u32 info_flags)
+{
+}
+#endif
diff --git a/fs/mount_notify.c b/fs/mount_notify.c
new file mode 100644
index 000000000000..365aac5fa746
--- /dev/null
+++ b/fs/mount_notify.c
@@ -0,0 +1,228 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Provide mount topology/attribute change notifications.
+ *
+ * Copyright (C) 2019 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ */
+
+#include <linux/fs.h>
+#include <linux/namei.h>
+#include <linux/syscalls.h>
+#include <linux/slab.h>
+#include <linux/security.h>
+#include "mount.h"
+
+/*
+ * Post mount notifications to all watches going rootwards along the tree.
+ *
+ * Must be called with the mount_lock held.
+ */
+static void post_mount_notification(struct mount *changed,
+				    struct mount_notification *notify)
+{
+	const struct cred *cred = current_cred();
+	struct path cursor;
+	struct mount *mnt;
+	unsigned seq;
+
+	seq = 0;
+	rcu_read_lock();
+restart:
+	cursor.mnt = &changed->mnt;
+	cursor.dentry = changed->mnt.mnt_root;
+	mnt = real_mount(cursor.mnt);
+	notify->watch.info &= ~NOTIFY_MOUNT_IN_SUBTREE;
+
+	read_seqbegin_or_lock(&rename_lock, &seq);
+	for (;;) {
+		if (mnt->mnt_watchers &&
+		    !hlist_empty(&mnt->mnt_watchers->watchers)) {
+			if (cursor.dentry->d_flags & DCACHE_MOUNT_WATCH)
+				post_watch_notification(mnt->mnt_watchers,
+							&notify->watch, cred,
+							(unsigned long)cursor.dentry);
+		} else {
+			cursor.dentry = mnt->mnt.mnt_root;
+		}
+		notify->watch.info |= NOTIFY_MOUNT_IN_SUBTREE;
+
+		if (cursor.dentry == cursor.mnt->mnt_root ||
+		    IS_ROOT(cursor.dentry)) {
+			struct mount *parent = READ_ONCE(mnt->mnt_parent);
+
+			/* Escaped? */
+			if (cursor.dentry != cursor.mnt->mnt_root)
+				break;
+
+			/* Global root? */
+			if (mnt == parent)
+				break;
+
+			cursor.dentry = READ_ONCE(mnt->mnt_mountpoint);
+			mnt = parent;
+			cursor.mnt = &mnt->mnt;
+			atomic_inc(&mnt->mnt_subtree_notifications);
+		} else {
+			cursor.dentry = cursor.dentry->d_parent;
+		}
+	}
+
+	if (need_seqretry(&rename_lock, seq)) {
+		seq = 1;
+		goto restart;
+	}
+
+	done_seqretry(&rename_lock, seq);
+	rcu_read_unlock();
+}
+
+/*
+ * Generate a mount notification.
+ */
+void notify_mount(struct mount *trigger,
+		  struct mount *aux,
+		  enum mount_notification_subtype subtype,
+		  u32 info_flags)
+{
+
+	struct mount_notification n;
+
+	memset(&n, 0, sizeof(n));
+	n.watch.type	= WATCH_TYPE_MOUNT_NOTIFY;
+	n.watch.subtype	= subtype;
+	n.watch.info	= info_flags | watch_sizeof(n);
+	n.triggered_on	= trigger->mnt_id;
+
+	switch (subtype) {
+	case NOTIFY_MOUNT_EXPIRY:
+	case NOTIFY_MOUNT_READONLY:
+	case NOTIFY_MOUNT_SETATTR:
+		n.topology_changes	= atomic_read(&trigger->mnt_topology_changes);
+		n.attr_changes		= atomic_inc_return(&trigger->mnt_attr_changes);
+		break;
+
+	case NOTIFY_MOUNT_NEW_MOUNT:
+	case NOTIFY_MOUNT_UNMOUNT:
+	case NOTIFY_MOUNT_MOVE_FROM:
+	case NOTIFY_MOUNT_MOVE_TO:
+		n.auxiliary_mount	= aux->mnt_id,
+		n.attr_changes		= atomic_read(&trigger->mnt_attr_changes);
+		n.topology_changes	= atomic_inc_return(&trigger->mnt_topology_changes);
+		n.aux_topology_changes	= atomic_inc_return(&aux->mnt_topology_changes);
+		break;
+
+	default:
+		BUG();
+	}
+
+	post_mount_notification(trigger, &n);
+}
+
+static void release_mount_watch(struct watch *watch)
+{
+	struct dentry *dentry = (struct dentry *)(unsigned long)watch->id;
+
+	dput(dentry);
+}
+
+/**
+ * sys_watch_mount - Watch for mount topology/attribute changes
+ * @dfd: Base directory to pathwalk from or fd referring to mount.
+ * @filename: Path to mount to place the watch upon
+ * @at_flags: Pathwalk control flags
+ * @watch_fd: The watch queue to send notifications to.
+ * @watch_id: The watch ID to be placed in the notification (-1 to remove watch)
+ */
+SYSCALL_DEFINE5(watch_mount,
+		int, dfd,
+		const char __user *, filename,
+		unsigned int, at_flags,
+		int, watch_fd,
+		int, watch_id)
+{
+	struct watch_queue *wqueue;
+	struct watch_list *wlist = NULL;
+	struct watch *watch = NULL;
+	struct mount *m;
+	struct path path;
+	unsigned int lookup_flags =
+		LOOKUP_DIRECTORY | LOOKUP_FOLLOW | LOOKUP_AUTOMOUNT;
+	int ret;
+
+	if (watch_id < -1 || watch_id > 0xff)
+		return -EINVAL;
+	if ((at_flags & ~(AT_NO_AUTOMOUNT | AT_EMPTY_PATH)) != 0)
+		return -EINVAL;
+	if (at_flags & AT_NO_AUTOMOUNT)
+		lookup_flags &= ~LOOKUP_AUTOMOUNT;
+	if (at_flags & AT_EMPTY_PATH)
+		lookup_flags |= LOOKUP_EMPTY;
+
+	ret = user_path_at(dfd, filename, lookup_flags, &path);
+	if (ret)
+		return ret;
+
+	ret = inode_permission(path.dentry->d_inode, MAY_EXEC);
+	if (ret)
+		goto err_path;
+
+	wqueue = get_watch_queue(watch_fd);
+	if (IS_ERR(wqueue))
+		goto err_path;
+
+	m = real_mount(path.mnt);
+
+	if (watch_id >= 0) {
+		ret = -ENOMEM;
+		if (!READ_ONCE(m->mnt_watchers)) {
+			wlist = kzalloc(sizeof(*wlist), GFP_KERNEL);
+			if (!wlist)
+				goto err_wqueue;
+			init_watch_list(wlist, release_mount_watch);
+		}
+
+		watch = kzalloc(sizeof(*watch), GFP_KERNEL);
+		if (!watch)
+			goto err_wlist;
+
+		init_watch(watch, wqueue);
+		watch->id	= (unsigned long)path.dentry;
+		watch->info_id	= (u32)watch_id << WATCH_INFO_ID__SHIFT;
+
+		ret = security_watch_mount(watch, &path);
+		if (ret < 0)
+			goto err_watch;
+
+		down_write(&m->mnt.mnt_sb->s_umount);
+		if (!m->mnt_watchers) {
+			m->mnt_watchers = wlist;
+			wlist = NULL;
+		}
+
+		ret = add_watch_to_object(watch, m->mnt_watchers);
+		if (ret == 0) {
+			spin_lock(&path.dentry->d_lock);
+			path.dentry->d_flags |= DCACHE_MOUNT_WATCH;
+			spin_unlock(&path.dentry->d_lock);
+			dget(path.dentry);
+			watch = NULL;
+		}
+		up_write(&m->mnt.mnt_sb->s_umount);
+	} else {
+		down_write(&m->mnt.mnt_sb->s_umount);
+		ret = remove_watch_from_object(m->mnt_watchers, wqueue,
+					       (unsigned long)path.dentry,
+					       false);
+		up_write(&m->mnt.mnt_sb->s_umount);
+	}
+
+err_watch:
+	kfree(watch);
+err_wlist:
+	kfree(wlist);
+err_wqueue:
+	put_watch_queue(wqueue);
+err_path:
+	path_put(&path);
+	return ret;
+}
diff --git a/fs/namespace.c b/fs/namespace.c
index 4a0f600a3328..73ff5bf0c9af 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -498,6 +498,9 @@ static int mnt_make_readonly(struct mount *mnt)
 	smp_wmb();
 	mnt->mnt.mnt_flags &= ~MNT_WRITE_HOLD;
 	unlock_mount_hash();
+	if (ret == 0)
+		notify_mount(mnt, NULL, NOTIFY_MOUNT_READONLY,
+			     NOTIFY_MOUNT_IS_NOW_RO);
 	return ret;
 }
 
@@ -506,6 +509,7 @@ static int __mnt_unmake_readonly(struct mount *mnt)
 	lock_mount_hash();
 	mnt->mnt.mnt_flags &= ~MNT_READONLY;
 	unlock_mount_hash();
+	notify_mount(mnt, NULL, NOTIFY_MOUNT_READONLY, 0);
 	return 0;
 }
 
@@ -835,6 +839,7 @@ static struct mountpoint *unhash_mnt(struct mount *mnt)
  */
 static void umount_mnt(struct mount *mnt)
 {
+	notify_mount(mnt->mnt_parent, mnt, NOTIFY_MOUNT_UNMOUNT, 0);
 	put_mountpoint(unhash_mnt(mnt));
 }
 
@@ -1175,6 +1180,11 @@ static void mntput_no_expire(struct mount *mnt)
 	mnt->mnt.mnt_flags |= MNT_DOOMED;
 	rcu_read_unlock();
 
+#ifdef CONFIG_MOUNT_NOTIFICATIONS
+	if (mnt->mnt_watchers)
+		remove_watch_list(mnt->mnt_watchers, mnt->mnt_id);
+#endif
+
 	list_del(&mnt->mnt_instance);
 
 	if (unlikely(!list_empty(&mnt->mnt_mounts))) {
@@ -1503,6 +1513,7 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
 		p = list_first_entry(&tmp_list, struct mount, mnt_list);
 		list_del_init(&p->mnt_expire);
 		list_del_init(&p->mnt_list);
+
 		ns = p->mnt_ns;
 		if (ns) {
 			ns->mounts--;
@@ -2137,7 +2148,10 @@ static int attach_recursive_mnt(struct mount *source_mnt,
 	}
 	if (moving) {
 		unhash_mnt(source_mnt);
+		notify_mount(source_mnt->mnt_parent, source_mnt,
+			     NOTIFY_MOUNT_MOVE_FROM, 0);
 		attach_mnt(source_mnt, dest_mnt, dest_mp);
+		notify_mount(dest_mnt, source_mnt, NOTIFY_MOUNT_MOVE_TO, 0);
 		touch_mnt_namespace(source_mnt->mnt_ns);
 	} else {
 		if (source_mnt->mnt_ns) {
@@ -2146,6 +2160,11 @@ static int attach_recursive_mnt(struct mount *source_mnt,
 		}
 		mnt_set_mountpoint(dest_mnt, dest_mp, source_mnt);
 		commit_tree(source_mnt);
+		notify_mount(dest_mnt, source_mnt, NOTIFY_MOUNT_NEW_MOUNT,
+			     (source_mnt->mnt.mnt_sb->s_flags & SB_RDONLY ?
+			      NOTIFY_MOUNT_IS_NOW_RO : 0) |
+			     (source_mnt->mnt.mnt_sb->s_flags & SB_SUBMOUNT ?
+			      NOTIFY_MOUNT_IS_SUBMOUNT : 0));
 	}
 
 	hlist_for_each_entry_safe(child, n, &tree_list, mnt_hash) {
@@ -2522,6 +2541,8 @@ static void set_mount_attributes(struct mount *mnt, unsigned int mnt_flags)
 	mnt->mnt.mnt_flags = mnt_flags;
 	touch_mnt_namespace(mnt->mnt_ns);
 	unlock_mount_hash();
+	notify_mount(mnt, NULL, NOTIFY_MOUNT_SETATTR,
+		     (mnt_flags & SB_RDONLY ? NOTIFY_MOUNT_IS_NOW_RO : 0));
 }
 
 static void mnt_warn_timestamp_expiry(struct path *mountpoint, struct vfsmount *mnt)
@@ -2992,6 +3013,7 @@ void mark_mounts_for_expiry(struct list_head *mounts)
 			propagate_mount_busy(mnt, 1))
 			continue;
 		list_move(&mnt->mnt_expire, &graveyard);
+		notify_mount(mnt, NULL, NOTIFY_MOUNT_EXPIRY, 0);
 	}
 	while (!list_empty(&graveyard)) {
 		mnt = list_first_entry(&graveyard, struct mount, mnt_expire);
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index a81f0c3cf352..a94c551c62a3 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -219,6 +219,7 @@ struct dentry_operations {
 #define DCACHE_PAR_LOOKUP		0x10000000 /* being looked up (with parent locked shared) */
 #define DCACHE_DENTRY_CURSOR		0x20000000
 #define DCACHE_NORCU			0x40000000 /* No RCU delay for freeing */
+#define DCACHE_MOUNT_WATCH		0x80000000 /* There's a mount watch here */
 
 extern seqlock_t rename_lock;
 
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index b951a87da987..88d03fd627ab 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -1005,6 +1005,8 @@ asmlinkage long sys_pidfd_send_signal(int pidfd, int sig,
 				       siginfo_t __user *info,
 				       unsigned int flags);
 asmlinkage long sys_pidfd_getfd(int pidfd, int fd, unsigned int flags);
+asmlinkage long sys_watch_mount(int dfd, const char __user *path,
+				unsigned int at_flags, int watch_fd, int watch_id);
 
 /*
  * Architecture-specific system calls
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h
index f4a01305d9a6..fcdca8c7d30a 100644
--- a/include/uapi/asm-generic/unistd.h
+++ b/include/uapi/asm-generic/unistd.h
@@ -857,9 +857,11 @@ __SYSCALL(__NR_openat2, sys_openat2)
 __SYSCALL(__NR_pidfd_getfd, sys_pidfd_getfd)
 #define __NR_faccessat2 439
 __SYSCALL(__NR_faccessat2, sys_faccessat2)
+#define __NR_watch_mount 440
+__SYSCALL(__NR_watch_mount, sys_watch_mount)
 
 #undef __NR_syscalls
-#define __NR_syscalls 440
+#define __NR_syscalls 441
 
 /*
  * 32 bit systems traditionally used different
diff --git a/include/uapi/linux/watch_queue.h b/include/uapi/linux/watch_queue.h
index c3d8320b5d3a..6b6cd2afc590 100644
--- a/include/uapi/linux/watch_queue.h
+++ b/include/uapi/linux/watch_queue.h
@@ -14,7 +14,8 @@
 enum watch_notification_type {
 	WATCH_TYPE_META		= 0,	/* Special record */
 	WATCH_TYPE_KEY_NOTIFY	= 1,	/* Key change event notification */
-	WATCH_TYPE__NR		= 2
+	WATCH_TYPE_MOUNT_NOTIFY	= 2,	/* Mount topology change notification */
+	WATCH_TYPE___NR		= 3
 };
 
 enum watch_meta_notification_subtype {
@@ -101,4 +102,37 @@ struct key_notification {
 	__u32	aux;		/* Per-type auxiliary data */
 };
 
+/*
+ * Type of mount topology change notification.
+ */
+enum mount_notification_subtype {
+	NOTIFY_MOUNT_NEW_MOUNT	= 0, /* New mount added */
+	NOTIFY_MOUNT_UNMOUNT	= 1, /* Mount removed manually */
+	NOTIFY_MOUNT_EXPIRY	= 2, /* Automount expired */
+	NOTIFY_MOUNT_READONLY	= 3, /* Mount R/O state changed */
+	NOTIFY_MOUNT_SETATTR	= 4, /* Mount attributes changed */
+	NOTIFY_MOUNT_MOVE_FROM	= 5, /* Mount moved from here */
+	NOTIFY_MOUNT_MOVE_TO	= 6, /* Mount moved to here (compare op_id) */
+};
+
+#define NOTIFY_MOUNT_IN_SUBTREE		WATCH_INFO_FLAG_0 /* Event not actually at watched dentry */
+#define NOTIFY_MOUNT_IS_RECURSIVE	WATCH_INFO_FLAG_1 /* Change applied recursively */
+#define NOTIFY_MOUNT_IS_NOW_RO		WATCH_INFO_FLAG_2 /* Mount changed to R/O */
+#define NOTIFY_MOUNT_IS_SUBMOUNT	WATCH_INFO_FLAG_3 /* New mount is submount */
+
+/*
+ * Mount topology/configuration change notification record.
+ * - watch.type = WATCH_TYPE_MOUNT_NOTIFY
+ * - watch.subtype = enum mount_notification_subtype
+ */
+struct mount_notification {
+	struct watch_notification watch; /* WATCH_TYPE_MOUNT_NOTIFY */
+	__u32	triggered_on;		/* The mount that triggered the notification */
+	__u32	auxiliary_mount;	/* Added/moved/removed mount or 0 */
+	__u32	topology_changes;	/* trigger: Number of topology changes applied */
+	__u32	attr_changes;		/* trigger: Number of attribute changes applied */
+	__u32	aux_topology_changes;	/* aux: Number of topology changes applied */
+	__u32	__padding;
+};
+
 #endif /* _UAPI_LINUX_WATCH_QUEUE_H */
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
index 3b69a560a7ac..3e1c5c9d2efe 100644
--- a/kernel/sys_ni.c
+++ b/kernel/sys_ni.c
@@ -85,6 +85,9 @@ COND_SYSCALL(ioprio_get);
 /* fs/locks.c */
 COND_SYSCALL(flock);
 
+/* fs/mount_notify.c */
+COND_SYSCALL(watch_mount);
+
 /* fs/namei.c */
 
 /* fs/namespace.c */



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] watch_queue: sample: Display mount tree change notifications
  2020-07-24 13:11 [PATCH 0/4] Mount notifications David Howells
                   ` (2 preceding siblings ...)
  2020-07-24 13:11 ` [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications David Howells
@ 2020-07-24 13:11 ` David Howells
  3 siblings, 0 replies; 10+ messages in thread
From: David Howells @ 2020-07-24 13:11 UTC (permalink / raw)
  To: viro
  Cc: dhowells, torvalds, casey, sds, nicolas.dichtel, raven,
	christian, jlayton, kzak, mszeredi, linux-api, linux-fsdevel,
	linux-security-module, linux-kernel

This is run like:

	./watch_test

and watches "/" for changes to the mount topology and the attributes of
individual mount objects.

	# mount -t tmpfs none /mnt
	# mount -o remount,ro /mnt
	# mount -o remount,rw /mnt

producing:

	# ./watch_test
	read() = 16
	NOTIFY[000]: ty=000002 sy=00 i=02000010
	MOUNT 00000060 change=0[new_mount] aux=416
	read() = 16
	NOTIFY[000]: ty=000002 sy=04 i=02010010
	MOUNT 000001a0 change=4[setattr] aux=0
	read() = 16
	NOTIFY[000]: ty=000002 sy=04 i=02010010
	MOUNT 000001a0 change=4[setattr] aux=0

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

 samples/watch_queue/watch_test.c |   44 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/samples/watch_queue/watch_test.c b/samples/watch_queue/watch_test.c
index 46e618a897fe..b526de016de4 100644
--- a/samples/watch_queue/watch_test.c
+++ b/samples/watch_queue/watch_test.c
@@ -26,6 +26,9 @@
 #ifndef __NR_keyctl
 #define __NR_keyctl -1
 #endif
+#ifndef __NR_watch_mount
+#define __NR_watch_mount -1
+#endif
 
 #define BUF_SIZE 256
 
@@ -58,6 +61,32 @@ static void saw_key_change(struct watch_notification *n, size_t len)
 	       k->key_id, n->subtype, key_subtypes[n->subtype], k->aux);
 }
 
+static const char *mount_subtypes[256] = {
+	[NOTIFY_MOUNT_NEW_MOUNT]	= "new_mount",
+	[NOTIFY_MOUNT_UNMOUNT]		= "unmount",
+	[NOTIFY_MOUNT_EXPIRY]		= "expiry",
+	[NOTIFY_MOUNT_READONLY]		= "readonly",
+	[NOTIFY_MOUNT_SETATTR]		= "setattr",
+	[NOTIFY_MOUNT_MOVE_FROM]	= "move_from",
+	[NOTIFY_MOUNT_MOVE_TO]		= "move_to",
+};
+
+static void saw_mount_change(struct watch_notification *n, size_t len)
+{
+	struct mount_notification *m = (struct mount_notification *)n;
+
+	if (len != sizeof(struct mount_notification))
+		return;
+
+	printf("MOUNT %08x change=%u[%s] aux=%u ctr=%x,%x actr=%x\n",
+	       m->triggered_on, n->subtype, mount_subtypes[n->subtype],
+	       m->auxiliary_mount,
+	       m->topology_changes,
+	       m->attr_changes,
+	       m->aux_topology_changes);
+
+}
+
 /*
  * Consume and display events.
  */
@@ -134,6 +163,9 @@ static void consumer(int fd)
 			default:
 				printf("other type\n");
 				break;
+			case WATCH_TYPE_MOUNT_NOTIFY:
+				saw_mount_change(&n.n, len);
+				break;
 			}
 
 			p += len;
@@ -142,12 +174,17 @@ static void consumer(int fd)
 }
 
 static struct watch_notification_filter filter = {
-	.nr_filters	= 1,
+	.nr_filters	= 2,
 	.filters = {
 		[0]	= {
 			.type			= WATCH_TYPE_KEY_NOTIFY,
 			.subtype_filter[0]	= UINT_MAX,
 		},
+		[1] = {
+			.type			= WATCH_TYPE_MOUNT_NOTIFY,
+			// Reject move-from notifications
+			.subtype_filter[0]	= UINT_MAX & ~(1 << NOTIFY_MOUNT_MOVE_FROM),
+		},
 	},
 };
 
@@ -181,6 +218,11 @@ int main(int argc, char **argv)
 		exit(1);
 	}
 
+	if (syscall(__NR_watch_mount, AT_FDCWD, "/", 0, fd, 0xde) == -1) {
+		perror("watch_mount");
+		exit(1);
+	}
+
 	consumer(fd);
 	exit(0);
 }



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications
  2020-07-24 13:11 ` [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications David Howells
@ 2020-07-24 19:14   ` Linus Torvalds
  2020-07-24 19:59   ` David Howells
  2020-07-30 17:33   ` kernel test robot
  2 siblings, 0 replies; 10+ messages in thread
From: Linus Torvalds @ 2020-07-24 19:14 UTC (permalink / raw)
  To: David Howells
  Cc: Al Viro, Casey Schaufler, Stephen Smalley, Nicolas Dichtel,
	Ian Kent, Christian Brauner, Jeff Layton, Karel Zak,
	Miklos Szeredi, Linux API, linux-fsdevel, LSM List,
	Linux Kernel Mailing List

This just can't be right.

On Fri, Jul 24, 2020 at 6:12 AM David Howells <dhowells@redhat.com> wrote:
>
> +
> +/**
> + * sys_watch_mount - Watch for mount topology/attribute changes
> + * @dfd: Base directory to pathwalk from or fd referring to mount.
> + * @filename: Path to mount to place the watch upon
> + * @at_flags: Pathwalk control flags
> + * @watch_fd: The watch queue to send notifications to.
> + * @watch_id: The watch ID to be placed in the notification (-1 to remove watch)
> + */
> +SYSCALL_DEFINE5(watch_mount, [...]
> +               int, watch_id)
...
> +       if (watch_id < -1 || watch_id > 0xff)
> +               return -EINVAL;
...
> +       ret = inode_permission(path.dentry->d_inode, MAY_EXEC);
> +       if (ret)
> +               goto err_path;
...
> +       if (watch_id >= 0) {
...
> +               watch = kzalloc(sizeof(*watch), GFP_KERNEL);
> +               if (!watch)
> +                       goto err_wlist;

So now you can basically allocate as much kernel memory as you want as
a regular user, as long as you have a mounted directory you can walk
(ie everybody).

Is there any limiting of watches anywhere? I don't see it.

I notice we already have this pattern elsewhere. I think we need to
fix this before we add more watch types.

Watch allocation shouldn't just be a kzalloc(). I think you should
have a "watch_allocate()" that does the initialization of id etc, but
also does some basic per-user watch resource tracking or something.

              Linus

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications
  2020-07-24 13:11 ` [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications David Howells
  2020-07-24 19:14   ` Linus Torvalds
@ 2020-07-24 19:59   ` David Howells
  2020-07-24 20:25     ` Linus Torvalds
  2020-07-24 20:45     ` David Howells
  2020-07-30 17:33   ` kernel test robot
  2 siblings, 2 replies; 10+ messages in thread
From: David Howells @ 2020-07-24 19:59 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: dhowells, Al Viro, Casey Schaufler, Stephen Smalley,
	Nicolas Dichtel, Ian Kent, Christian Brauner, Jeff Layton,
	Karel Zak, Miklos Szeredi, Linux API, linux-fsdevel, LSM List,
	Linux Kernel Mailing List

Linus Torvalds <torvalds@linux-foundation.org> wrote:

> So now you can basically allocate as much kernel memory as you want as
> a regular user, as long as you have a mounted directory you can walk
> (ie everybody).
> 
> Is there any limiting of watches anywhere? I don't see it.

That's a good point.  Any suggestions on how to do it?  An additional RLIMIT?

Or should I do it like I did with keyrings and separately manage a quota for
each user?

David


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications
  2020-07-24 19:59   ` David Howells
@ 2020-07-24 20:25     ` Linus Torvalds
  2020-07-24 20:45     ` David Howells
  1 sibling, 0 replies; 10+ messages in thread
From: Linus Torvalds @ 2020-07-24 20:25 UTC (permalink / raw)
  To: David Howells
  Cc: Al Viro, Casey Schaufler, Stephen Smalley, Nicolas Dichtel,
	Ian Kent, Christian Brauner, Jeff Layton, Karel Zak,
	Miklos Szeredi, Linux API, linux-fsdevel, LSM List,
	Linux Kernel Mailing List

On Fri, Jul 24, 2020 at 12:59 PM David Howells <dhowells@redhat.com> wrote:
>
> That's a good point.  Any suggestions on how to do it?  An additional RLIMIT?
>
> Or should I do it like I did with keyrings and separately manage a quota for
> each user?

I'd count them per user, and maybe start out saying "you can have as
many watches as you can have files" and just re-use RLIMIT_NOFILE as
the limit for them.

And if that causes problems, let's re-visit. How does that sound?

                Linus

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications
  2020-07-24 19:59   ` David Howells
  2020-07-24 20:25     ` Linus Torvalds
@ 2020-07-24 20:45     ` David Howells
  1 sibling, 0 replies; 10+ messages in thread
From: David Howells @ 2020-07-24 20:45 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: dhowells, Al Viro, Casey Schaufler, Stephen Smalley,
	Nicolas Dichtel, Ian Kent, Christian Brauner, Jeff Layton,
	Karel Zak, Miklos Szeredi, Linux API, linux-fsdevel, LSM List,
	Linux Kernel Mailing List

Linus Torvalds <torvalds@linux-foundation.org> wrote:

> I'd count them per user, and maybe start out saying "you can have as
> many watches as you can have files" and just re-use RLIMIT_NOFILE as
> the limit for them.
> 
> And if that causes problems, let's re-visit. How does that sound?

I can try that for now.

David


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications
  2020-07-24 13:11 ` [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications David Howells
  2020-07-24 19:14   ` Linus Torvalds
  2020-07-24 19:59   ` David Howells
@ 2020-07-30 17:33   ` kernel test robot
  2 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2020-07-30 17:33 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 47071 bytes --]

Hi David,

I love your patch! Yet something to improve:

[auto build test ERROR on tip/x86/asm]
[also build test ERROR on arm64/for-next/core ia64/next m68k/for-next hp-parisc/for-next powerpc/next s390/features linus/master v5.8-rc7]
[cannot apply to security/next-testing sparc-next/master next-20200730]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/David-Howells/Mount-notifications/20200724-211635
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 158807de5822d1079e162a3762956fd743dd483e
config: arm64-defconfig (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:871:1: note: in expansion of macro '__SYSCALL'
     871 | __SYSCALL(__NR_fsopen, sys_fsopen)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:873:1: note: in expansion of macro '__SYSCALL'
     873 | __SYSCALL(__NR_fsconfig, sys_fsconfig)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[431]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:873:1: note: in expansion of macro '__SYSCALL'
     873 | __SYSCALL(__NR_fsconfig, sys_fsconfig)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:875:1: note: in expansion of macro '__SYSCALL'
     875 | __SYSCALL(__NR_fsmount, sys_fsmount)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[432]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:875:1: note: in expansion of macro '__SYSCALL'
     875 | __SYSCALL(__NR_fsmount, sys_fsmount)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:877:1: note: in expansion of macro '__SYSCALL'
     877 | __SYSCALL(__NR_fspick, sys_fspick)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[433]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:877:1: note: in expansion of macro '__SYSCALL'
     877 | __SYSCALL(__NR_fspick, sys_fspick)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:879:1: note: in expansion of macro '__SYSCALL'
     879 | __SYSCALL(__NR_pidfd_open, sys_pidfd_open)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[434]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:879:1: note: in expansion of macro '__SYSCALL'
     879 | __SYSCALL(__NR_pidfd_open, sys_pidfd_open)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:881:1: note: in expansion of macro '__SYSCALL'
     881 | __SYSCALL(__NR_clone3, sys_clone3)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[435]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:881:1: note: in expansion of macro '__SYSCALL'
     881 | __SYSCALL(__NR_clone3, sys_clone3)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:883:1: note: in expansion of macro '__SYSCALL'
     883 | __SYSCALL(__NR_openat2, sys_openat2)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[437]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:883:1: note: in expansion of macro '__SYSCALL'
     883 | __SYSCALL(__NR_openat2, sys_openat2)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:885:1: note: in expansion of macro '__SYSCALL'
     885 | __SYSCALL(__NR_pidfd_getfd, sys_pidfd_getfd)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[438]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:885:1: note: in expansion of macro '__SYSCALL'
     885 | __SYSCALL(__NR_pidfd_getfd, sys_pidfd_getfd)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: initialized field overwritten [-Woverride-init]
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:887:1: note: in expansion of macro '__SYSCALL'
     887 | __SYSCALL(__NR_faccessat2, sys_faccessat2)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table[439]')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:887:1: note: in expansion of macro '__SYSCALL'
     887 | __SYSCALL(__NR_faccessat2, sys_faccessat2)
         | ^~~~~~~~~
>> arch/arm64/include/asm/unistd32.h:888:26: error: array index in initializer exceeds array bounds
     888 | #define __NR_watch_mount 440
         |                          ^~~
   arch/arm64/kernel/sys32.c:130:29: note: in definition of macro '__SYSCALL'
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                             ^~
   arch/arm64/include/asm/unistd32.h:889:11: note: in expansion of macro '__NR_watch_mount'
     889 | __SYSCALL(__NR_watch_mount, sys_watch_mount)
         |           ^~~~~~~~~~~~~~~~
   arch/arm64/include/asm/unistd32.h:888:26: note: (near initialization for 'compat_sys_call_table')
     888 | #define __NR_watch_mount 440
         |                          ^~~
   arch/arm64/kernel/sys32.c:130:29: note: in definition of macro '__SYSCALL'
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                             ^~
   arch/arm64/include/asm/unistd32.h:889:11: note: in expansion of macro '__NR_watch_mount'
     889 | __SYSCALL(__NR_watch_mount, sys_watch_mount)
         |           ^~~~~~~~~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: warning: excess elements in array initializer
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:889:1: note: in expansion of macro '__SYSCALL'
     889 | __SYSCALL(__NR_watch_mount, sys_watch_mount)
         | ^~~~~~~~~
   arch/arm64/kernel/sys32.c:130:35: note: (near initialization for 'compat_sys_call_table')
     130 | #define __SYSCALL(nr, sym) [nr] = __arm64_##sym,
         |                                   ^~~~~~~~
   arch/arm64/include/asm/unistd32.h:889:1: note: in expansion of macro '__SYSCALL'
     889 | __SYSCALL(__NR_watch_mount, sys_watch_mount)
         | ^~~~~~~~~

vim +888 arch/arm64/include/asm/unistd32.h

    12	
    13	#define __NR_restart_syscall 0
    14	__SYSCALL(__NR_restart_syscall, sys_restart_syscall)
    15	#define __NR_exit 1
    16	__SYSCALL(__NR_exit, sys_exit)
    17	#define __NR_fork 2
    18	__SYSCALL(__NR_fork, sys_fork)
    19	#define __NR_read 3
    20	__SYSCALL(__NR_read, sys_read)
    21	#define __NR_write 4
    22	__SYSCALL(__NR_write, sys_write)
    23	#define __NR_open 5
    24	__SYSCALL(__NR_open, compat_sys_open)
    25	#define __NR_close 6
    26	__SYSCALL(__NR_close, sys_close)
    27				/* 7 was sys_waitpid */
    28	__SYSCALL(7, sys_ni_syscall)
    29	#define __NR_creat 8
    30	__SYSCALL(__NR_creat, sys_creat)
    31	#define __NR_link 9
    32	__SYSCALL(__NR_link, sys_link)
    33	#define __NR_unlink 10
    34	__SYSCALL(__NR_unlink, sys_unlink)
    35	#define __NR_execve 11
    36	__SYSCALL(__NR_execve, compat_sys_execve)
    37	#define __NR_chdir 12
    38	__SYSCALL(__NR_chdir, sys_chdir)
    39				/* 13 was sys_time */
    40	__SYSCALL(13, sys_ni_syscall)
    41	#define __NR_mknod 14
    42	__SYSCALL(__NR_mknod, sys_mknod)
    43	#define __NR_chmod 15
    44	__SYSCALL(__NR_chmod, sys_chmod)
    45	#define __NR_lchown 16
    46	__SYSCALL(__NR_lchown, sys_lchown16)
    47				/* 17 was sys_break */
    48	__SYSCALL(17, sys_ni_syscall)
    49				/* 18 was sys_stat */
    50	__SYSCALL(18, sys_ni_syscall)
    51	#define __NR_lseek 19
    52	__SYSCALL(__NR_lseek, compat_sys_lseek)
    53	#define __NR_getpid 20
    54	__SYSCALL(__NR_getpid, sys_getpid)
    55	#define __NR_mount 21
    56	__SYSCALL(__NR_mount, compat_sys_mount)
    57				/* 22 was sys_umount */
    58	__SYSCALL(22, sys_ni_syscall)
    59	#define __NR_setuid 23
    60	__SYSCALL(__NR_setuid, sys_setuid16)
    61	#define __NR_getuid 24
    62	__SYSCALL(__NR_getuid, sys_getuid16)
    63				/* 25 was sys_stime */
    64	__SYSCALL(25, sys_ni_syscall)
    65	#define __NR_ptrace 26
    66	__SYSCALL(__NR_ptrace, compat_sys_ptrace)
    67				/* 27 was sys_alarm */
    68	__SYSCALL(27, sys_ni_syscall)
    69				/* 28 was sys_fstat */
    70	__SYSCALL(28, sys_ni_syscall)
    71	#define __NR_pause 29
    72	__SYSCALL(__NR_pause, sys_pause)
    73				/* 30 was sys_utime */
    74	__SYSCALL(30, sys_ni_syscall)
    75				/* 31 was sys_stty */
    76	__SYSCALL(31, sys_ni_syscall)
    77				/* 32 was sys_gtty */
    78	__SYSCALL(32, sys_ni_syscall)
    79	#define __NR_access 33
    80	__SYSCALL(__NR_access, sys_access)
    81	#define __NR_nice 34
    82	__SYSCALL(__NR_nice, sys_nice)
    83				/* 35 was sys_ftime */
    84	__SYSCALL(35, sys_ni_syscall)
    85	#define __NR_sync 36
    86	__SYSCALL(__NR_sync, sys_sync)
    87	#define __NR_kill 37
    88	__SYSCALL(__NR_kill, sys_kill)
    89	#define __NR_rename 38
    90	__SYSCALL(__NR_rename, sys_rename)
    91	#define __NR_mkdir 39
    92	__SYSCALL(__NR_mkdir, sys_mkdir)
    93	#define __NR_rmdir 40
    94	__SYSCALL(__NR_rmdir, sys_rmdir)
    95	#define __NR_dup 41
    96	__SYSCALL(__NR_dup, sys_dup)
    97	#define __NR_pipe 42
    98	__SYSCALL(__NR_pipe, sys_pipe)
    99	#define __NR_times 43
   100	__SYSCALL(__NR_times, compat_sys_times)
   101				/* 44 was sys_prof */
   102	__SYSCALL(44, sys_ni_syscall)
   103	#define __NR_brk 45
   104	__SYSCALL(__NR_brk, sys_brk)
   105	#define __NR_setgid 46
   106	__SYSCALL(__NR_setgid, sys_setgid16)
   107	#define __NR_getgid 47
   108	__SYSCALL(__NR_getgid, sys_getgid16)
   109				/* 48 was sys_signal */
   110	__SYSCALL(48, sys_ni_syscall)
   111	#define __NR_geteuid 49
   112	__SYSCALL(__NR_geteuid, sys_geteuid16)
   113	#define __NR_getegid 50
   114	__SYSCALL(__NR_getegid, sys_getegid16)
   115	#define __NR_acct 51
   116	__SYSCALL(__NR_acct, sys_acct)
   117	#define __NR_umount2 52
   118	__SYSCALL(__NR_umount2, sys_umount)
   119				/* 53 was sys_lock */
   120	__SYSCALL(53, sys_ni_syscall)
   121	#define __NR_ioctl 54
   122	__SYSCALL(__NR_ioctl, compat_sys_ioctl)
   123	#define __NR_fcntl 55
   124	__SYSCALL(__NR_fcntl, compat_sys_fcntl)
   125				/* 56 was sys_mpx */
   126	__SYSCALL(56, sys_ni_syscall)
   127	#define __NR_setpgid 57
   128	__SYSCALL(__NR_setpgid, sys_setpgid)
   129				/* 58 was sys_ulimit */
   130	__SYSCALL(58, sys_ni_syscall)
   131				/* 59 was sys_olduname */
   132	__SYSCALL(59, sys_ni_syscall)
   133	#define __NR_umask 60
   134	__SYSCALL(__NR_umask, sys_umask)
   135	#define __NR_chroot 61
   136	__SYSCALL(__NR_chroot, sys_chroot)
   137	#define __NR_ustat 62
   138	__SYSCALL(__NR_ustat, compat_sys_ustat)
   139	#define __NR_dup2 63
   140	__SYSCALL(__NR_dup2, sys_dup2)
   141	#define __NR_getppid 64
   142	__SYSCALL(__NR_getppid, sys_getppid)
   143	#define __NR_getpgrp 65
   144	__SYSCALL(__NR_getpgrp, sys_getpgrp)
   145	#define __NR_setsid 66
   146	__SYSCALL(__NR_setsid, sys_setsid)
   147	#define __NR_sigaction 67
   148	__SYSCALL(__NR_sigaction, compat_sys_sigaction)
   149				/* 68 was sys_sgetmask */
   150	__SYSCALL(68, sys_ni_syscall)
   151				/* 69 was sys_ssetmask */
   152	__SYSCALL(69, sys_ni_syscall)
   153	#define __NR_setreuid 70
   154	__SYSCALL(__NR_setreuid, sys_setreuid16)
   155	#define __NR_setregid 71
   156	__SYSCALL(__NR_setregid, sys_setregid16)
   157	#define __NR_sigsuspend 72
   158	__SYSCALL(__NR_sigsuspend, sys_sigsuspend)
   159	#define __NR_sigpending 73
   160	__SYSCALL(__NR_sigpending, compat_sys_sigpending)
   161	#define __NR_sethostname 74
   162	__SYSCALL(__NR_sethostname, sys_sethostname)
   163	#define __NR_setrlimit 75
   164	__SYSCALL(__NR_setrlimit, compat_sys_setrlimit)
   165				/* 76 was compat_sys_getrlimit */
   166	__SYSCALL(76, sys_ni_syscall)
   167	#define __NR_getrusage 77
   168	__SYSCALL(__NR_getrusage, compat_sys_getrusage)
   169	#define __NR_gettimeofday 78
   170	__SYSCALL(__NR_gettimeofday, compat_sys_gettimeofday)
   171	#define __NR_settimeofday 79
   172	__SYSCALL(__NR_settimeofday, compat_sys_settimeofday)
   173	#define __NR_getgroups 80
   174	__SYSCALL(__NR_getgroups, sys_getgroups16)
   175	#define __NR_setgroups 81
   176	__SYSCALL(__NR_setgroups, sys_setgroups16)
   177				/* 82 was compat_sys_select */
   178	__SYSCALL(82, sys_ni_syscall)
   179	#define __NR_symlink 83
   180	__SYSCALL(__NR_symlink, sys_symlink)
   181				/* 84 was sys_lstat */
   182	__SYSCALL(84, sys_ni_syscall)
   183	#define __NR_readlink 85
   184	__SYSCALL(__NR_readlink, sys_readlink)
   185	#define __NR_uselib 86
   186	__SYSCALL(__NR_uselib, sys_uselib)
   187	#define __NR_swapon 87
   188	__SYSCALL(__NR_swapon, sys_swapon)
   189	#define __NR_reboot 88
   190	__SYSCALL(__NR_reboot, sys_reboot)
   191				/* 89 was sys_readdir */
   192	__SYSCALL(89, sys_ni_syscall)
   193				/* 90 was sys_mmap */
   194	__SYSCALL(90, sys_ni_syscall)
   195	#define __NR_munmap 91
   196	__SYSCALL(__NR_munmap, sys_munmap)
   197	#define __NR_truncate 92
   198	__SYSCALL(__NR_truncate, compat_sys_truncate)
   199	#define __NR_ftruncate 93
   200	__SYSCALL(__NR_ftruncate, compat_sys_ftruncate)
   201	#define __NR_fchmod 94
   202	__SYSCALL(__NR_fchmod, sys_fchmod)
   203	#define __NR_fchown 95
   204	__SYSCALL(__NR_fchown, sys_fchown16)
   205	#define __NR_getpriority 96
   206	__SYSCALL(__NR_getpriority, sys_getpriority)
   207	#define __NR_setpriority 97
   208	__SYSCALL(__NR_setpriority, sys_setpriority)
   209				/* 98 was sys_profil */
   210	__SYSCALL(98, sys_ni_syscall)
   211	#define __NR_statfs 99
   212	__SYSCALL(__NR_statfs, compat_sys_statfs)
   213	#define __NR_fstatfs 100
   214	__SYSCALL(__NR_fstatfs, compat_sys_fstatfs)
   215				/* 101 was sys_ioperm */
   216	__SYSCALL(101, sys_ni_syscall)
   217				/* 102 was sys_socketcall */
   218	__SYSCALL(102, sys_ni_syscall)
   219	#define __NR_syslog 103
   220	__SYSCALL(__NR_syslog, sys_syslog)
   221	#define __NR_setitimer 104
   222	__SYSCALL(__NR_setitimer, compat_sys_setitimer)
   223	#define __NR_getitimer 105
   224	__SYSCALL(__NR_getitimer, compat_sys_getitimer)
   225	#define __NR_stat 106
   226	__SYSCALL(__NR_stat, compat_sys_newstat)
   227	#define __NR_lstat 107
   228	__SYSCALL(__NR_lstat, compat_sys_newlstat)
   229	#define __NR_fstat 108
   230	__SYSCALL(__NR_fstat, compat_sys_newfstat)
   231				/* 109 was sys_uname */
   232	__SYSCALL(109, sys_ni_syscall)
   233				/* 110 was sys_iopl */
   234	__SYSCALL(110, sys_ni_syscall)
   235	#define __NR_vhangup 111
   236	__SYSCALL(__NR_vhangup, sys_vhangup)
   237				/* 112 was sys_idle */
   238	__SYSCALL(112, sys_ni_syscall)
   239				/* 113 was sys_syscall */
   240	__SYSCALL(113, sys_ni_syscall)
   241	#define __NR_wait4 114
   242	__SYSCALL(__NR_wait4, compat_sys_wait4)
   243	#define __NR_swapoff 115
   244	__SYSCALL(__NR_swapoff, sys_swapoff)
   245	#define __NR_sysinfo 116
   246	__SYSCALL(__NR_sysinfo, compat_sys_sysinfo)
   247				/* 117 was sys_ipc */
   248	__SYSCALL(117, sys_ni_syscall)
   249	#define __NR_fsync 118
   250	__SYSCALL(__NR_fsync, sys_fsync)
   251	#define __NR_sigreturn 119
   252	__SYSCALL(__NR_sigreturn, compat_sys_sigreturn)
   253	#define __NR_clone 120
   254	__SYSCALL(__NR_clone, sys_clone)
   255	#define __NR_setdomainname 121
   256	__SYSCALL(__NR_setdomainname, sys_setdomainname)
   257	#define __NR_uname 122
   258	__SYSCALL(__NR_uname, sys_newuname)
   259				/* 123 was sys_modify_ldt */
   260	__SYSCALL(123, sys_ni_syscall)
   261	#define __NR_adjtimex 124
   262	__SYSCALL(__NR_adjtimex, sys_adjtimex_time32)
   263	#define __NR_mprotect 125
   264	__SYSCALL(__NR_mprotect, sys_mprotect)
   265	#define __NR_sigprocmask 126
   266	__SYSCALL(__NR_sigprocmask, compat_sys_sigprocmask)
   267				/* 127 was sys_create_module */
   268	__SYSCALL(127, sys_ni_syscall)
   269	#define __NR_init_module 128
   270	__SYSCALL(__NR_init_module, sys_init_module)
   271	#define __NR_delete_module 129
   272	__SYSCALL(__NR_delete_module, sys_delete_module)
   273				/* 130 was sys_get_kernel_syms */
   274	__SYSCALL(130, sys_ni_syscall)
   275	#define __NR_quotactl 131
   276	__SYSCALL(__NR_quotactl, sys_quotactl)
   277	#define __NR_getpgid 132
   278	__SYSCALL(__NR_getpgid, sys_getpgid)
   279	#define __NR_fchdir 133
   280	__SYSCALL(__NR_fchdir, sys_fchdir)
   281	#define __NR_bdflush 134
   282	__SYSCALL(__NR_bdflush, sys_bdflush)
   283	#define __NR_sysfs 135
   284	__SYSCALL(__NR_sysfs, sys_sysfs)
   285	#define __NR_personality 136
   286	__SYSCALL(__NR_personality, sys_personality)
   287				/* 137 was sys_afs_syscall */
   288	__SYSCALL(137, sys_ni_syscall)
   289	#define __NR_setfsuid 138
   290	__SYSCALL(__NR_setfsuid, sys_setfsuid16)
   291	#define __NR_setfsgid 139
   292	__SYSCALL(__NR_setfsgid, sys_setfsgid16)
   293	#define __NR__llseek 140
   294	__SYSCALL(__NR__llseek, sys_llseek)
   295	#define __NR_getdents 141
   296	__SYSCALL(__NR_getdents, compat_sys_getdents)
   297	#define __NR__newselect 142
   298	__SYSCALL(__NR__newselect, compat_sys_select)
   299	#define __NR_flock 143
   300	__SYSCALL(__NR_flock, sys_flock)
   301	#define __NR_msync 144
   302	__SYSCALL(__NR_msync, sys_msync)
   303	#define __NR_readv 145
   304	__SYSCALL(__NR_readv, compat_sys_readv)
   305	#define __NR_writev 146
   306	__SYSCALL(__NR_writev, compat_sys_writev)
   307	#define __NR_getsid 147
   308	__SYSCALL(__NR_getsid, sys_getsid)
   309	#define __NR_fdatasync 148
   310	__SYSCALL(__NR_fdatasync, sys_fdatasync)
   311	#define __NR__sysctl 149
   312	__SYSCALL(__NR__sysctl, compat_sys_sysctl)
   313	#define __NR_mlock 150
   314	__SYSCALL(__NR_mlock, sys_mlock)
   315	#define __NR_munlock 151
   316	__SYSCALL(__NR_munlock, sys_munlock)
   317	#define __NR_mlockall 152
   318	__SYSCALL(__NR_mlockall, sys_mlockall)
   319	#define __NR_munlockall 153
   320	__SYSCALL(__NR_munlockall, sys_munlockall)
   321	#define __NR_sched_setparam 154
   322	__SYSCALL(__NR_sched_setparam, sys_sched_setparam)
   323	#define __NR_sched_getparam 155
   324	__SYSCALL(__NR_sched_getparam, sys_sched_getparam)
   325	#define __NR_sched_setscheduler 156
   326	__SYSCALL(__NR_sched_setscheduler, sys_sched_setscheduler)
   327	#define __NR_sched_getscheduler 157
   328	__SYSCALL(__NR_sched_getscheduler, sys_sched_getscheduler)
   329	#define __NR_sched_yield 158
   330	__SYSCALL(__NR_sched_yield, sys_sched_yield)
   331	#define __NR_sched_get_priority_max 159
   332	__SYSCALL(__NR_sched_get_priority_max, sys_sched_get_priority_max)
   333	#define __NR_sched_get_priority_min 160
   334	__SYSCALL(__NR_sched_get_priority_min, sys_sched_get_priority_min)
   335	#define __NR_sched_rr_get_interval 161
   336	__SYSCALL(__NR_sched_rr_get_interval, sys_sched_rr_get_interval_time32)
   337	#define __NR_nanosleep 162
   338	__SYSCALL(__NR_nanosleep, sys_nanosleep_time32)
   339	#define __NR_mremap 163
   340	__SYSCALL(__NR_mremap, sys_mremap)
   341	#define __NR_setresuid 164
   342	__SYSCALL(__NR_setresuid, sys_setresuid16)
   343	#define __NR_getresuid 165
   344	__SYSCALL(__NR_getresuid, sys_getresuid16)
   345				/* 166 was sys_vm86 */
   346	__SYSCALL(166, sys_ni_syscall)
   347				/* 167 was sys_query_module */
   348	__SYSCALL(167, sys_ni_syscall)
   349	#define __NR_poll 168
   350	__SYSCALL(__NR_poll, sys_poll)
   351	#define __NR_nfsservctl 169
   352	__SYSCALL(__NR_nfsservctl, sys_ni_syscall)
   353	#define __NR_setresgid 170
   354	__SYSCALL(__NR_setresgid, sys_setresgid16)
   355	#define __NR_getresgid 171
   356	__SYSCALL(__NR_getresgid, sys_getresgid16)
   357	#define __NR_prctl 172
   358	__SYSCALL(__NR_prctl, sys_prctl)
   359	#define __NR_rt_sigreturn 173
   360	__SYSCALL(__NR_rt_sigreturn, compat_sys_rt_sigreturn)
   361	#define __NR_rt_sigaction 174
   362	__SYSCALL(__NR_rt_sigaction, compat_sys_rt_sigaction)
   363	#define __NR_rt_sigprocmask 175
   364	__SYSCALL(__NR_rt_sigprocmask, compat_sys_rt_sigprocmask)
   365	#define __NR_rt_sigpending 176
   366	__SYSCALL(__NR_rt_sigpending, compat_sys_rt_sigpending)
   367	#define __NR_rt_sigtimedwait 177
   368	__SYSCALL(__NR_rt_sigtimedwait, compat_sys_rt_sigtimedwait_time32)
   369	#define __NR_rt_sigqueueinfo 178
   370	__SYSCALL(__NR_rt_sigqueueinfo, compat_sys_rt_sigqueueinfo)
   371	#define __NR_rt_sigsuspend 179
   372	__SYSCALL(__NR_rt_sigsuspend, compat_sys_rt_sigsuspend)
   373	#define __NR_pread64 180
   374	__SYSCALL(__NR_pread64, compat_sys_aarch32_pread64)
   375	#define __NR_pwrite64 181
   376	__SYSCALL(__NR_pwrite64, compat_sys_aarch32_pwrite64)
   377	#define __NR_chown 182
   378	__SYSCALL(__NR_chown, sys_chown16)
   379	#define __NR_getcwd 183
   380	__SYSCALL(__NR_getcwd, sys_getcwd)
   381	#define __NR_capget 184
   382	__SYSCALL(__NR_capget, sys_capget)
   383	#define __NR_capset 185
   384	__SYSCALL(__NR_capset, sys_capset)
   385	#define __NR_sigaltstack 186
   386	__SYSCALL(__NR_sigaltstack, compat_sys_sigaltstack)
   387	#define __NR_sendfile 187
   388	__SYSCALL(__NR_sendfile, compat_sys_sendfile)
   389				/* 188 reserved */
   390	__SYSCALL(188, sys_ni_syscall)
   391				/* 189 reserved */
   392	__SYSCALL(189, sys_ni_syscall)
   393	#define __NR_vfork 190
   394	__SYSCALL(__NR_vfork, sys_vfork)
   395	#define __NR_ugetrlimit 191	/* SuS compliant getrlimit */
   396	__SYSCALL(__NR_ugetrlimit, compat_sys_getrlimit)		/* SuS compliant getrlimit */
   397	#define __NR_mmap2 192
   398	__SYSCALL(__NR_mmap2, compat_sys_aarch32_mmap2)
   399	#define __NR_truncate64 193
   400	__SYSCALL(__NR_truncate64, compat_sys_aarch32_truncate64)
   401	#define __NR_ftruncate64 194
   402	__SYSCALL(__NR_ftruncate64, compat_sys_aarch32_ftruncate64)
   403	#define __NR_stat64 195
   404	__SYSCALL(__NR_stat64, sys_stat64)
   405	#define __NR_lstat64 196
   406	__SYSCALL(__NR_lstat64, sys_lstat64)
   407	#define __NR_fstat64 197
   408	__SYSCALL(__NR_fstat64, sys_fstat64)
   409	#define __NR_lchown32 198
   410	__SYSCALL(__NR_lchown32, sys_lchown)
   411	#define __NR_getuid32 199
   412	__SYSCALL(__NR_getuid32, sys_getuid)
   413	#define __NR_getgid32 200
   414	__SYSCALL(__NR_getgid32, sys_getgid)
   415	#define __NR_geteuid32 201
   416	__SYSCALL(__NR_geteuid32, sys_geteuid)
   417	#define __NR_getegid32 202
   418	__SYSCALL(__NR_getegid32, sys_getegid)
   419	#define __NR_setreuid32 203
   420	__SYSCALL(__NR_setreuid32, sys_setreuid)
   421	#define __NR_setregid32 204
   422	__SYSCALL(__NR_setregid32, sys_setregid)
   423	#define __NR_getgroups32 205
   424	__SYSCALL(__NR_getgroups32, sys_getgroups)
   425	#define __NR_setgroups32 206
   426	__SYSCALL(__NR_setgroups32, sys_setgroups)
   427	#define __NR_fchown32 207
   428	__SYSCALL(__NR_fchown32, sys_fchown)
   429	#define __NR_setresuid32 208
   430	__SYSCALL(__NR_setresuid32, sys_setresuid)
   431	#define __NR_getresuid32 209
   432	__SYSCALL(__NR_getresuid32, sys_getresuid)
   433	#define __NR_setresgid32 210
   434	__SYSCALL(__NR_setresgid32, sys_setresgid)
   435	#define __NR_getresgid32 211
   436	__SYSCALL(__NR_getresgid32, sys_getresgid)
   437	#define __NR_chown32 212
   438	__SYSCALL(__NR_chown32, sys_chown)
   439	#define __NR_setuid32 213
   440	__SYSCALL(__NR_setuid32, sys_setuid)
   441	#define __NR_setgid32 214
   442	__SYSCALL(__NR_setgid32, sys_setgid)
   443	#define __NR_setfsuid32 215
   444	__SYSCALL(__NR_setfsuid32, sys_setfsuid)
   445	#define __NR_setfsgid32 216
   446	__SYSCALL(__NR_setfsgid32, sys_setfsgid)
   447	#define __NR_getdents64 217
   448	__SYSCALL(__NR_getdents64, sys_getdents64)
   449	#define __NR_pivot_root 218
   450	__SYSCALL(__NR_pivot_root, sys_pivot_root)
   451	#define __NR_mincore 219
   452	__SYSCALL(__NR_mincore, sys_mincore)
   453	#define __NR_madvise 220
   454	__SYSCALL(__NR_madvise, sys_madvise)
   455	#define __NR_fcntl64 221
   456	__SYSCALL(__NR_fcntl64, compat_sys_fcntl64)
   457				/* 222 for tux */
   458	__SYSCALL(222, sys_ni_syscall)
   459				/* 223 is unused */
   460	__SYSCALL(223, sys_ni_syscall)
   461	#define __NR_gettid 224
   462	__SYSCALL(__NR_gettid, sys_gettid)
   463	#define __NR_readahead 225
   464	__SYSCALL(__NR_readahead, compat_sys_aarch32_readahead)
   465	#define __NR_setxattr 226
   466	__SYSCALL(__NR_setxattr, sys_setxattr)
   467	#define __NR_lsetxattr 227
   468	__SYSCALL(__NR_lsetxattr, sys_lsetxattr)
   469	#define __NR_fsetxattr 228
   470	__SYSCALL(__NR_fsetxattr, sys_fsetxattr)
   471	#define __NR_getxattr 229
   472	__SYSCALL(__NR_getxattr, sys_getxattr)
   473	#define __NR_lgetxattr 230
   474	__SYSCALL(__NR_lgetxattr, sys_lgetxattr)
   475	#define __NR_fgetxattr 231
   476	__SYSCALL(__NR_fgetxattr, sys_fgetxattr)
   477	#define __NR_listxattr 232
   478	__SYSCALL(__NR_listxattr, sys_listxattr)
   479	#define __NR_llistxattr 233
   480	__SYSCALL(__NR_llistxattr, sys_llistxattr)
   481	#define __NR_flistxattr 234
   482	__SYSCALL(__NR_flistxattr, sys_flistxattr)
   483	#define __NR_removexattr 235
   484	__SYSCALL(__NR_removexattr, sys_removexattr)
   485	#define __NR_lremovexattr 236
   486	__SYSCALL(__NR_lremovexattr, sys_lremovexattr)
   487	#define __NR_fremovexattr 237
   488	__SYSCALL(__NR_fremovexattr, sys_fremovexattr)
   489	#define __NR_tkill 238
   490	__SYSCALL(__NR_tkill, sys_tkill)
   491	#define __NR_sendfile64 239
   492	__SYSCALL(__NR_sendfile64, sys_sendfile64)
   493	#define __NR_futex 240
   494	__SYSCALL(__NR_futex, sys_futex_time32)
   495	#define __NR_sched_setaffinity 241
   496	__SYSCALL(__NR_sched_setaffinity, compat_sys_sched_setaffinity)
   497	#define __NR_sched_getaffinity 242
   498	__SYSCALL(__NR_sched_getaffinity, compat_sys_sched_getaffinity)
   499	#define __NR_io_setup 243
   500	__SYSCALL(__NR_io_setup, compat_sys_io_setup)
   501	#define __NR_io_destroy 244
   502	__SYSCALL(__NR_io_destroy, sys_io_destroy)
   503	#define __NR_io_getevents 245
   504	__SYSCALL(__NR_io_getevents, sys_io_getevents_time32)
   505	#define __NR_io_submit 246
   506	__SYSCALL(__NR_io_submit, compat_sys_io_submit)
   507	#define __NR_io_cancel 247
   508	__SYSCALL(__NR_io_cancel, sys_io_cancel)
   509	#define __NR_exit_group 248
   510	__SYSCALL(__NR_exit_group, sys_exit_group)
   511	#define __NR_lookup_dcookie 249
   512	__SYSCALL(__NR_lookup_dcookie, compat_sys_lookup_dcookie)
   513	#define __NR_epoll_create 250
   514	__SYSCALL(__NR_epoll_create, sys_epoll_create)
   515	#define __NR_epoll_ctl 251
   516	__SYSCALL(__NR_epoll_ctl, sys_epoll_ctl)
   517	#define __NR_epoll_wait 252
   518	__SYSCALL(__NR_epoll_wait, sys_epoll_wait)
   519	#define __NR_remap_file_pages 253
   520	__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages)
   521				/* 254 for set_thread_area */
   522	__SYSCALL(254, sys_ni_syscall)
   523				/* 255 for get_thread_area */
   524	__SYSCALL(255, sys_ni_syscall)
   525	#define __NR_set_tid_address 256
   526	__SYSCALL(__NR_set_tid_address, sys_set_tid_address)
   527	#define __NR_timer_create 257
   528	__SYSCALL(__NR_timer_create, compat_sys_timer_create)
   529	#define __NR_timer_settime 258
   530	__SYSCALL(__NR_timer_settime, sys_timer_settime32)
   531	#define __NR_timer_gettime 259
   532	__SYSCALL(__NR_timer_gettime, sys_timer_gettime32)
   533	#define __NR_timer_getoverrun 260
   534	__SYSCALL(__NR_timer_getoverrun, sys_timer_getoverrun)
   535	#define __NR_timer_delete 261
   536	__SYSCALL(__NR_timer_delete, sys_timer_delete)
   537	#define __NR_clock_settime 262
   538	__SYSCALL(__NR_clock_settime, sys_clock_settime32)
   539	#define __NR_clock_gettime 263
   540	__SYSCALL(__NR_clock_gettime, sys_clock_gettime32)
   541	#define __NR_clock_getres 264
   542	__SYSCALL(__NR_clock_getres, sys_clock_getres_time32)
   543	#define __NR_clock_nanosleep 265
   544	__SYSCALL(__NR_clock_nanosleep, sys_clock_nanosleep_time32)
   545	#define __NR_statfs64 266
   546	__SYSCALL(__NR_statfs64, compat_sys_aarch32_statfs64)
   547	#define __NR_fstatfs64 267
   548	__SYSCALL(__NR_fstatfs64, compat_sys_aarch32_fstatfs64)
   549	#define __NR_tgkill 268
   550	__SYSCALL(__NR_tgkill, sys_tgkill)
   551	#define __NR_utimes 269
   552	__SYSCALL(__NR_utimes, sys_utimes_time32)
   553	#define __NR_arm_fadvise64_64 270
   554	__SYSCALL(__NR_arm_fadvise64_64, compat_sys_aarch32_fadvise64_64)
   555	#define __NR_pciconfig_iobase 271
   556	__SYSCALL(__NR_pciconfig_iobase, sys_pciconfig_iobase)
   557	#define __NR_pciconfig_read 272
   558	__SYSCALL(__NR_pciconfig_read, sys_pciconfig_read)
   559	#define __NR_pciconfig_write 273
   560	__SYSCALL(__NR_pciconfig_write, sys_pciconfig_write)
   561	#define __NR_mq_open 274
   562	__SYSCALL(__NR_mq_open, compat_sys_mq_open)
   563	#define __NR_mq_unlink 275
   564	__SYSCALL(__NR_mq_unlink, sys_mq_unlink)
   565	#define __NR_mq_timedsend 276
   566	__SYSCALL(__NR_mq_timedsend, sys_mq_timedsend_time32)
   567	#define __NR_mq_timedreceive 277
   568	__SYSCALL(__NR_mq_timedreceive, sys_mq_timedreceive_time32)
   569	#define __NR_mq_notify 278
   570	__SYSCALL(__NR_mq_notify, compat_sys_mq_notify)
   571	#define __NR_mq_getsetattr 279
   572	__SYSCALL(__NR_mq_getsetattr, compat_sys_mq_getsetattr)
   573	#define __NR_waitid 280
   574	__SYSCALL(__NR_waitid, compat_sys_waitid)
   575	#define __NR_socket 281
   576	__SYSCALL(__NR_socket, sys_socket)
   577	#define __NR_bind 282
   578	__SYSCALL(__NR_bind, sys_bind)
   579	#define __NR_connect 283
   580	__SYSCALL(__NR_connect, sys_connect)
   581	#define __NR_listen 284
   582	__SYSCALL(__NR_listen, sys_listen)
   583	#define __NR_accept 285
   584	__SYSCALL(__NR_accept, sys_accept)
   585	#define __NR_getsockname 286
   586	__SYSCALL(__NR_getsockname, sys_getsockname)
   587	#define __NR_getpeername 287
   588	__SYSCALL(__NR_getpeername, sys_getpeername)
   589	#define __NR_socketpair 288
   590	__SYSCALL(__NR_socketpair, sys_socketpair)
   591	#define __NR_send 289
   592	__SYSCALL(__NR_send, sys_send)
   593	#define __NR_sendto 290
   594	__SYSCALL(__NR_sendto, sys_sendto)
   595	#define __NR_recv 291
   596	__SYSCALL(__NR_recv, compat_sys_recv)
   597	#define __NR_recvfrom 292
   598	__SYSCALL(__NR_recvfrom, compat_sys_recvfrom)
   599	#define __NR_shutdown 293
   600	__SYSCALL(__NR_shutdown, sys_shutdown)
   601	#define __NR_setsockopt 294
   602	__SYSCALL(__NR_setsockopt, compat_sys_setsockopt)
   603	#define __NR_getsockopt 295
   604	__SYSCALL(__NR_getsockopt, compat_sys_getsockopt)
   605	#define __NR_sendmsg 296
   606	__SYSCALL(__NR_sendmsg, compat_sys_sendmsg)
   607	#define __NR_recvmsg 297
   608	__SYSCALL(__NR_recvmsg, compat_sys_recvmsg)
   609	#define __NR_semop 298
   610	__SYSCALL(__NR_semop, sys_semop)
   611	#define __NR_semget 299
   612	__SYSCALL(__NR_semget, sys_semget)
   613	#define __NR_semctl 300
   614	__SYSCALL(__NR_semctl, compat_sys_old_semctl)
   615	#define __NR_msgsnd 301
   616	__SYSCALL(__NR_msgsnd, compat_sys_msgsnd)
   617	#define __NR_msgrcv 302
   618	__SYSCALL(__NR_msgrcv, compat_sys_msgrcv)
   619	#define __NR_msgget 303
   620	__SYSCALL(__NR_msgget, sys_msgget)
   621	#define __NR_msgctl 304
   622	__SYSCALL(__NR_msgctl, compat_sys_old_msgctl)
   623	#define __NR_shmat 305
   624	__SYSCALL(__NR_shmat, compat_sys_shmat)
   625	#define __NR_shmdt 306
   626	__SYSCALL(__NR_shmdt, sys_shmdt)
   627	#define __NR_shmget 307
   628	__SYSCALL(__NR_shmget, sys_shmget)
   629	#define __NR_shmctl 308
   630	__SYSCALL(__NR_shmctl, compat_sys_old_shmctl)
   631	#define __NR_add_key 309
   632	__SYSCALL(__NR_add_key, sys_add_key)
   633	#define __NR_request_key 310
   634	__SYSCALL(__NR_request_key, sys_request_key)
   635	#define __NR_keyctl 311
   636	__SYSCALL(__NR_keyctl, compat_sys_keyctl)
   637	#define __NR_semtimedop 312
   638	__SYSCALL(__NR_semtimedop, sys_semtimedop_time32)
   639	#define __NR_vserver 313
   640	__SYSCALL(__NR_vserver, sys_ni_syscall)
   641	#define __NR_ioprio_set 314
   642	__SYSCALL(__NR_ioprio_set, sys_ioprio_set)
   643	#define __NR_ioprio_get 315
   644	__SYSCALL(__NR_ioprio_get, sys_ioprio_get)
   645	#define __NR_inotify_init 316
   646	__SYSCALL(__NR_inotify_init, sys_inotify_init)
   647	#define __NR_inotify_add_watch 317
   648	__SYSCALL(__NR_inotify_add_watch, sys_inotify_add_watch)
   649	#define __NR_inotify_rm_watch 318
   650	__SYSCALL(__NR_inotify_rm_watch, sys_inotify_rm_watch)
   651	#define __NR_mbind 319
   652	__SYSCALL(__NR_mbind, compat_sys_mbind)
   653	#define __NR_get_mempolicy 320
   654	__SYSCALL(__NR_get_mempolicy, compat_sys_get_mempolicy)
   655	#define __NR_set_mempolicy 321
   656	__SYSCALL(__NR_set_mempolicy, compat_sys_set_mempolicy)
   657	#define __NR_openat 322
   658	__SYSCALL(__NR_openat, compat_sys_openat)
   659	#define __NR_mkdirat 323
   660	__SYSCALL(__NR_mkdirat, sys_mkdirat)
   661	#define __NR_mknodat 324
   662	__SYSCALL(__NR_mknodat, sys_mknodat)
   663	#define __NR_fchownat 325
   664	__SYSCALL(__NR_fchownat, sys_fchownat)
   665	#define __NR_futimesat 326
   666	__SYSCALL(__NR_futimesat, sys_futimesat_time32)
   667	#define __NR_fstatat64 327
   668	__SYSCALL(__NR_fstatat64, sys_fstatat64)
   669	#define __NR_unlinkat 328
   670	__SYSCALL(__NR_unlinkat, sys_unlinkat)
   671	#define __NR_renameat 329
   672	__SYSCALL(__NR_renameat, sys_renameat)
   673	#define __NR_linkat 330
   674	__SYSCALL(__NR_linkat, sys_linkat)
   675	#define __NR_symlinkat 331
   676	__SYSCALL(__NR_symlinkat, sys_symlinkat)
   677	#define __NR_readlinkat 332
   678	__SYSCALL(__NR_readlinkat, sys_readlinkat)
   679	#define __NR_fchmodat 333
   680	__SYSCALL(__NR_fchmodat, sys_fchmodat)
   681	#define __NR_faccessat 334
   682	__SYSCALL(__NR_faccessat, sys_faccessat)
   683	#define __NR_pselect6 335
   684	__SYSCALL(__NR_pselect6, compat_sys_pselect6_time32)
   685	#define __NR_ppoll 336
   686	__SYSCALL(__NR_ppoll, compat_sys_ppoll_time32)
   687	#define __NR_unshare 337
   688	__SYSCALL(__NR_unshare, sys_unshare)
   689	#define __NR_set_robust_list 338
   690	__SYSCALL(__NR_set_robust_list, compat_sys_set_robust_list)
   691	#define __NR_get_robust_list 339
   692	__SYSCALL(__NR_get_robust_list, compat_sys_get_robust_list)
   693	#define __NR_splice 340
   694	__SYSCALL(__NR_splice, sys_splice)
   695	#define __NR_sync_file_range2 341
   696	__SYSCALL(__NR_sync_file_range2, compat_sys_aarch32_sync_file_range2)
   697	#define __NR_tee 342
   698	__SYSCALL(__NR_tee, sys_tee)
   699	#define __NR_vmsplice 343
   700	__SYSCALL(__NR_vmsplice, compat_sys_vmsplice)
   701	#define __NR_move_pages 344
   702	__SYSCALL(__NR_move_pages, compat_sys_move_pages)
   703	#define __NR_getcpu 345
   704	__SYSCALL(__NR_getcpu, sys_getcpu)
   705	#define __NR_epoll_pwait 346
   706	__SYSCALL(__NR_epoll_pwait, compat_sys_epoll_pwait)
   707	#define __NR_kexec_load 347
   708	__SYSCALL(__NR_kexec_load, compat_sys_kexec_load)
   709	#define __NR_utimensat 348
   710	__SYSCALL(__NR_utimensat, sys_utimensat_time32)
   711	#define __NR_signalfd 349
   712	__SYSCALL(__NR_signalfd, compat_sys_signalfd)
   713	#define __NR_timerfd_create 350
   714	__SYSCALL(__NR_timerfd_create, sys_timerfd_create)
   715	#define __NR_eventfd 351
   716	__SYSCALL(__NR_eventfd, sys_eventfd)
   717	#define __NR_fallocate 352
   718	__SYSCALL(__NR_fallocate, compat_sys_aarch32_fallocate)
   719	#define __NR_timerfd_settime 353
   720	__SYSCALL(__NR_timerfd_settime, sys_timerfd_settime32)
   721	#define __NR_timerfd_gettime 354
   722	__SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime32)
   723	#define __NR_signalfd4 355
   724	__SYSCALL(__NR_signalfd4, compat_sys_signalfd4)
   725	#define __NR_eventfd2 356
   726	__SYSCALL(__NR_eventfd2, sys_eventfd2)
   727	#define __NR_epoll_create1 357
   728	__SYSCALL(__NR_epoll_create1, sys_epoll_create1)
   729	#define __NR_dup3 358
   730	__SYSCALL(__NR_dup3, sys_dup3)
   731	#define __NR_pipe2 359
   732	__SYSCALL(__NR_pipe2, sys_pipe2)
   733	#define __NR_inotify_init1 360
   734	__SYSCALL(__NR_inotify_init1, sys_inotify_init1)
   735	#define __NR_preadv 361
   736	__SYSCALL(__NR_preadv, compat_sys_preadv)
   737	#define __NR_pwritev 362
   738	__SYSCALL(__NR_pwritev, compat_sys_pwritev)
   739	#define __NR_rt_tgsigqueueinfo 363
   740	__SYSCALL(__NR_rt_tgsigqueueinfo, compat_sys_rt_tgsigqueueinfo)
   741	#define __NR_perf_event_open 364
   742	__SYSCALL(__NR_perf_event_open, sys_perf_event_open)
   743	#define __NR_recvmmsg 365
   744	__SYSCALL(__NR_recvmmsg, compat_sys_recvmmsg_time32)
   745	#define __NR_accept4 366
   746	__SYSCALL(__NR_accept4, sys_accept4)
   747	#define __NR_fanotify_init 367
   748	__SYSCALL(__NR_fanotify_init, sys_fanotify_init)
   749	#define __NR_fanotify_mark 368
   750	__SYSCALL(__NR_fanotify_mark, compat_sys_fanotify_mark)
   751	#define __NR_prlimit64 369
   752	__SYSCALL(__NR_prlimit64, sys_prlimit64)
   753	#define __NR_name_to_handle_at 370
   754	__SYSCALL(__NR_name_to_handle_at, sys_name_to_handle_at)
   755	#define __NR_open_by_handle_at 371
   756	__SYSCALL(__NR_open_by_handle_at, compat_sys_open_by_handle_at)
   757	#define __NR_clock_adjtime 372
   758	__SYSCALL(__NR_clock_adjtime, sys_clock_adjtime32)
   759	#define __NR_syncfs 373
   760	__SYSCALL(__NR_syncfs, sys_syncfs)
   761	#define __NR_sendmmsg 374
   762	__SYSCALL(__NR_sendmmsg, compat_sys_sendmmsg)
   763	#define __NR_setns 375
   764	__SYSCALL(__NR_setns, sys_setns)
   765	#define __NR_process_vm_readv 376
   766	__SYSCALL(__NR_process_vm_readv, compat_sys_process_vm_readv)
   767	#define __NR_process_vm_writev 377
   768	__SYSCALL(__NR_process_vm_writev, compat_sys_process_vm_writev)
   769	#define __NR_kcmp 378
   770	__SYSCALL(__NR_kcmp, sys_kcmp)
   771	#define __NR_finit_module 379
   772	__SYSCALL(__NR_finit_module, sys_finit_module)
   773	#define __NR_sched_setattr 380
   774	__SYSCALL(__NR_sched_setattr, sys_sched_setattr)
   775	#define __NR_sched_getattr 381
   776	__SYSCALL(__NR_sched_getattr, sys_sched_getattr)
   777	#define __NR_renameat2 382
   778	__SYSCALL(__NR_renameat2, sys_renameat2)
   779	#define __NR_seccomp 383
   780	__SYSCALL(__NR_seccomp, sys_seccomp)
   781	#define __NR_getrandom 384
   782	__SYSCALL(__NR_getrandom, sys_getrandom)
   783	#define __NR_memfd_create 385
   784	__SYSCALL(__NR_memfd_create, sys_memfd_create)
   785	#define __NR_bpf 386
   786	__SYSCALL(__NR_bpf, sys_bpf)
   787	#define __NR_execveat 387
   788	__SYSCALL(__NR_execveat, compat_sys_execveat)
   789	#define __NR_userfaultfd 388
   790	__SYSCALL(__NR_userfaultfd, sys_userfaultfd)
   791	#define __NR_membarrier 389
   792	__SYSCALL(__NR_membarrier, sys_membarrier)
   793	#define __NR_mlock2 390
   794	__SYSCALL(__NR_mlock2, sys_mlock2)
   795	#define __NR_copy_file_range 391
   796	__SYSCALL(__NR_copy_file_range, sys_copy_file_range)
   797	#define __NR_preadv2 392
   798	__SYSCALL(__NR_preadv2, compat_sys_preadv2)
   799	#define __NR_pwritev2 393
   800	__SYSCALL(__NR_pwritev2, compat_sys_pwritev2)
   801	#define __NR_pkey_mprotect 394
   802	__SYSCALL(__NR_pkey_mprotect, sys_pkey_mprotect)
   803	#define __NR_pkey_alloc 395
   804	__SYSCALL(__NR_pkey_alloc, sys_pkey_alloc)
   805	#define __NR_pkey_free 396
   806	__SYSCALL(__NR_pkey_free, sys_pkey_free)
   807	#define __NR_statx 397
   808	__SYSCALL(__NR_statx, sys_statx)
   809	#define __NR_rseq 398
   810	__SYSCALL(__NR_rseq, sys_rseq)
   811	#define __NR_io_pgetevents 399
   812	__SYSCALL(__NR_io_pgetevents, compat_sys_io_pgetevents)
   813	#define __NR_migrate_pages 400
   814	__SYSCALL(__NR_migrate_pages, compat_sys_migrate_pages)
   815	#define __NR_kexec_file_load 401
   816	__SYSCALL(__NR_kexec_file_load, sys_kexec_file_load)
   817	/* 402 is unused */
   818	#define __NR_clock_gettime64 403
   819	__SYSCALL(__NR_clock_gettime64, sys_clock_gettime)
   820	#define __NR_clock_settime64 404
   821	__SYSCALL(__NR_clock_settime64, sys_clock_settime)
   822	#define __NR_clock_adjtime64 405
   823	__SYSCALL(__NR_clock_adjtime64, sys_clock_adjtime)
   824	#define __NR_clock_getres_time64 406
   825	__SYSCALL(__NR_clock_getres_time64, sys_clock_getres)
   826	#define __NR_clock_nanosleep_time64 407
   827	__SYSCALL(__NR_clock_nanosleep_time64, sys_clock_nanosleep)
   828	#define __NR_timer_gettime64 408
   829	__SYSCALL(__NR_timer_gettime64, sys_timer_gettime)
   830	#define __NR_timer_settime64 409
   831	__SYSCALL(__NR_timer_settime64, sys_timer_settime)
   832	#define __NR_timerfd_gettime64 410
   833	__SYSCALL(__NR_timerfd_gettime64, sys_timerfd_gettime)
   834	#define __NR_timerfd_settime64 411
   835	__SYSCALL(__NR_timerfd_settime64, sys_timerfd_settime)
   836	#define __NR_utimensat_time64 412
   837	__SYSCALL(__NR_utimensat_time64, sys_utimensat)
   838	#define __NR_pselect6_time64 413
   839	__SYSCALL(__NR_pselect6_time64, compat_sys_pselect6_time64)
   840	#define __NR_ppoll_time64 414
   841	__SYSCALL(__NR_ppoll_time64, compat_sys_ppoll_time64)
   842	#define __NR_io_pgetevents_time64 416
   843	__SYSCALL(__NR_io_pgetevents_time64, sys_io_pgetevents)
   844	#define __NR_recvmmsg_time64 417
   845	__SYSCALL(__NR_recvmmsg_time64, compat_sys_recvmmsg_time64)
   846	#define __NR_mq_timedsend_time64 418
   847	__SYSCALL(__NR_mq_timedsend_time64, sys_mq_timedsend)
   848	#define __NR_mq_timedreceive_time64 419
   849	__SYSCALL(__NR_mq_timedreceive_time64, sys_mq_timedreceive)
   850	#define __NR_semtimedop_time64 420
   851	__SYSCALL(__NR_semtimedop_time64, sys_semtimedop)
   852	#define __NR_rt_sigtimedwait_time64 421
   853	__SYSCALL(__NR_rt_sigtimedwait_time64, compat_sys_rt_sigtimedwait_time64)
   854	#define __NR_futex_time64 422
   855	__SYSCALL(__NR_futex_time64, sys_futex)
   856	#define __NR_sched_rr_get_interval_time64 423
   857	__SYSCALL(__NR_sched_rr_get_interval_time64, sys_sched_rr_get_interval)
   858	#define __NR_pidfd_send_signal 424
   859	__SYSCALL(__NR_pidfd_send_signal, sys_pidfd_send_signal)
   860	#define __NR_io_uring_setup 425
   861	__SYSCALL(__NR_io_uring_setup, sys_io_uring_setup)
   862	#define __NR_io_uring_enter 426
   863	__SYSCALL(__NR_io_uring_enter, sys_io_uring_enter)
   864	#define __NR_io_uring_register 427
   865	__SYSCALL(__NR_io_uring_register, sys_io_uring_register)
   866	#define __NR_open_tree 428
   867	__SYSCALL(__NR_open_tree, sys_open_tree)
   868	#define __NR_move_mount 429
   869	__SYSCALL(__NR_move_mount, sys_move_mount)
   870	#define __NR_fsopen 430
   871	__SYSCALL(__NR_fsopen, sys_fsopen)
   872	#define __NR_fsconfig 431
   873	__SYSCALL(__NR_fsconfig, sys_fsconfig)
   874	#define __NR_fsmount 432
   875	__SYSCALL(__NR_fsmount, sys_fsmount)
   876	#define __NR_fspick 433
   877	__SYSCALL(__NR_fspick, sys_fspick)
   878	#define __NR_pidfd_open 434
   879	__SYSCALL(__NR_pidfd_open, sys_pidfd_open)
   880	#define __NR_clone3 435
   881	__SYSCALL(__NR_clone3, sys_clone3)
   882	#define __NR_openat2 437
   883	__SYSCALL(__NR_openat2, sys_openat2)
   884	#define __NR_pidfd_getfd 438
   885	__SYSCALL(__NR_pidfd_getfd, sys_pidfd_getfd)
   886	#define __NR_faccessat2 439
   887	__SYSCALL(__NR_faccessat2, sys_faccessat2)
 > 888	#define __NR_watch_mount 440
   889	__SYSCALL(__NR_watch_mount, sys_watch_mount)
   890	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 50603 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-07-30 17:33 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-24 13:11 [PATCH 0/4] Mount notifications David Howells
2020-07-24 13:11 ` [PATCH 1/4] watch_queue: Make watch_sizeof() check record size David Howells
2020-07-24 13:11 ` [PATCH 2/4] watch_queue: Add security hooks to rule on setting mount watches David Howells
2020-07-24 13:11 ` [PATCH 3/4] watch_queue: Implement mount topology and attribute change notifications David Howells
2020-07-24 19:14   ` Linus Torvalds
2020-07-24 19:59   ` David Howells
2020-07-24 20:25     ` Linus Torvalds
2020-07-24 20:45     ` David Howells
2020-07-30 17:33   ` kernel test robot
2020-07-24 13:11 ` [PATCH 4/4] watch_queue: sample: Display mount tree " David Howells

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.