compat: add in_compat_syscall to ask whether we're in a compat syscall
authorAndy Lutomirski <[email protected]>
Tue, 22 Mar 2016 21:24:43 +0000 (14:24 -0700)
committerLinus Torvalds <[email protected]>
Tue, 22 Mar 2016 22:36:02 +0000 (15:36 -0700)
A lot of code currently abuses is_compat_task to determine this.

Signed-off-by: Andy Lutomirski <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: "Theodore Ts'o" <[email protected]>
Cc: Andreas Dilger <[email protected]>
Cc: Clemens Ladisch <[email protected]>
Cc: David Airlie <[email protected]>
Cc: David Herrmann <[email protected]>
Cc: David Miller <[email protected]>
Cc: Dmitry Torokhov <[email protected]>
Cc: Eric Paris <[email protected]>
Cc: Herbert Xu <[email protected]>
Cc: Ingo Molnar <[email protected]>
Acked-by: Jiri Kosina <[email protected]>
Cc: Matt Fleming <[email protected]>
Cc: Neil Horman <[email protected]>
Cc: Oded Gabbay <[email protected]>
Cc: Oleg Drokin <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Paul Moore <[email protected]>
Cc: Sam Ravnborg <[email protected]>
Cc: Steffen Klassert <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Vlad Yasevich <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
include/linux/compat.h

index fe4ccd0c748a401cf33a47862264255285d928fa..f964ef79e0adfc387c46026e05ba52c829c3baa1 100644 (file)
@@ -5,6 +5,8 @@
  * syscall compatibility layer.
  */
 
+#include <linux/types.h>
+
 #ifdef CONFIG_COMPAT
 
 #include <linux/stat.h>
@@ -719,9 +721,22 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
 
 asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32,
                                            int, const char __user *);
+
+/*
+ * For most but not all architectures, "am I in a compat syscall?" and
+ * "am I a compat task?" are the same question.  For architectures on which
+ * they aren't the same question, arch code can override in_compat_syscall.
+ */
+
+#ifndef in_compat_syscall
+static inline bool in_compat_syscall(void) { return is_compat_task(); }
+#endif
+
 #else
 
 #define is_compat_task() (0)
+static inline bool in_compat_syscall(void) { return false; }
 
 #endif /* CONFIG_COMPAT */
+
 #endif /* _LINUX_COMPAT_H */