Skip to content

Commit

Permalink
linux-user: Use direct syscall for utimensat
Browse files Browse the repository at this point in the history
The linux utimensat syscall differs in semantics from the
libc function because the syscall combines the features
of utimensat() and futimens(). Rather than trying to
split these apart in order to call the two libc functions
which then call the same underlying syscall, just always
directly make the host syscall. This fixes bugs in some
of the corner cases which should return errors from the
syscall but which we were incorrectly directing to futimens().

This doesn't reduce the set of hosts that our syscall
implementation will work on, because if the direct syscall
fails ENOSYS then the libc functions would also fail ENOSYS.
(The system call has been in the kernel since 2.6.22 anyway.)

Signed-off-by: Peter Maydell <[email protected]>
Signed-off-by: Riku Voipio <[email protected]>
  • Loading branch information
pm215 authored and Riku Voipio committed Sep 21, 2016
1 parent 6080723 commit 700fa58
Showing 1 changed file with 1 addition and 10 deletions.
11 changes: 1 addition & 10 deletions linux-user/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -520,16 +520,7 @@ static int sys_getcwd1(char *buf, size_t size)
}

#ifdef TARGET_NR_utimensat
#ifdef CONFIG_UTIMENSAT
static int sys_utimensat(int dirfd, const char *pathname,
const struct timespec times[2], int flags)
{
if (pathname == NULL)
return futimens(dirfd, times);
else
return utimensat(dirfd, pathname, times, flags);
}
#elif defined(__NR_utimensat)
#if defined(__NR_utimensat)
#define __NR_sys_utimensat __NR_utimensat
_syscall4(int,sys_utimensat,int,dirfd,const char *,pathname,
const struct timespec *,tsp,int,flags)
Expand Down

0 comments on commit 700fa58

Please sign in to comment.