diff options
author | Björn Jacke <bj@sernet.de> | 2009-11-04 11:15:31 +0100 |
---|---|---|
committer | Björn Jacke <bj@sernet.de> | 2009-11-04 15:54:51 +0100 |
commit | 51cb96271b4f9a4bd37b44bdb6042913b60ba3c1 (patch) | |
tree | 9562c23809d9b6733b1bd1f893b728261a1142d6 /source3 | |
parent | b8ecf39d9f6f75a31f3eeee9ceca2e20001bbf42 (diff) | |
download | samba-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.
Diffstat (limited to 'source3')
-rw-r--r-- | source3/configure.in | 1 | ||||
-rw-r--r-- | source3/modules/vfs_default.c | 19 |
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); |