* tests/readahead.c: New file. * tests/readahead.test: New test. * tests/.gitignore: Add readahead. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add readahead.test. --- Changes since v2: * Added workaround for an old glibc bug (https://sourceware.org/bugzilla/show_bug.cgi?id=5208) which is still present in RHEL 5.
tests/.gitignore | 1 + tests/Makefile.am | 2 ++ tests/readahead.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/readahead.test | 6 ++++ 4 files changed, 98 insertions(+) create mode 100644 tests/readahead.c create mode 100755 tests/readahead.test diff --git a/tests/.gitignore b/tests/.gitignore index 5c5d092..8c41bea 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -185,6 +185,7 @@ pselect6 ptrace pwritev read-write +readahead readdir readlink readlinkat diff --git a/tests/Makefile.am b/tests/Makefile.am index 2cf9674..0b3b818 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -242,6 +242,7 @@ check_PROGRAMS = \ ptrace \ pwritev \ read-write \ + readahead \ readdir \ readlink \ readlinkat \ @@ -569,6 +570,7 @@ DECODER_TESTS = \ ptrace.test \ pwritev.test \ read-write.test \ + readahead.test \ readdir.test \ readlink.test \ readlinkat.test \ diff --git a/tests/readahead.c b/tests/readahead.c new file mode 100644 index 0000000..6f50e38 --- /dev/null +++ b/tests/readahead.c @@ -0,0 +1,89 @@ +#include "tests.h" +#include <asm/unistd.h> + +#ifdef __NR_readahead + +# include <fcntl.h> +# include <stdio.h> +# include <unistd.h> + +# if !defined(STRACE_READAHEAD_USE_SYSCALL) +# if defined(__GNU_LIBRARY__) +/* Check for glibc readahead off64_t argument passing bug, + * see https://sourceware.org/bugzilla/show_bug.cgi?id=5208 */ +# if defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \ + (__GLIBC__ * 1000 + __GLIBC_MINOR__ > 2007) +# define STRACE_READAHEAD_USE_SYSCALL 0 +# else +# define STRACE_READAHEAD_USE_SYSCALL 1 +# endif +# else /* !defined(__GNU_LIBRARY__) */ +# define STRACE_READAHEAD_USE_SYSCALL 0 +# endif /* defined(__GNU_LIBRARY__) */ +# endif /* !defined(READAHED_USE_SYSCALL) */ + +static const int fds[] = { + -0x80000000, + -100, + -1, + 0, + 1, + 2, + 0x7fffffff, +}; + +static const off64_t offsets[] = { + -0x8000000000000000LL, + -0x5060708090a0b0c0LL, + -1LL, + 0, + 1, + 0xbadfaced, + 0x7fffffffffffffffLL, +}; + +static const unsigned long counts[] = { + 0UL, + 0xdeadca75, + (unsigned long)0xface1e55beeff00dULL, + (unsigned long)0xffffffffffffffffULL, +}; + +static inline ssize_t +do_readahead(int fd, off64_t offset, size_t count) +{ +#if STRACE_READAHEAD_USE_SYSCALL + return syscall(__NR_readahead, fd, offset, count); +#else + return readahead(fd, offset, count); +#endif +} + +int +main(void) +{ + unsigned i; + unsigned j; + unsigned k; + ssize_t rc; + + for (i = 0; i < ARRAY_SIZE(fds); i++) + for (j = 0; j < ARRAY_SIZE(offsets); j++) + for (k = 0; k < ARRAY_SIZE(counts); k++) { + rc = do_readahead(fds[i], offsets[j], + counts[k]); + + printf("readahead(%d, %lld, %lu) = %s\n", + fds[i], (long long)offsets[j], + counts[k], sprintrc(rc)); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_readahead") + +#endif diff --git a/tests/readahead.test b/tests/readahead.test new file mode 100755 index 0000000..397c690 --- /dev/null +++ b/tests/readahead.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check readahead syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a1 -- 1.7.10.4 ------------------------------------------------------------------------------ _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel