Message ID | 20190522162147.26303-1-wens@kernel.org |
---|---|
State | New |
Headers | show |
Series | [v3] linux-user: Pass through nanosecond timestamp components for stat syscalls | expand |
Patchew URL: https://patchew.org/QEMU/20190522162147.26303-1-wens@kernel.org/ Hi, This series seems to have some coding style problems. See output below for more information: Message-id: 20190522162147.26303-1-wens@kernel.org Type: series Subject: [Qemu-devel] [PATCH v3] linux-user: Pass through nanosecond timestamp components for stat syscalls === TEST SCRIPT BEGIN === #!/bin/bash git rev-parse base > /dev/null || exit 0 git config --local diff.renamelimit 0 git config --local diff.renames True git config --local diff.algorithm histogram ./scripts/checkpatch.pl --mailback base.. === TEST SCRIPT END === From https://github.com/patchew-project/qemu * [new tag] patchew/20190522162147.26303-1-wens@kernel.org -> patchew/20190522162147.26303-1-wens@kernel.org Switched to a new branch 'test' 6ec325f89c linux-user: Pass through nanosecond timestamp components for stat syscalls === OUTPUT BEGIN === ERROR: code indent should never use tabs #104: FILE: linux-user/syscall_defs.h:1197: +^Iabi_ulong target_st_atime_nsec;$ ERROR: code indent should never use tabs #107: FILE: linux-user/syscall_defs.h:1199: +^Iabi_ulong target_st_mtime_nsec;$ ERROR: code indent should never use tabs #110: FILE: linux-user/syscall_defs.h:1201: +^Iabi_ulong target_st_ctime_nsec;$ ERROR: code indent should never use tabs #119: FILE: linux-user/syscall_defs.h:1233: +^Iabi_ulong^Itarget_st_atime_nsec;$ ERROR: code indent should never use tabs #123: FILE: linux-user/syscall_defs.h:1236: +^Iabi_ulong^Itarget_st_mtime_nsec;$ ERROR: code indent should never use tabs #127: FILE: linux-user/syscall_defs.h:1239: +^Iabi_ulong^Itarget_st_ctime_nsec;$ ERROR: code indent should never use tabs #136: FILE: linux-user/syscall_defs.h:1318: +^Iabi_ulong^Itarget_st_atime_nsec;$ ERROR: code indent should never use tabs #140: FILE: linux-user/syscall_defs.h:1321: +^Iabi_ulong^Itarget_st_mtime_nsec;$ ERROR: code indent should never use tabs #144: FILE: linux-user/syscall_defs.h:1324: +^Iabi_ulong^Itarget_st_ctime_nsec;$ ERROR: code indent should never use tabs #160: FILE: linux-user/syscall_defs.h:1342: +^Iabi_ulong^Itarget_st_atime_nsec;$ ERROR: code indent should never use tabs #163: FILE: linux-user/syscall_defs.h:1344: +^Iabi_ulong^Itarget_st_mtime_nsec;$ ERROR: code indent should never use tabs #166: FILE: linux-user/syscall_defs.h:1346: +^Iabi_ulong^Itarget_st_ctime_nsec;$ ERROR: code indent should never use tabs #170: FILE: linux-user/syscall_defs.h:1349: +^Iabi_ulong^I__unused1[2];$ ERROR: code indent should never use tabs #179: FILE: linux-user/syscall_defs.h:1377: +^Iunsigned int^Itarget_st_atime_nsec;$ ERROR: code indent should never use tabs #183: FILE: linux-user/syscall_defs.h:1380: +^Iunsigned int^Itarget_st_mtime_nsec;$ ERROR: code indent should never use tabs #187: FILE: linux-user/syscall_defs.h:1383: +^Iunsigned int^Itarget_st_ctime_nsec;$ ERROR: code indent should never use tabs #191: FILE: linux-user/syscall_defs.h:1385: +^Iunsigned int^I__unused1;$ ERROR: code indent should never use tabs #192: FILE: linux-user/syscall_defs.h:1386: +^Iunsigned int^I__unused2;$ total: 18 errors, 0 warnings, 211 lines checked Commit 6ec325f89c06 (linux-user: Pass through nanosecond timestamp components for stat syscalls) has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS. === OUTPUT END === Test command exited with code: 1 The full log is available at http://patchew.org/logs/20190522162147.26303-1-wens@kernel.org/testing.checkpatch/?type=message. --- Email generated automatically by Patchew [https://patchew.org/]. Please send your feedback to patchew-devel@redhat.com
On 22/05/2019 18:21, Chen-Yu Tsai wrote: > From: Chen-Yu Tsai <wens@csie.org> > > Since Linux 2.6 the stat syscalls have mostly supported nanosecond > components for each of the file-related timestamps. > > QEMU user mode emulation currently does not pass through the nanosecond > portion of the timestamp, even when the host system fills in the value. > This results in a mismatch when run on subsecond resolution filesystems > such as ext4 or XFS. > > An example of this leading to inconsistency is cross-debootstraping a > full desktop root filesystem of Debian Buster. Recent versions of > fontconfig store the full timestamp (instead of just the second portion) > of the directory in its per-directory cache file, and checks this against > the directory to see if the cache is up-to-date. With QEMU user mode > emulation, the timestamp stored is incorrect, and upon booting the rootfs > natively, fontconfig discovers the mismatch, and proceeds to rebuild the > cache on the comparatively slow machine (low-power ARM vs x86). This > stalls the first attempt to open whatever application that incorporates > fontconfig. > > This patch renames the "unused" padding trailing each timestamp element > to its nanosecond counterpart name if such an element exists in the > kernel sources for the given platform. Not all do. Then have the syscall > wrapper fill in the nanosecond portion if the host supports it, as > specified by the _POSIX_C_SOURCE and _XOPEN_SOURCE feature macros. > > Recent versions of glibc only use stat64 and newfstatat syscalls on > 32-bit and 64-bit platforms respectively. The changes in this patch > were tested by directly calling the stat, stat64 and newfstatat syscalls > directly, in addition to the glibc wrapper, on arm and aarch64 little > endian targets. > > Reviewed-by: Laurent Vivier <laurent@vivier.eu> > Signed-off-by: Chen-Yu Tsai <wens@csie.org> > > --- > > Changes since v2: > > - Rename TARGET_STAT_HAS_NSEC to TARGET_STAT_HAVE_NSEC > > Changes since v1: > > - Define TARGET_STAT_HAS_NSEC for targets that have the *_nsec fields > in their struct stat > > - Only copy the *_nsec fields in the stat (not stat64) code path if > TARGET_STAT_HAS_NSEC is defined > > - Picked up Reviewed-by from Laurent > > As Laurent mentioned, linux-user/syscall_defs.h is indented with tabs, > so the checkpatch.pl errors can be ignored. > > Original cover letter: > > This issue was found while integrating some software that uses newer > versions of fontconfig into Raspbian images. We found that the first > launch of said software always stalls with fontconfig regenerating its > font cache files. Upon closer examination I found the timestamps were > not matching. The rest is explained above. Currently we're just working > around the problem by patching the correct timestamps into the cache > files after the fact. > > Please consider this a drive-by scratch-my-own-itch contribution, but I > will stick around to deal with any comments raised during review. I'm > not on the mailing lists either, so please keep me in CC. > > checkpatch returns "ERROR: code indent should never use tabs" for > linux-user/syscall_defs.h, however as far as I can tell the whole file > is indented with tabs. I'm not sure what to make of this. > > Finally, I think this could be worth backporting to older versions. > --- > linux-user/syscall.c | 19 +++++++++++++++ > linux-user/syscall_defs.h | 49 +++++++++++++++++++++++++-------------- > 2 files changed, 50 insertions(+), 18 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index efa3ec2837..c83a3648c9 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -6408,6 +6408,11 @@ static inline abi_long host_to_target_stat64(void *cpu_env, > __put_user(host_st->st_atime, &target_st->target_st_atime); > __put_user(host_st->st_mtime, &target_st->target_st_mtime); > __put_user(host_st->st_ctime, &target_st->target_st_ctime); > +#if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 > + __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec); > + __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec); > + __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec); > +#endif > unlock_user_struct(target_st, target_addr, 1); > } else > #endif > @@ -6438,6 +6443,11 @@ static inline abi_long host_to_target_stat64(void *cpu_env, > __put_user(host_st->st_atime, &target_st->target_st_atime); > __put_user(host_st->st_mtime, &target_st->target_st_mtime); > __put_user(host_st->st_ctime, &target_st->target_st_ctime); > +#if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 > + __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec); > + __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec); > + __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec); > +#endif > unlock_user_struct(target_st, target_addr, 1); > } > > @@ -8866,6 +8876,15 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, > __put_user(st.st_atime, &target_st->target_st_atime); > __put_user(st.st_mtime, &target_st->target_st_mtime); > __put_user(st.st_ctime, &target_st->target_st_ctime); > +#if (_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) && \ > + defined(TARGET_STAT_HAVE_NSEC) > + __put_user(st.st_atim.tv_nsec, > + &target_st->target_st_atime_nsec); > + __put_user(st.st_mtim.tv_nsec, > + &target_st->target_st_mtime_nsec); > + __put_user(st.st_ctim.tv_nsec, > + &target_st->target_st_ctime_nsec); > +#endif > unlock_user_struct(target_st, arg2, 1); > } > } > diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h > index 1f5b2d18db..0223724758 100644 > --- a/linux-user/syscall_defs.h > +++ b/linux-user/syscall_defs.h > @@ -1179,6 +1179,7 @@ struct target_winsize { > #if (defined(TARGET_I386) && defined(TARGET_ABI32)) \ > || (defined(TARGET_ARM) && defined(TARGET_ABI32)) \ > || defined(TARGET_CRIS) > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > unsigned short st_dev; > unsigned short __pad1; > @@ -1193,11 +1194,11 @@ struct target_stat { > abi_ulong st_blksize; > abi_ulong st_blocks; > abi_ulong target_st_atime; > - abi_ulong __unused1; > + abi_ulong target_st_atime_nsec; > abi_ulong target_st_mtime; > - abi_ulong __unused2; > + abi_ulong target_st_mtime_nsec; > abi_ulong target_st_ctime; > - abi_ulong __unused3; > + abi_ulong target_st_ctime_nsec; > abi_ulong __unused4; > abi_ulong __unused5; > }; > @@ -1229,13 +1230,13 @@ struct target_stat64 { > abi_ulong __pad4; /* future possible st_blocks high bits */ > > abi_ulong target_st_atime; > - abi_ulong __pad5; > + abi_ulong target_st_atime_nsec; > > abi_ulong target_st_mtime; > - abi_ulong __pad6; > + abi_ulong target_st_mtime_nsec; > > abi_ulong target_st_ctime; > - abi_ulong __pad7; /* will be high 32 bits of ctime someday */ > + abi_ulong target_st_ctime_nsec; > > unsigned long long st_ino; > } QEMU_PACKED; > @@ -1314,19 +1315,20 @@ struct target_stat64 { > unsigned int st_blocks; > > abi_ulong target_st_atime; > - abi_ulong __unused1; > + abi_ulong target_st_atime_nsec; > > abi_ulong target_st_mtime; > - abi_ulong __unused2; > + abi_ulong target_st_mtime_nsec; > > abi_ulong target_st_ctime; > - abi_ulong __unused3; > + abi_ulong target_st_ctime_nsec; > > abi_ulong __unused4[3]; > }; > > #elif defined(TARGET_SPARC) > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > unsigned short st_dev; > abi_ulong st_ino; > @@ -1337,14 +1339,14 @@ struct target_stat { > unsigned short st_rdev; > abi_long st_size; > abi_long target_st_atime; > - abi_ulong __unused1; > + abi_ulong target_st_atime_nsec; > abi_long target_st_mtime; > - abi_ulong __unused2; > + abi_ulong target_st_mtime_nsec; > abi_long target_st_ctime; > - abi_ulong __unused3; > + abi_ulong target_st_ctime_nsec; > abi_long st_blksize; > abi_long st_blocks; > - abi_ulong __unused4[2]; > + abi_ulong __unused1[2]; > }; > > #define TARGET_HAS_STRUCT_STAT64 > @@ -1372,20 +1374,21 @@ struct target_stat64 { > unsigned int st_blocks; > > unsigned int target_st_atime; > - unsigned int __unused1; > + unsigned int target_st_atime_nsec; > > unsigned int target_st_mtime; > - unsigned int __unused2; > + unsigned int target_st_mtime_nsec; > > unsigned int target_st_ctime; > - unsigned int __unused3; > + unsigned int target_st_ctime_nsec; > > - unsigned int __unused4; > - unsigned int __unused5; > + unsigned int __unused1; > + unsigned int __unused2; > }; > > #elif defined(TARGET_PPC) > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_ino; > @@ -1443,6 +1446,7 @@ struct QEMU_PACKED target_stat64 { > > #elif defined(TARGET_MICROBLAZE) > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_ino; > @@ -1558,6 +1562,7 @@ struct target_stat64 { > > #elif defined(TARGET_ABI_MIPSN64) > > +#define TARGET_STAT_HAVE_NSEC > /* The memory layout is the same as of struct stat64 of the 32-bit kernel. */ > struct target_stat { > unsigned int st_dev; > @@ -1597,6 +1602,7 @@ struct target_stat { > > #elif defined(TARGET_ABI_MIPSN32) > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_pad0[3]; /* Reserved for st_dev expansion */ > @@ -1621,6 +1627,7 @@ struct target_stat { > > #elif defined(TARGET_ABI_MIPSO32) > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > unsigned st_dev; > abi_long st_pad1[3]; /* Reserved for network id */ > @@ -1737,6 +1744,7 @@ struct target_stat64 { > > #elif defined(TARGET_SH4) > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_ino; > @@ -1796,6 +1804,7 @@ struct QEMU_PACKED target_stat64 { > }; > > #elif defined(TARGET_I386) && !defined(TARGET_ABI32) > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_ino; > @@ -1841,6 +1850,7 @@ struct target_stat { > abi_ulong __unused[3]; > }; > #elif defined(TARGET_AARCH64) > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_ino; > @@ -1863,6 +1873,7 @@ struct target_stat { > unsigned int __unused[2]; > }; > #elif defined(TARGET_XTENSA) > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_ino; > @@ -1912,6 +1923,7 @@ struct target_stat64 { > > /* These are the asm-generic versions of the stat and stat64 structures */ > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_ulong st_dev; > abi_ulong st_ino; > @@ -1963,6 +1975,7 @@ struct target_stat64 { > > #elif defined(TARGET_HPPA) > > +#define TARGET_STAT_HAVE_NSEC > struct target_stat { > abi_uint st_dev; > abi_uint st_ino; > Applied to my linux-user branch. Thanks, Laurent
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index efa3ec2837..c83a3648c9 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6408,6 +6408,11 @@ static inline abi_long host_to_target_stat64(void *cpu_env, __put_user(host_st->st_atime, &target_st->target_st_atime); __put_user(host_st->st_mtime, &target_st->target_st_mtime); __put_user(host_st->st_ctime, &target_st->target_st_ctime); +#if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 + __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec); + __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec); + __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec); +#endif unlock_user_struct(target_st, target_addr, 1); } else #endif @@ -6438,6 +6443,11 @@ static inline abi_long host_to_target_stat64(void *cpu_env, __put_user(host_st->st_atime, &target_st->target_st_atime); __put_user(host_st->st_mtime, &target_st->target_st_mtime); __put_user(host_st->st_ctime, &target_st->target_st_ctime); +#if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 + __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec); + __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec); + __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec); +#endif unlock_user_struct(target_st, target_addr, 1); } @@ -8866,6 +8876,15 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, __put_user(st.st_atime, &target_st->target_st_atime); __put_user(st.st_mtime, &target_st->target_st_mtime); __put_user(st.st_ctime, &target_st->target_st_ctime); +#if (_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) && \ + defined(TARGET_STAT_HAVE_NSEC) + __put_user(st.st_atim.tv_nsec, + &target_st->target_st_atime_nsec); + __put_user(st.st_mtim.tv_nsec, + &target_st->target_st_mtime_nsec); + __put_user(st.st_ctim.tv_nsec, + &target_st->target_st_ctime_nsec); +#endif unlock_user_struct(target_st, arg2, 1); } } diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 1f5b2d18db..0223724758 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -1179,6 +1179,7 @@ struct target_winsize { #if (defined(TARGET_I386) && defined(TARGET_ABI32)) \ || (defined(TARGET_ARM) && defined(TARGET_ABI32)) \ || defined(TARGET_CRIS) +#define TARGET_STAT_HAVE_NSEC struct target_stat { unsigned short st_dev; unsigned short __pad1; @@ -1193,11 +1194,11 @@ struct target_stat { abi_ulong st_blksize; abi_ulong st_blocks; abi_ulong target_st_atime; - abi_ulong __unused1; + abi_ulong target_st_atime_nsec; abi_ulong target_st_mtime; - abi_ulong __unused2; + abi_ulong target_st_mtime_nsec; abi_ulong target_st_ctime; - abi_ulong __unused3; + abi_ulong target_st_ctime_nsec; abi_ulong __unused4; abi_ulong __unused5; }; @@ -1229,13 +1230,13 @@ struct target_stat64 { abi_ulong __pad4; /* future possible st_blocks high bits */ abi_ulong target_st_atime; - abi_ulong __pad5; + abi_ulong target_st_atime_nsec; abi_ulong target_st_mtime; - abi_ulong __pad6; + abi_ulong target_st_mtime_nsec; abi_ulong target_st_ctime; - abi_ulong __pad7; /* will be high 32 bits of ctime someday */ + abi_ulong target_st_ctime_nsec; unsigned long long st_ino; } QEMU_PACKED; @@ -1314,19 +1315,20 @@ struct target_stat64 { unsigned int st_blocks; abi_ulong target_st_atime; - abi_ulong __unused1; + abi_ulong target_st_atime_nsec; abi_ulong target_st_mtime; - abi_ulong __unused2; + abi_ulong target_st_mtime_nsec; abi_ulong target_st_ctime; - abi_ulong __unused3; + abi_ulong target_st_ctime_nsec; abi_ulong __unused4[3]; }; #elif defined(TARGET_SPARC) +#define TARGET_STAT_HAVE_NSEC struct target_stat { unsigned short st_dev; abi_ulong st_ino; @@ -1337,14 +1339,14 @@ struct target_stat { unsigned short st_rdev; abi_long st_size; abi_long target_st_atime; - abi_ulong __unused1; + abi_ulong target_st_atime_nsec; abi_long target_st_mtime; - abi_ulong __unused2; + abi_ulong target_st_mtime_nsec; abi_long target_st_ctime; - abi_ulong __unused3; + abi_ulong target_st_ctime_nsec; abi_long st_blksize; abi_long st_blocks; - abi_ulong __unused4[2]; + abi_ulong __unused1[2]; }; #define TARGET_HAS_STRUCT_STAT64 @@ -1372,20 +1374,21 @@ struct target_stat64 { unsigned int st_blocks; unsigned int target_st_atime; - unsigned int __unused1; + unsigned int target_st_atime_nsec; unsigned int target_st_mtime; - unsigned int __unused2; + unsigned int target_st_mtime_nsec; unsigned int target_st_ctime; - unsigned int __unused3; + unsigned int target_st_ctime_nsec; - unsigned int __unused4; - unsigned int __unused5; + unsigned int __unused1; + unsigned int __unused2; }; #elif defined(TARGET_PPC) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_ino; @@ -1443,6 +1446,7 @@ struct QEMU_PACKED target_stat64 { #elif defined(TARGET_MICROBLAZE) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_ino; @@ -1558,6 +1562,7 @@ struct target_stat64 { #elif defined(TARGET_ABI_MIPSN64) +#define TARGET_STAT_HAVE_NSEC /* The memory layout is the same as of struct stat64 of the 32-bit kernel. */ struct target_stat { unsigned int st_dev; @@ -1597,6 +1602,7 @@ struct target_stat { #elif defined(TARGET_ABI_MIPSN32) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_pad0[3]; /* Reserved for st_dev expansion */ @@ -1621,6 +1627,7 @@ struct target_stat { #elif defined(TARGET_ABI_MIPSO32) +#define TARGET_STAT_HAVE_NSEC struct target_stat { unsigned st_dev; abi_long st_pad1[3]; /* Reserved for network id */ @@ -1737,6 +1744,7 @@ struct target_stat64 { #elif defined(TARGET_SH4) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_ino; @@ -1796,6 +1804,7 @@ struct QEMU_PACKED target_stat64 { }; #elif defined(TARGET_I386) && !defined(TARGET_ABI32) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_ino; @@ -1841,6 +1850,7 @@ struct target_stat { abi_ulong __unused[3]; }; #elif defined(TARGET_AARCH64) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_ino; @@ -1863,6 +1873,7 @@ struct target_stat { unsigned int __unused[2]; }; #elif defined(TARGET_XTENSA) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_ino; @@ -1912,6 +1923,7 @@ struct target_stat64 { /* These are the asm-generic versions of the stat and stat64 structures */ +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_ulong st_dev; abi_ulong st_ino; @@ -1963,6 +1975,7 @@ struct target_stat64 { #elif defined(TARGET_HPPA) +#define TARGET_STAT_HAVE_NSEC struct target_stat { abi_uint st_dev; abi_uint st_ino;