Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Dec 2006 05:33:40 -0600
From:      "Scot Hetzel" <swhetzel@gmail.com>
To:        emulation@freebsd.org
Subject:   linuxolator: utimes implementation
Message-ID:  <790a9fff0612140333ofd0891el59f767329f291371@mail.gmail.com>

index | next in thread | raw e-mail

[-- Attachment #1 --]
While I was running the the tests for ltp-full-20061121, I noticed
that the utimes function wasn't implemented in the linuxolator.

I looked up the man page and found that it was similar to the utime
function, except that it allows a program to set an inode down to the
microsecond.

Merging together the linux_utime and freebsd32_utimes functions, I was
able to create the linux_utimes function.

But when I compile the linux module in /sys/module/linux, I get this error:

/usr/src/7x/sys-patched/modules/linux/../../compat/linux/linux_misc.c:
In function `linux_utimes':
/usr/src/7x/sys-patched/modules/linux/../../compat/linux/linux_misc.c:792:
error: storage size of 'ltv' isn't known
/usr/src/7x/sys-patched/modules/linux/../../compat/linux/linux_misc.c:792:
warning: unused variable `ltv'
*** Error code 1

At line 792 ltv is defined as:

       struct l_timeval ltv[2];

Attached is the patch for linux_utimes.  Any ideals as to how to fix
this problem?

Scot

-- 
DISCLAIMER:
No electrons were mamed while sending this message. Only slightly bruised.

[-- Attachment #2 --]
Index: amd64/linux32/linux32_dummy.c
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/linux32_dummy.c,v
retrieving revision 1.6
diff -u -r1.6 linux32_dummy.c
--- amd64/linux32/linux32_dummy.c	28 Oct 2006 10:59:59 -0000	1.6
+++ amd64/linux32/linux32_dummy.c	13 Dec 2006 18:34:59 -0000
@@ -77,7 +75,6 @@
 DUMMY(timer_getoverrun);
 DUMMY(timer_delete);
 DUMMY(fstatfs64);
-DUMMY(utimes);
 DUMMY(fadvise64_64);
 DUMMY(mbind);
 DUMMY(get_mempolicy);
Index: amd64/linux32/linux32_proto.h
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/linux32_proto.h,v
retrieving revision 1.26
diff -u -r1.26 linux32_proto.h
--- amd64/linux32/linux32_proto.h	11 Nov 2006 21:49:07 -0000	1.26
+++ amd64/linux32/linux32_proto.h	14 Dec 2006 08:52:20 -0000
@@ -798,7 +834,8 @@
 	char sig_l_[PADL_(int)]; int sig; char sig_r_[PADR_(int)];
 };
 struct linux_utimes_args {
-	register_t dummy;
+	char fname_l_[PADL_(char *)]; char * fname; char fname_r_[PADR_(char *)];
+	char tptr_l_[PADL_(struct l_timeval *)]; struct l_timeval * tptr; char tptr_r_[PADR_(struct l_timeval *)];
 };
 struct linux_fadvise64_64_args {
 	register_t dummy;
@@ -1350,7 +1401,7 @@
 #define	LINUX_SYS_AUE_linux_statfs64	AUE_NULL
 #define	LINUX_SYS_AUE_linux_fstatfs64	AUE_NULL
 #define	LINUX_SYS_AUE_linux_tgkill	AUE_NULL
-#define	LINUX_SYS_AUE_linux_utimes	AUE_NULL
+#define	LINUX_SYS_AUE_linux_utimes	AUE_UTIMES
 #define	LINUX_SYS_AUE_linux_fadvise64_64	AUE_NULL
 #define	LINUX_SYS_AUE_linux_mbind	AUE_NULL
 #define	LINUX_SYS_AUE_linux_get_mempolicy	AUE_NULL
Index: amd64/linux32/linux32_sysent.c
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/linux32_sysent.c,v
retrieving revision 1.26
diff -u -r1.26 linux32_sysent.c
--- amd64/linux32/linux32_sysent.c	11 Nov 2006 21:49:07 -0000	1.26
+++ amd64/linux32/linux32_sysent.c	14 Dec 2006 08:52:20 -0000
@@ -291,7 +291,7 @@
 	{ AS(linux_statfs64_args), (sy_call_t *)linux_statfs64, AUE_NULL, NULL, 0, 0 },	/* 268 = linux_statfs64 */
 	{ 0, (sy_call_t *)linux_fstatfs64, AUE_NULL, NULL, 0, 0 },	/* 269 = linux_fstatfs64 */
 	{ AS(linux_tgkill_args), (sy_call_t *)linux_tgkill, AUE_NULL, NULL, 0, 0 },	/* 270 = linux_tgkill */
-	{ 0, (sy_call_t *)linux_utimes, AUE_NULL, NULL, 0, 0 },	/* 271 = linux_utimes */
+	{ AS(linux_utimes_args), (sy_call_t *)linux_utimes, AUE_UTIMES, NULL, 0, 0 },	/* 271 = linux_utimes */
 	{ 0, (sy_call_t *)linux_fadvise64_64, AUE_NULL, NULL, 0, 0 },	/* 272 = linux_fadvise64_64 */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 },			/* 273 =  */
 	{ 0, (sy_call_t *)linux_mbind, AUE_NULL, NULL, 0, 0 },	/* 274 = linux_mbind */
Index: amd64/linux32/syscalls.master
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/syscalls.master,v
retrieving revision 1.23
diff -u -r1.23 syscalls.master
--- amd64/linux32/syscalls.master	29 Oct 2006 14:02:38 -0000	1.23
+++ amd64/linux32/syscalls.master	14 Dec 2006 08:02:05 -0000
@@ -434,7 +438,8 @@
 268	AUE_NULL	STD	{ int linux_statfs64(char *path, struct l_statfs64_buf *buf); }
 269	AUE_NULL	STD	{ int linux_fstatfs64(void); }
 270	AUE_NULL	STD	{ int linux_tgkill(int tgid, int pid, int sig); }
-271	AUE_NULL	STD	{ int linux_utimes(void); }
+271	AUE_UTIMES	STD	{ int linux_utimes(char *fname, \
+					struct l_timeval *tptr); }
 272	AUE_NULL	STD	{ int linux_fadvise64_64(void); }
 273	AUE_NULL	UNIMPL
 274	AUE_NULL	STD	{ int linux_mbind(void); }
Index: compat/linux/linux_misc.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/linux/linux_misc.c,v
retrieving revision 1.199
diff -u -r1.199 linux_misc.c
--- compat/linux/linux_misc.c	4 Dec 2006 22:46:09 -0000	1.199
+++ compat/linux/linux_misc.c	14 Dec 2006 09:09:05 -0000
@@ -785,6 +785,39 @@
 	LFREEPATH(fname);
 	return (error);
 }
