On Fri, Feb 8, 2013 at 7:23 AM, Uros Bizjak <ubiz...@gmail.com> wrote: > 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...?
A miscompilation seems fairly unlikely. I expect it's something very obvious, I'm just not seeing it. Can you verify that the code reaches the stub definition of utimensat in libgo/runtime/go-nosys.c? In fact, maybe if you just send me the test executable it will fail on my system. Seems worth a try. Ian