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>
