On 13 March 2013 17:58, Jan Stancek <[email protected]> wrote:
>
>
> ----- Original Message -----
>> From: "Markos Chandras" <[email protected]>
>> To: [email protected]
>> 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 <[email protected]>
>>
>> New Linux Kernel architectures do not define NR_getdents so we
>> try to use the getdents64 syscall instead
>>
>> Signed-off-by: Markos Chandras <[email protected]>
>> ---
>>  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

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to