On Fri, Feb 8, 2013 at 4:02 PM, Ian Lance Taylor <i...@google.com> wrote:

>>>> I did hit one new error that seems related:
>>>>
>>>> --- FAIL: TestChtimes (0.00 seconds)
>>>> os_test.go:681:         AccessTime didn't go backwards;
>>>> was={63495872497 0 47130825733376}, after={63495872497 0
>>>> 47130825733376}
>>>> os_test.go:685:         ModTime didn't go backwards; was={63495872497
>>>> 0 47130825733376}, after={63495872497 0 47130825733376}
>>>> FAIL
>>>> FAIL: os
>>>
>>> Something has gone wrong in the file
>>> libgo/go/syscall/libcall_linux_utimesnano.go.  The function in that
>>> file will try utimensat.  On your system that should return ENOSYS.
>>> In that case the function should convert the times and call utimes.
>>> The code looks OK to me but there may be something wrong with it.  It
>>> looks like the file times didn't change at all.
>>
>> From the strace -f, it looks that utimes is not called at all in
>> between two relevant stats:
>
> Strange.  What I would expect to happen is that the function in
> libcall_linux_utimesnano.go will call utimensat.  Since your system
> does not have that function, that will call the stub routine in
> libgo/runtime/go-nosys.c, which will return -1 with errno set to
> ENOSYS.  The code in libcall_linux_utimensnano.go will see the ENOSYS
> error and continue on to call utime.  Clearly something is going wrong
> in that sequence, but I don't know what.

Somwhow expected, following "patch" makes test to pass:

--cut here--
Index: go/syscall/libcall_linux_utimesnano.go
===================================================================
--- go/syscall/libcall_linux_utimesnano.go      (revision 195879)
+++ go/syscall/libcall_linux_utimesnano.go      (working copy)
@@ -14,10 +14,10 @@
        if len(ts) != 2 {
                return EINVAL
        }
-       err = utimensat(_AT_FDCWD, path,
(*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
-       if err != ENOSYS {
-               return err
-       }
+//     err = utimensat(_AT_FDCWD, path,
(*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
+//     if err != ENOSYS {
+//             return err
+//     }
        // If the utimensat syscall isn't available (utimensat was
added to Linux
        // in 2.6.22, Released, 8 July 2007) then fall back to utimes
        var tv [2]Timeval
--cut here--

11491 stat("/tmp/_Go_TestChtimes581938713", {st_mode=S_IFREG|0600,
st_size=13, ...}) = 0
11491 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
11491 utimes("/tmp/_Go_TestChtimes581938713", {{1360336212, 0},
{1360336212, 0}}) = 0
11491 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
11491 stat("/tmp/_Go_TestChtimes581938713", {st_mode=S_IFREG|0600,
st_size=13, ...}) = 0

It looks to me that gcc miscompiles this part for some reason...?

Uros.

Reply via email to