From: Markos C. <mar...@gm...> - 2013-03-13 18:04:06
|
On 13 March 2013 17:58, Jan Stancek <jst...@re...> wrote: > > > ----- Original Message ----- >> From: "Markos Chandras" <mar...@gm...> >> To: ltp...@li... >> Sent: Wednesday, 13 March, 2013 3:01:34 PM >> Subject: [LTP] [PATCH 1/2] syscalls/getdents: Use getdents64 if SYS_getdents is not defined >> >> From: Markos Chandras <mar...@im...> >> >> New Linux Kernel architectures do not define NR_getdents so we >> try to use the getdents64 syscall instead >> >> Signed-off-by: Markos Chandras <mar...@im...> >> --- >> testcases/kernel/syscalls/getdents/getdents.h | 15 +++++++++++++++ >> 1 files changed, 15 insertions(+), 0 deletions(-) >> >> diff --git a/testcases/kernel/syscalls/getdents/getdents.h >> b/testcases/kernel/syscalls/getdents/getdents.h >> index 1d5e584..12d2be4 100644 >> --- a/testcases/kernel/syscalls/getdents/getdents.h >> +++ b/testcases/kernel/syscalls/getdents/getdents.h >> @@ -38,12 +38,23 @@ >> * declare our own here. Wheeeeee. >> */ >> >> +#ifdef SYS_getdents >> struct linux_dirent { >> unsigned long d_ino; >> unsigned long d_off; >> unsigned short d_reclen; >> char d_name[]; >> }; >> +#else >> +/* Use the 64-bit definition */ >> +struct linux_dirent { >> + unsigned long long d_ino; >> + long long d_off; >> + unsigned short d_reclen; >> + unsigned char d_type; >> + char d_name[0]; >> +}; >> +#endif >> >> static inline int >> getdents(unsigned int fd, struct dirent *dirp, unsigned int count) >> @@ -57,7 +68,11 @@ getdents(unsigned int fd, struct dirent *dirp, >> unsigned int count) >> unsigned int i; >> >> ptrs.buf = buf; >> +#ifdef SYS_getdents >> ret = syscall(SYS_getdents, fd, buf, count); >> +#else >> + ret = syscall(SYS_getdents64, fd, buf, count); >> +#endif > > Just a thought.. What about turning it to runtime check? There could be parameter to switch between > SYS_getdents/SYS_getdents64 and we can have both (with/without that parameter) in runtest/syscalls. > If it's supported it runs, if not ends with TCONF. That way we could have both version on arches > that support both syscalls. > The problem is that for arches that don't have SYS_getdents defined, you will not be able to compile LTP on them so you really need to hide this codepath from them. A similar commit that changes the codepath based on whether a particular __NR_XX is defined is this https://github.com/linux-test-project/ltp/commit/75201f160b9aa49af70d8f46fb1f087e63d603dd I don't see an easy way to determine if __NR_XX is defined or not during runtime. -- Regards, Markos Chandras |