[LTP] [PATCH] fix fanotify syscall check on compat kernel

Helge Deller
2014-04-16T19:00:40Z

The fanotify[0-5] testcases use the myfanotify_mark() wrapper for the
fanotify_mark() syscall. But the #define does not take into account, that
the mask field is actually of type _u64 where we need to split the hi
and low word in the syscall on a 32bit arch.

The attached patch converts the #define to a inline function where
the compiler will help to convert the given values to the correct types
(e.g. unsigned long).

Bug found and tested on the parisc/hppa (32bit userspace with 64bit
kernel) arch.

Signed-off-by: Helge Deller <deller@gmx.de>

diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h b/testcases/kernel/syscalls/fanotify/fanotify.h
index a4c2a8f..b13cb7b 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify.h
+++ b/testcases/kernel/syscalls/fanotify/fanotify.h
@@ -28,12 +28,26 @@
#ifndef __FANOTIFY_H__
#define __FANOTIFY_H__

+#include <sys/types.h>
+#include <endian.h>
+#include "config.h"
+#include "linux_syscall_numbers.h"
+
/* fanotify(7) wrappers */

#define myfanotify_init(flags, event_f_flags) \
syscall(__NR_fanotify_init, flags, event_f_flags)

-#define myfanotify_mark(fd, flags, mask, dfd, pathname) \
- syscall(__NR_fanotify_mark, fd, flags, mask, dfd, pathname)
+long myfanotify_mark(int fd, unsigned int flags, unsigned long long mask, int dfd, const char *pathname)
+{
+#if __WORDSIZE == 64
+ return ltp_syscall(__NR_fanotify_mark, fd, flags, mask, dfd, pathname);
+#else
+ return ltp_syscall(__NR_fanotify_mark, fd, flags,
+ __LONG_LONG_PAIR((unsigned long) (mask >> 32),
+ (unsigned long) mask),
+ dfd, (unsigned long) pathname);
+#endif
+}

#endif /* __FANOTIFY_H__ */