summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Jacke <bj@sernet.de>2009-11-04 11:15:31 +0100
committerBjörn Jacke <bj@sernet.de>2009-11-04 15:54:51 +0100
commit51cb96271b4f9a4bd37b44bdb6042913b60ba3c1 (patch)
tree9562c23809d9b6733b1bd1f893b728261a1142d6
parentb8ecf39d9f6f75a31f3eeee9ceca2e20001bbf42 (diff)
downloadsamba-51cb96271b4f9a4bd37b44bdb6042913b60ba3c1.tar.gz
samba-51cb96271b4f9a4bd37b44bdb6042913b60ba3c1.tar.bz2
samba-51cb96271b4f9a4bd37b44bdb6042913b60ba3c1.zip
s3: add support for full windows timestamps resolution on files
setting nanosecond timestamps using utimensat() was first supported by Linux kernel 2.6.22 and glibc 2.6. It's specified in POSIX.1-2008. This effectively makes us use Windows' full 100ns timestamp resolution - actually just an improvement from 10^-6 to 10^-7. For now Linux CIFS vfs will also just be able to make use of 100ns resolution, not 1ns.
-rw-r--r--source3/configure.in1
-rw-r--r--source3/modules/vfs_default.c19
2 files changed, 14 insertions, 6 deletions
diff --git a/source3/configure.in b/source3/configure.in
index 83ea8579e6..715f1598ef 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -1066,6 +1066,7 @@ AC_CHECK_FUNCS(setenv strcasecmp fcvt fcvtl)
AC_CHECK_FUNCS(syslog vsyslog timegm)
AC_CHECK_FUNCS(setlocale nl_langinfo)
AC_CHECK_FUNCS(nanosleep,,[AC_CHECK_LIB_EXT(rt, LIBS, nanosleep)])
+AC_CHECK_FUNCS(utimensat)
AC_CHECK_FUNCS(mlock munlock mlockall munlockall)
AC_CHECK_FUNCS(memalign posix_memalign hstrerror)
AC_CHECK_HEADERS(sys/mman.h)
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 036a438002..b40e2ce27a 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -134,7 +134,9 @@ static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle,
* we might be able to set sub-second timestamps.
* See what filetime set primitives we have.
*/
-#if defined(HAVE_UTIMES)
+#if defined(HAVE_UTIMENSAT)
+ *p_ts_res = TIMESTAMP_SET_NT_OR_BETTER;
+#elif defined(HAVE_UTIMES)
/* utimes allows msec timestamps to be set. */
*p_ts_res = TIMESTAMP_SET_MSEC;
#elif defined(HAVE_UTIME)
@@ -142,10 +144,6 @@ static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle,
*p_ts_res = TIMESTAMP_SET_SECONDS;
#endif
- /* TODO. Add a configure test for the Linux
- * nsec timestamp set system call, and use it
- * if available....
- */
DEBUG(10,("vfswrap_fs_capabilities: timestamp "
"resolution of %s "
"available on share %s, directory %s\n",
@@ -870,7 +868,16 @@ static int vfswrap_ntimes(vfs_handle_struct *handle,
return 0;
}
-#if defined(HAVE_UTIMES)
+#if defined(HAVE_UTIMENSAT)
+ if (ft != NULL) {
+ struct timespec ts[2];
+ ts[0] = ft->atime;
+ ts[1] = ft->mtime;
+ result = utimensat(AT_FDCWD, smb_fname->base_name, ts, 0);
+ } else {
+ result = utimensat(AT_FDCWD, smb_fname->base_name, NULL, 0);
+ }
+#elif defined(HAVE_UTIMES)
if (ft != NULL) {
struct timeval tv[2];
tv[0] = convert_timespec_to_timeval(ft->atime);