+
+int
+linux_utimes(struct thread *td, struct linux_utimes_args *args)
+{
+	struct l_timeval ltv[2];
+	struct timeval tv[2], *tvp;
+	char *fname;
+	int error;
+
+	LCONVPATHEXIST(td, args->fname, &fname);
+
+#ifdef DEBUG
+	if (ldebug(utimes)
+		printf(ARGS(utimes, "%s, *"), fname);
+#endif
+
+	if (args->tptr != NULL) {
+		if ((error = copyin(args->tptr, ltv, sizeof ltv))) {
+			LFREEPATH(fname);
+			return error;
+		}
+		tv[0].tv_sec = ltv[0].tv_sec;
+		tv[0].tv_usec = ltv[0].tv_usec;
+		tv[1].tv_sec = ltv[1].tv_sec;
+		tv[1].tv_usec = ltv[1].tv_usec;
+		tvp = tv;
+	} else
+		tvp = NULL;
+
+	error = kern_utimes(td, fname, UIO_SYSSPACE, tvp, UIO_SYSSPACE);
+	LFREEPATH(fname);
+	return (error);
+}
 #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
 
 #define __WCLONE 0x80000000
Index: i386/linux/linux_dummy.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/linux_dummy.c,v
retrieving revision 1.44
diff -u -r1.44 linux_dummy.c
--- i386/linux/linux_dummy.c	28 Oct 2006 10:59:59 -0000	1.44
+++ i386/linux/linux_dummy.c	14 Dec 2006 09:00:27 -0000
@@ -73,7 +71,6 @@
 DUMMY(epoll_wait);
 DUMMY(remap_file_pages);
 DUMMY(fstatfs64);
-DUMMY(utimes);
 DUMMY(fadvise64_64);
 DUMMY(mbind);
 DUMMY(get_mempolicy);
Index: i386/linux/linux_proto.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/linux_proto.h,v
retrieving revision 1.87
diff -u -r1.87 linux_proto.h
--- i386/linux/linux_proto.h	11 Nov 2006 16:26:56 -0000	1.87
+++ i386/linux/linux_proto.h	14 Dec 2006 08:59:21 -0000
@@ -800,7 +834,8 @@
 	char sig_l_[PADL_(int)]; int sig; char sig_r_[PADR_(int)];
 };
 struct linux_utimes_args {
-	register_t dummy;
+	char fname_l_[PADL_(char *)]; char * fname; char fname_r_[PADR_(char *)];
+	char tptr_l_[PADL_(struct l_timeval *)]; struct l_timeval * tptr; char tptr_r_[PADR_(struct l_timeval *)];
 };
 struct linux_fadvise64_64_args {
 	register_t dummy;
Index: i386/linux/linux_sysent.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/linux_sysent.c,v
retrieving revision 1.87
diff -u -r1.87 linux_sysent.c
--- i386/linux/linux_sysent.c	29 Oct 2006 14:12:44 -0000	1.87
+++ i386/linux/linux_sysent.c	14 Dec 2006 08:59:21 -0000
@@ -290,7 +290,7 @@
 	{ AS(linux_statfs64_args), (sy_call_t *)linux_statfs64, AUE_STATFS, NULL, 0, 0 },	/* 268 = linux_statfs64 */
 	{ 0, (sy_call_t *)linux_fstatfs64, AUE_FSTATFS, NULL, 0, 0 },	/* 269 = linux_fstatfs64 */
 	{ AS(linux_tgkill_args), (sy_call_t *)linux_tgkill, AUE_NULL, NULL, 0, 0 },	/* 270 = linux_tgkill */
-	{ 0, (sy_call_t *)linux_utimes, AUE_UTIMES, NULL, 0, 0 },	/* 271 = linux_utimes */
+	{ AS(linux_utimes_args), (sy_call_t *)linux_utimes, AUE_UTIMES, NULL, 0, 0 },	/* 271 = linux_utimes */
 	{ 0, (sy_call_t *)linux_fadvise64_64, AUE_NULL, NULL, 0, 0 },	/* 272 = linux_fadvise64_64 */
 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 },			/* 273 =  */
 	{ 0, (sy_call_t *)linux_mbind, AUE_NULL, NULL, 0, 0 },	/* 274 = linux_mbind */
Index: i386/linux/syscalls.master
===================================================================
RCS file: /home/ncvs/src/sys/i386/linux/syscalls.master,v
retrieving revision 1.83
diff -u -r1.83 syscalls.master
--- i386/linux/syscalls.master	29 Oct 2006 14:02:39 -0000	1.83
+++ i386/linux/syscalls.master	14 Dec 2006 08:00:49 -0000
@@ -439,7 +443,8 @@
 268	AUE_STATFS	STD	{ int linux_statfs64(char *path, struct l_statfs64_buf *buf); }
 269	AUE_FSTATFS	STD	{ int linux_fstatfs64(void); }
 270	AUE_NULL	STD	{ int linux_tgkill(int tgid, int pid, int sig); }
-271	AUE_UTIMES	STD	{ int linux_utimes(void); }
+271	AUE_UTIMES	STD	{ int linux_utimes(char *fname, \
+					struct l_timeval *tptr); }
 272	AUE_NULL	STD	{ int linux_fadvise64_64(void); }
 273	AUE_NULL	UNIMPL
 274	AUE_NULL	STD	{ int linux_mbind(void); }
help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?790a9fff0612140333ofd0891el59f767329f291371>