Date: Sat, 31 Jan 2015 02:59:34 -0600 From: "Andrew Wilcox" <AWilcox@Wilcox-Tech.com> To: "'Jilles Tjoelker'" <jilles@stack.nl>, <freebsd-arch@FreeBSD.org> Subject: RFC: Added utimensat(2) to Linuxulator (was RE: Current status of utimensat(2)) Message-ID: <004f01d03d34$3caed970$b60c8c50$@Wilcox-Tech.com>
next in thread | raw e-mail | index | archive | help
This is a multipart message in MIME format. ------=_NextPart_000_0050_01D03D01.F2161720 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Jilles Tjoelker sent 29 January 2015 17:06: > I committed utimensat/futimens to head. I also made a start at = Linuxulator > utimensat, see attached patch. Please complete it and test it. >=20 > -- > Jilles Tjoelker I have merged some of the things Jilles' patch does into the patch I was = already working on. I have tested a number of corner cases with it, and = compared the results to a running Linux system. I have also run = software which all use utimensat(2) on Linux, such as recent tar(1), = touch(1), and Python 3.3's shutil library, inside the Linuxulator with = this patch applied. I have found this patch's behaviour to be correct = in these tests. Please let me know of any comments or issues. I will be additionally trying to merge this into dchagin's lemul branch, = but that discussion will take place on Phabricator (and will involve = testing on amd64-native Linuxulator, which I have not yet done).=20 Regards, Andrew -- Andrew Wilcox, C/C++/Python developer, kernel hacker Blog: http://blog.foxkit.us/ WWW: http://foxkit.us/ GitHub: https://github.com/awilfox ------=_NextPart_000_0050_01D03D01.F2161720 Content-Type: application/octet-stream; name="linux_utimensat.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="linux_utimensat.diff" Index: sys/amd64/linux32/linux32_dummy.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/amd64/linux32/linux32_dummy.c (revision 277871)=0A= +++ sys/amd64/linux32/linux32_dummy.c (working copy)=0A= @@ -111,7 +111,6 @@=0A= DUMMY(getcpu);=0A= DUMMY(epoll_pwait);=0A= /* linux 2.6.22: */=0A= -DUMMY(utimensat);=0A= DUMMY(signalfd);=0A= DUMMY(timerfd_create);=0A= DUMMY(eventfd);=0A= Index: sys/amd64/linux32/linux32_proto.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/amd64/linux32/linux32_proto.h (revision 277871)=0A= +++ sys/amd64/linux32/linux32_proto.h (working copy)=0A= @@ -1017,7 +1017,10 @@=0A= register_t dummy;=0A= };=0A= struct linux_utimensat_args {=0A= - register_t dummy;=0A= + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];=0A= + char pathname_l_[PADL_(const char *)]; const char * pathname; char = pathname_r_[PADR_(const char *)];=0A= + char times_l_[PADL_(const struct l_timespec *)]; const struct = l_timespec * times; char times_r_[PADR_(const struct l_timespec *)];=0A= + char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];=0A= };=0A= struct linux_signalfd_args {=0A= register_t dummy;=0A= @@ -1652,7 +1655,7 @@=0A= #define LINUX_SYS_AUE_linux_move_pages AUE_NULL=0A= #define LINUX_SYS_AUE_linux_getcpu AUE_NULL=0A= #define LINUX_SYS_AUE_linux_epoll_pwait AUE_NULL=0A= -#define LINUX_SYS_AUE_linux_utimensat AUE_NULL=0A= +#define LINUX_SYS_AUE_linux_utimensat AUE_FUTIMESAT=0A= #define LINUX_SYS_AUE_linux_signalfd AUE_NULL=0A= #define LINUX_SYS_AUE_linux_timerfd_create AUE_NULL=0A= #define LINUX_SYS_AUE_linux_eventfd AUE_NULL=0A= Index: sys/amd64/linux32/linux32_sysent.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/amd64/linux32/linux32_sysent.c (revision 277871)=0A= +++ sys/amd64/linux32/linux32_sysent.c (working copy)=0A= @@ -339,7 +339,7 @@=0A= { 0, (sy_call_t *)linux_move_pages, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 317 =3D linux_move_pages */=0A= { 0, (sy_call_t *)linux_getcpu, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC = }, /* 318 =3D linux_getcpu */=0A= { 0, (sy_call_t *)linux_epoll_pwait, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 319 =3D linux_epoll_pwait */=0A= - { 0, (sy_call_t *)linux_utimensat, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 320 =3D linux_utimensat */=0A= + { AS(linux_utimensat_args), (sy_call_t *)linux_utimensat, = AUE_FUTIMESAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 320 =3D = linux_utimensat */=0A= { 0, (sy_call_t *)linux_signalfd, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 321 =3D linux_signalfd */=0A= { 0, (sy_call_t *)linux_timerfd_create, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 322 =3D linux_timerfd_create */=0A= { 0, (sy_call_t *)linux_eventfd, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 323 =3D linux_eventfd */=0A= Index: sys/amd64/linux32/linux32_systrace_args.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/amd64/linux32/linux32_systrace_args.c (revision 277871)=0A= +++ sys/amd64/linux32/linux32_systrace_args.c (working copy)=0A= @@ -2130,7 +2130,12 @@=0A= }=0A= /* linux_utimensat */=0A= case 320: {=0A= - *n_args =3D 0;=0A= + struct linux_utimensat_args *p =3D params;=0A= + iarg[0] =3D p->dfd; /* l_int */=0A= + uarg[1] =3D (intptr_t) p->pathname; /* const char * */=0A= + uarg[2] =3D (intptr_t) p->times; /* const struct l_timespec * */=0A= + iarg[3] =3D p->flags; /* l_int */=0A= + *n_args =3D 4;=0A= break;=0A= }=0A= /* linux_signalfd */=0A= @@ -5395,6 +5400,22 @@=0A= break;=0A= /* linux_utimensat */=0A= case 320:=0A= + switch(ndx) {=0A= + case 0:=0A= + p =3D "l_int";=0A= + break;=0A= + case 1:=0A= + p =3D "const char *";=0A= + break;=0A= + case 2:=0A= + p =3D "const struct l_timespec *";=0A= + break;=0A= + case 3:=0A= + p =3D "l_int";=0A= + break;=0A= + default:=0A= + break;=0A= + };=0A= break;=0A= /* linux_signalfd */=0A= case 321:=0A= @@ -6684,6 +6705,9 @@=0A= case 319:=0A= /* linux_utimensat */=0A= case 320:=0A= + if (ndx =3D=3D 0 || ndx =3D=3D 1)=0A= + p =3D "int";=0A= + break;=0A= /* linux_signalfd */=0A= case 321:=0A= /* linux_timerfd_create */=0A= Index: sys/amd64/linux32/syscalls.master=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/amd64/linux32/syscalls.master (revision 277871)=0A= +++ sys/amd64/linux32/syscalls.master (working copy)=0A= @@ -524,7 +524,8 @@=0A= 318 AUE_NULL STD { int linux_getcpu(void); }=0A= 319 AUE_NULL STD { int linux_epoll_pwait(void); }=0A= ; linux 2.6.22:=0A= -320 AUE_NULL STD { int linux_utimensat(void); }=0A= +320 AUE_FUTIMESAT STD { int linux_utimensat(l_int dfd, const char = *pathname, \=0A= + const struct l_timespec *times, l_int flags); }=0A= 321 AUE_NULL STD { int linux_signalfd(void); }=0A= 322 AUE_NULL STD { int linux_timerfd_create(void); }=0A= 323 AUE_NULL STD { int linux_eventfd(void); }=0A= Index: sys/compat/linux/linux_misc.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/compat/linux/linux_misc.c (revision 277871)=0A= +++ sys/compat/linux/linux_misc.c (working copy)=0A= @@ -816,6 +816,89 @@=0A= return (error);=0A= }=0A= =0A= +int =0A= +linux_utimensat(struct thread *td, struct linux_utimensat_args *args)=0A= +{=0A= + struct l_timespec l_times[2];=0A= + struct timespec times[2], *timesp =3D NULL;=0A= + char *path =3D NULL;=0A= + int error, dfd, flags =3D 0;=0A= +=0A= + dfd =3D (args->dfd =3D=3D LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd;=0A= +=0A= +#ifdef DEBUG=0A= + if (ldebug(utimensat))=0A= + printf(ARGS(utimensat, "%d, *"), dfd);=0A= +#endif=0A= +=0A= + if (args->flags & ~LINUX_AT_SYMLINK_NOFOLLOW)=0A= + return (EINVAL);=0A= +=0A= + if (args->times !=3D NULL) {=0A= + if ((error =3D copyin(args->times, l_times, sizeof l_times)))=0A= + return (error);=0A= +=0A= + if (l_times[0].tv_nsec > 999999999 ||=0A= + l_times[1].tv_nsec > 999999999)=0A= + return (EINVAL);=0A= +=0A= + times[0].tv_sec =3D l_times[0].tv_sec;=0A= + switch (l_times[0].tv_nsec)=0A= + {=0A= + case LINUX_UTIME_OMIT:=0A= + times[0].tv_nsec =3D UTIME_OMIT;=0A= + break;=0A= + case LINUX_UTIME_NOW:=0A= + times[0].tv_nsec =3D UTIME_NOW;=0A= + break;=0A= + default:=0A= + times[0].tv_nsec =3D l_times[0].tv_nsec;=0A= + }=0A= +=0A= + times[1].tv_sec =3D l_times[1].tv_sec;=0A= + switch (l_times[1].tv_nsec)=0A= + {=0A= + case LINUX_UTIME_OMIT:=0A= + times[1].tv_nsec =3D UTIME_OMIT;=0A= + break;=0A= + case LINUX_UTIME_NOW:=0A= + times[1].tv_nsec =3D UTIME_NOW;=0A= + break;=0A= + default:=0A= + times[1].tv_nsec =3D l_times[1].tv_nsec;=0A= + }=0A= + timesp =3D times;=0A= + }=0A= +=0A= + if (times[0].tv_nsec =3D=3D UTIME_OMIT && times[1].tv_nsec =3D=3D = UTIME_OMIT) {=0A= + /* This breaks POSIX, but is what the Linux kernel does=0A= + * _on purpose_ (documented in the man page for utimensat(2)),=0A= + * so we must follow that behaviour. */=0A= + return (0);=0A= + }=0A= +=0A= + if (args->pathname !=3D NULL)=0A= + LCONVPATHEXIST_AT(td, args->pathname, &path, dfd);=0A= + else {=0A= + if (args->flags !=3D 0)=0A= + return (EINVAL);=0A= + }=0A= +=0A= + if (args->flags & LINUX_AT_SYMLINK_NOFOLLOW)=0A= + flags |=3D AT_SYMLINK_NOFOLLOW;=0A= +=0A= + if (path =3D=3D NULL)=0A= + error =3D kern_futimens(td, dfd, timesp, UIO_SYSSPACE);=0A= + else=0A= + {=0A= + error =3D kern_utimensat(td, dfd, path, UIO_SYSSPACE, timesp,=0A= + UIO_SYSSPACE, flags);=0A= + LFREEPATH(path);=0A= + }=0A= +=0A= + return (error);=0A= +}=0A= +=0A= int=0A= linux_futimesat(struct thread *td, struct linux_futimesat_args *args)=0A= {=0A= Index: sys/compat/linux/linux_misc.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/compat/linux/linux_misc.h (revision 277871)=0A= +++ sys/compat/linux/linux_misc.h (working copy)=0A= @@ -113,6 +113,9 @@=0A= #define LINUX_CLOCK_REALTIME_HR 4=0A= #define LINUX_CLOCK_MONOTONIC_HR 5=0A= =0A= +#define LINUX_UTIME_NOW 0x3FFFFFFF=0A= +#define LINUX_UTIME_OMIT 0x3FFFFFFE=0A= +=0A= extern int stclohz;=0A= =0A= #define __WCLONE 0x80000000=0A= Index: sys/i386/linux/linux_dummy.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/i386/linux/linux_dummy.c (revision 277871)=0A= +++ sys/i386/linux/linux_dummy.c (working copy)=0A= @@ -107,7 +107,6 @@=0A= DUMMY(getcpu);=0A= DUMMY(epoll_pwait);=0A= /* linux 2.6.22: */=0A= -DUMMY(utimensat);=0A= DUMMY(signalfd);=0A= DUMMY(timerfd_create);=0A= DUMMY(eventfd);=0A= Index: sys/i386/linux/linux_proto.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/i386/linux/linux_proto.h (revision 277871)=0A= +++ sys/i386/linux/linux_proto.h (working copy)=0A= @@ -1031,7 +1031,10 @@=0A= register_t dummy;=0A= };=0A= struct linux_utimensat_args {=0A= - register_t dummy;=0A= + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)];=0A= + char pathname_l_[PADL_(const char *)]; const char * pathname; char = pathname_r_[PADR_(const char *)];=0A= + char times_l_[PADL_(const struct l_timespec *)]; const struct = l_timespec * times; char times_r_[PADR_(const struct l_timespec *)];=0A= + char flags_l_[PADL_(l_int)]; l_int flags; char flags_r_[PADR_(l_int)];=0A= };=0A= struct linux_signalfd_args {=0A= register_t dummy;=0A= @@ -1668,7 +1671,7 @@=0A= #define LINUX_SYS_AUE_linux_move_pages AUE_NULL=0A= #define LINUX_SYS_AUE_linux_getcpu AUE_NULL=0A= #define LINUX_SYS_AUE_linux_epoll_pwait AUE_NULL=0A= -#define LINUX_SYS_AUE_linux_utimensat AUE_NULL=0A= +#define LINUX_SYS_AUE_linux_utimensat AUE_FUTIMESAT=0A= #define LINUX_SYS_AUE_linux_signalfd AUE_NULL=0A= #define LINUX_SYS_AUE_linux_timerfd_create AUE_NULL=0A= #define LINUX_SYS_AUE_linux_eventfd AUE_NULL=0A= Index: sys/i386/linux/linux_sysent.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/i386/linux/linux_sysent.c (revision 277871)=0A= +++ sys/i386/linux/linux_sysent.c (working copy)=0A= @@ -338,7 +338,7 @@=0A= { 0, (sy_call_t *)linux_move_pages, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 317 =3D linux_move_pages */=0A= { 0, (sy_call_t *)linux_getcpu, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC = }, /* 318 =3D linux_getcpu */=0A= { 0, (sy_call_t *)linux_epoll_pwait, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 319 =3D linux_epoll_pwait */=0A= - { 0, (sy_call_t *)linux_utimensat, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 320 =3D linux_utimensat */=0A= + { AS(linux_utimensat_args), (sy_call_t *)linux_utimensat, = AUE_FUTIMESAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 320 =3D = linux_utimensat */=0A= { 0, (sy_call_t *)linux_signalfd, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 321 =3D linux_signalfd */=0A= { 0, (sy_call_t *)linux_timerfd_create, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 322 =3D linux_timerfd_create */=0A= { 0, (sy_call_t *)linux_eventfd, AUE_NULL, NULL, 0, 0, 0, = SY_THR_STATIC }, /* 323 =3D linux_eventfd */=0A= Index: sys/i386/linux/linux_systrace_args.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/i386/linux/linux_systrace_args.c (revision 277871)=0A= +++ sys/i386/linux/linux_systrace_args.c (working copy)=0A= @@ -2206,7 +2206,12 @@=0A= }=0A= /* linux_utimensat */=0A= case 320: {=0A= - *n_args =3D 0;=0A= + struct linux_utimensat_args *p =3D params;=0A= + iarg[0] =3D p->dfd; /* l_int */=0A= + uarg[1] =3D (intptr_t) p->pathname; /* const char * */=0A= + uarg[2] =3D (intptr_t) p->times; /* const struct l_timespec * */=0A= + iarg[3] =3D p->flags; /* l_int */=0A= + *n_args =3D 4;=0A= break;=0A= }=0A= /* linux_signalfd */=0A= @@ -5626,6 +5631,22 @@=0A= break;=0A= /* linux_utimensat */=0A= case 320:=0A= + switch(ndx) {=0A= + case 0:=0A= + p =3D "l_int";=0A= + break;=0A= + case 1:=0A= + p =3D "const char *";=0A= + break;=0A= + case 2:=0A= + p =3D "const struct l_timespec *";=0A= + break;=0A= + case 3:=0A= + p =3D "l_int";=0A= + break;=0A= + default:=0A= + break;=0A= + };=0A= break;=0A= /* linux_signalfd */=0A= case 321:=0A= @@ -6962,6 +6983,9 @@=0A= case 319:=0A= /* linux_utimensat */=0A= case 320:=0A= + if (ndx =3D=3D 0 || ndx =3D=3D 1)=0A= + p =3D "int";=0A= + break;=0A= /* linux_signalfd */=0A= case 321:=0A= /* linux_timerfd_create */=0A= Index: sys/i386/linux/syscalls.master=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= --- sys/i386/linux/syscalls.master (revision 277871)=0A= +++ sys/i386/linux/syscalls.master (working copy)=0A= @@ -532,7 +532,8 @@=0A= 318 AUE_NULL STD { int linux_getcpu(void); }=0A= 319 AUE_NULL STD { int linux_epoll_pwait(void); }=0A= ; linux 2.6.22:=0A= -320 AUE_NULL STD { int linux_utimensat(void); }=0A= +320 AUE_FUTIMESAT STD { int linux_utimensat(l_int dfd, const char = *pathname, \=0A= + const struct l_timespec *times, l_int flags); }=0A= 321 AUE_NULL STD { int linux_signalfd(void); }=0A= 322 AUE_NULL STD { int linux_timerfd_create(void); }=0A= 323 AUE_NULL STD { int linux_eventfd(void); }=0A= ------=_NextPart_000_0050_01D03D01.F2161720--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?004f01d03d34$3caed970$b60c8c50$>