* [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,
+ ¬ify->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.