summaryrefslogtreecommitdiff
path: root/src/missing.h
diff options
context:
space:
mode:
authorcee1 <fykcee1@gmail.com>2011-04-20 17:59:18 +0800
committerLennart Poettering <lennart@poettering.net>2011-04-21 04:19:22 +0200
commit373c23b27f2d886fc023cf5d02fe3bb3eba2e8e9 (patch)
treeaeac71b98278831d7b97385686431a28be96181e /src/missing.h
parent13f9123298ac70d5d05c1de5d6b93ff11af9ac55 (diff)
missing: Fix broken syscall(__NR_fanotify_mark... on o32 mips.
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%23618562 MIPS o32 ABI enforces that 64bit arguments should be 64bit-aligned, and the third argument of syscall(__NR_fanotify_mark, ...) is 64bit and not 64bit-aligned on o32 mips platform, thus extra padding is inserted before it. The syscall function doesn't know the prototype of fanotify_mark, so the padding will be passed into kernel as valid argument.
Diffstat (limited to 'src/missing.h')
-rw-r--r--src/missing.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/missing.h b/src/missing.h
index 35e209fba4..f1dbb398e0 100644
--- a/src/missing.h
+++ b/src/missing.h
@@ -125,7 +125,18 @@ static inline int fanotify_init(unsigned int flags, unsigned int event_f_flags)
static inline int fanotify_mark(int fanotify_fd, unsigned int flags, uint64_t mask,
int dfd, const char *pathname) {
+#if defined _MIPS_SIM && _MIPS_SIM == _MIPS_SIM_ABI32
+ union {
+ uint64_t _64;
+ uint32_t _32[2];
+ } _mask;
+ _mask._64 = mask;
+
+ return syscall(__NR_fanotify_mark, fanotify_fd, flags,
+ _mask._32[0], _mask._32[1], dfd, pathname);
+#else
return syscall(__NR_fanotify_mark, fanotify_fd, flags, mask, dfd, pathname);
+#endif
}
#ifndef BTRFS_IOCTL_MAGIC