This patch to some degree reverts my last patch which was committed as:
  commit 5d08e164964e19be693e6e8fddf3afb82e505b4f
  Author: Helge Deller <[email protected]>
  Date:   Wed Apr 16 21:00:28 2014 +0200
  fix fanotify syscall check on compat kernel

The problem is, that fanotify_mark() uses a 64bit parameter (mask).
When calling this syscall with it's 64bit parameter on a 32bit arch it is very
architecture and compiler dependend, in which order the lower and higher 32bits
are put on the stack and thus ends up in the arguments for the Linux kernel.

So, to avoid any problems we really need to call this syscall the same way as
it's defined by glibc.

This patch will utilize the glibc header <sys/fanotify.h> if available and
only use a manual syscall as fallback.

Tested on the hppa/parisc 32- and 64bit architecture.

Signed-off-by: Helge Deller <[email protected]>

diff --git a/testcases/kernel/syscalls/fanotify/fanotify.h 
b/testcases/kernel/syscalls/fanotify/fanotify.h
index a52093c..6625811 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify.h
+++ b/testcases/kernel/syscalls/fanotify/fanotify.h
@@ -28,27 +28,43 @@
 #ifndef        __FANOTIFY_H__
 #define        __FANOTIFY_H__
 
+#include "config.h"
+
 #include <stdint.h>
-#include <endian.h>
-#include "lapi/abisize.h"
 #include "linux_syscall_numbers.h"
 
 /* fanotify(7) wrappers */
 
-#define        myfanotify_init(flags, event_f_flags) \
-       syscall(__NR_fanotify_init, flags, event_f_flags)
 
-long myfanotify_mark(int fd, unsigned int flags, uint64_t mask,
+#if defined(HAVE_SYS_FANOTIFY_H)
+
+#include <sys/fanotify.h>
+
+static int myfanotify_init(unsigned int flags, unsigned int event_f_flags)
+{
+       return fanotify_init(flags, event_f_flags);
+}
+
+static long myfanotify_mark(int fd, unsigned int flags, uint64_t mask,
                      int dfd, const char *pathname)
 {
-#if LTP_USE_64_ABI
-       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
+       return fanotify_mark(fd, flags, mask, dfd, pathname);
+}
+
+#else /* HAVE_SYS_FANOTIFY_H */
+
+static int myfanotify_init(unsigned int flags, unsigned int event_f_flags)
+{
+       return syscall(__NR_fanotify_init, flags, event_f_flags);
 }
 
+static long myfanotify_mark(int fd, unsigned int flags, uint64_t mask,
+                     int dfd, const char *pathname)
+{
+       return syscall(__NR_fanotify_mark, fd, flags, mask, dfd, pathname);
+}
+
+#endif
+
+
 #endif /* __FANOTIFY_H__ */

------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to