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
