Skip site navigation (1)Skip section navigation (2)
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$>